2017-08-31 102 views
1

我有一個簡單的自定義CSS下拉菜單,如this。點擊下拉菜單按鈕將切換下面的容器顯示(絕對定位)。我試圖模仿HTML選擇元素的行爲,其中focusout也隱藏菜單。最好的辦法是什麼?如果我將聚焦事件處理程序添加到下拉內容div,單擊該按鈕本身將導致一個雙重觸發器(聚焦和切換)。重點突出的CSS下拉菜單

$('.dropdown-btn').on('click', function (e) { 
 
\t $('.dropdown-content').toggleClass('hide'); 
 
}); 
 

 
$('.dropdown-btn').focusout(function (e) { 
 
    $('.dropdown-content').addClass('hide'); 
 
}); 
 

 
$('a').on('click', function (e) { 
 
    // wont run 
 
    console.log(this); 
 
});
.dropdown-container { 
 
    position: relative; 
 
} 
 
.dropdown-btn { 
 
    width: 70px; 
 
    background: cyan; 
 
    padding: 12px; 
 
} 
 
.dropdown-content { 
 
    position: absolute; 
 
} 
 

 
.dropdown-content a { 
 
    margin-bottom: 1px; 
 
    background: cyan; 
 
    display: block; 
 
} 
 

 
.hide { 
 
    display: none; 
 
}
<script 
 
src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> 
 
</script> 
 

 
<div class="dropdown-container"> 
 
    <div class="dropdown-btn" tabindex="-1">Dropdown</div> 
 
    <div class="dropdown-content hide"> 
 
    <a>Dropdown item 1</a> 
 
    <a>Dropdown item 2</a> 
 
    </div> 
 
</div>

回答

1

表單元素focusout聽者工作只。如果你需要它的工作divs你可以分配一個tabindex屬性的div。

也從dropdown-content刪除absolute並且添加display: inline-blockdropdown-contentdropdown-container。要在焦點事件刪除outline這樣做:

.dropdown-container:focus { 
    outline: none; 
} 

請參見下面的演示和jsfiddle

$('.dropdown-btn').on('click', function(e) { 
 
    $('.dropdown-content').toggleClass('hide'); 
 
}); 
 

 
$('.dropdown-container').focusout(function(e) { 
 
    $('.dropdown-content').addClass('hide'); 
 
});
.dropdown-container { 
 
    position: relative; 
 
    display: inline-block; 
 
} 
 
.dropdown-container:focus { 
 
    outline: none; 
 
} 
 

 
.dropdown-btn { 
 
    width: 70px; 
 
    background: cyan; 
 
    padding: 12px; 
 
} 
 

 
.dropdown-content { 
 
    display: inline-block; 
 
    /*position: absolute;*/ 
 
} 
 

 
.dropdown-content a { 
 
    margin-bottom: 1px; 
 
    background: cyan; 
 
    display: block; 
 
} 
 

 
.hide { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="dropdown-container" tabindex="-1"> 
 
    <div class="dropdown-btn">Dropdown</div> 
 
    <div class="dropdown-content hide"> 
 
    <a>Dropdown item 1</a> 
 
    <a>Dropdown item 2</a> 
 
    </div> 
 
</div>

+0

對不起,我忘了補充tabindex屬性在我的jsfiddle。如果你點擊任何下拉元素,你的解決方案將隱藏下拉菜單(假設我有一個鏈接或任何事件的點擊處理程序,它們將不起作用),我已經用你的叉子解決了問題的jsfiddle。我希望我的問題現在更清楚 –

+0

@JorgeLazo看到更新的答案... – kukkuz

+0

它需要是一個覆蓋菜單(因此位置:絕對)你有任何其他的選擇? –