本文实现了一个经典的下拉菜单的制作。
首先,写出Html部分:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <ul class="top-nav"> <li><a href="#">慕课网</a></li> <li><a href="#">课程大厅</a></li> <li><a href="#">学习中心</a> <ul> <li><a href="#">前端课程</a> <ul> <li><a href="#">html</a></li> <li><a href="#">javascript</a></li> <li><a href="#">css</a></li> </ul> </li> <li><a href="#">手机开发</a></li> <li><a href="#">后台编程</a></li> </ul> </li> <li><a href="#">关于我们</a></li> </ul> </body>
该代码实现的效果图如下:
可以看到,这是一个三级菜单。
现在,我们开始给一级菜单外部加入样式:
.top-nav { width: 960px;/**宽度*/ margin: 60px auto; border: 1px solid #222;/**边框*/ background-color: #111; background-image: linear-gradient(#444, #111);/**背景图*/ border-radius: 6px;/**圆角*/ box-shadow: 0 1px 1px #777;/**阴影:水平 垂直 模糊距离 模糊颜色*/ padding: 0;/**内边距*/ list-style: none;/**去掉小圆点*/
}
可以得到如下效果:
处理一级菜单,从左至右显示,清除下划线以及小圆点:
.top-nav li { float: left;/**从左向右显示*/ border-right: 1px solid #222;/**间隔线*/ box-shadow: 1px 0 0 #444; position: relative;/**相对定位*/ } .top-nav li a { float: left; padding: 12px 30px; color: #999; text-decoration: none;/**去掉下划线*/ text-shadow: 0 1px 0 #000;/**文本阴影*/ } .top-nav li a:hover { color: #fafafa; /**鼠标移入颜色*/ } .top-nav li ul { visibility: hidden;/**二级菜单隐藏显示*/ position: absolute;/**绝对定位*/ list-style: none; top: 38px; left: 0; z-index: 1; padding: 0; background-color: #444; background-image: linear-gradient(#444, #111); box-shadow: 0 -1 0 rgba(255, 255, 255, 3); border-radius: 3px; opacity: 0;/**刚开始设为透明*/ margin: 20px 0 0 0; transition: all .2s ease-in-out;/**二级菜单动画效果*/ } .top-nav li:hover > ul { opacity: 1; visibility: visible; margin: 0; }
得到下图效果:
可以发现一级菜单的背景被遮盖了,这是由于没有清除浮动引起的。在样式中加入如下代码,清除浮动:
/**清除浮动*/ .top-nav:before, .top-nav:after { content: " "; display: table; } .top-nav:after { clear: both; }
背景出现:
下来定义子菜单的超链接和二级菜单的圆角样式:
/**二级菜单*/ .top-nav ul li { float: none; display: block; border: 0; box-shadow: 0 1px 0 #111, 0 2px 0 #666;/**间隔线效果*/ } .top-nav ul a { padding: 10px; width: 130px; display: block; float: none; } .top-nav ul a:hover { background-color: #0186ba; background-image: linear-gradient(#04accc, #0186ba); } .top-nav ul li:first-child > a { border-radius: 3px 3px 0 0; } .top-nav ul li:last-child > a { border-radius: 0 0 3px 3px; }
接下来添加三级菜单样式:
/**三级菜单*/ .top-nav ul li ul { float: none; left: 125px; top: 0; display: block; }
如此,我们的效果图就做好了:
是不是很酷?接下来为下拉菜单实现尖角。尖角位于二级菜单上面,是一个向上的箭头:
.top-nav ul li:first-child > a:before { content: " "; position: absolute; left: 40px;/**显示位置*/ top: -6px; border-left: 6px solid transparent; /**左右透明,只留下方*/ border-right: 6px solid transparent; border-bottom: 6px solid #444; } .top-nav ul li:first-child > a:hover:before { border-bottom-color: #04acec; }
尖角的实现原理:border上下左右四个方向,控制是否显示,则可以出现三角的效果。
同样,三级菜单尖角与二级类似,不过变成了向右的箭头:
.top-nav ul ul li:first-child > a:before { content: " "; position: absolute; left: -6px; top: 50%; border-left: 0; border-right: 6px solid #3b3b3b; border-bottom: 6px solid transparent; border-top: 6px solid transparent; } .top-nav ul ul li:first-child > a:hover:before { border-right-color: #0299d3; border-bottom-color: transparent;/**取消二级菜单的颜色*/ }
在这里要注意去掉从二级菜单继承的颜色。
于是,一个下拉菜单就做好了: