重点突出的CSS下拉菜单

重点突出的CSS下拉菜单

问题描述:

我有一个简单的自定义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>

表单元素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

它需要是一个覆盖菜单(因此位置:绝对)你有任何其他的选择? –