最近看到很多同學在實現滑鼠hover彈出選單的效果時都是用的js程式碼去實現的,預設給彈出隱藏掉,通過js事件繫結動態的顯/隱彈出選單元素。
<ul>
<li>主頁</li>
<li>新聞</li>
<li id="more">更多</li>
<div class="menu" id="menu">
<ul>
<li>退出登入</li>
<li>更改密碼</li>
</ul>
</div>
</ul>
複製程式碼
<style>
.menu{
display: none;
}
</style>
<script>
window.onload=function(){
var menu=document.getElementById('menu');
var more=document.getElementById('more');
more.addEventListener('mouseenter',function(){
menu.style.display="block";
});
more.addEventListener('mouseleave',function(){
menu.style.display="none";
});
}
</script>
複製程式碼
這種寫法是比較流行的寫法,但這種寫法需要用到js,多多少少有一點不優雅。現在筆者向大家介紹一種使用css偽類結合子代選擇器的方式來實現同樣效果的辦法。
1.首先需要改變一下dom結構,彈出選單div和按鈕之間改成父子結構
<ul>
<li>主頁</li>
<li>新聞</li>
<li id="more" class="more">
<span>更多</span>
<div class="menu" id="menu">
<ul>
<li>退出登入</li>
<li>更改密碼</li>
</ul>
</div>
</li>
</ul>
複製程式碼
2.將之前的script程式碼統統刪掉,改用css偽類和子代選擇帶
.menu {
display: none;
}
.more:hover>.menu{
display: block;
}
複製程式碼
就這樣就完成啦,程式碼比之前精簡了不少,少了很多js變數,還不用擔心dom事件繫結與解綁的問題。
如果想要有更好的使用者體驗,還可以加上css3的過渡動畫。但需要注意的是元素預設display:none的話是不會有動畫效果的,需要把display:none;改成visibility:hidden;
而且最好讓.menu脫離文件流,比方說給它的position設定成fixed或者absolute,使用transform而不是left、top,這樣動畫會有更好的效能。