CSS二级菜单

 0.需求:当鼠标hover到按钮上时,出现下拉菜单导航条。

1.问题拆解:
(1)HTML应该如何组织比较方便合理
因为题中要求下拉菜单位于按钮的正下方,可以使用列表<li>中嵌套无序列表<ul>的方式,设置<ul>padding值为0。
(2)如何实现下拉菜单在鼠标没有hover到按钮上时不出现
使用定位隐藏,设置下拉菜单为绝对定位,设置一个负的很大的值。
(3)如何实现下拉菜单在鼠标hover时出现
设置鼠标hover时,<ul>列表的left值。
<body>

    <li class="btn"><a class="btn1" href="#">按钮</a>

        <ul>

            <li><a href="#">下拉菜单项</a></li>

            <li><a href="#">下拉菜单项</a></li>

            <li><a href="#">下拉菜单项</a></li>

            <li><a class="last" href="#">下拉菜单项</a></li>

        </ul>

    </li>

</body>

(1)首先重置默认的<li>,<a>标签样式

 

        li,

        li a {

            text-decoration: none;

            list-style-type: none;

            font-family: "宋体";

            font-size: 12px;

            color: #000;

        }

(2)设置按钮的边框等,此时我设置的是外层<li>标签中<a>标签的样式,此时将内层<a>标签设置成块级block,这样可以设置宽高,并且后面有用(后面再说)。

       .btn1 {

            display: block;

            border: 1px solid #ddd;

            width: 50px;

            height: 28px;

            text-align: center;

            line-height: 28px;

        }

(3)将下拉菜单隐藏设置成不可见

        ul {

            margin-top: 1px;

            position: absolute; /*设置绝对定位*/

            left: -999em;   /*设置隐藏*/

            padding: 0;  /*离它的父元素的边界为0,所以可以位于父元素<li>的正下方*/

        }

(4)为下拉菜单项添加样式

        ul li a {

            display: inline-block;  /*菜单项宽度未知,设置inline-block宽度为内容宽度*/

            border-top: 1px solid #ddd;

            border-left: 1px solid #ddd;  /*这方法很笨,千万别学我*/

            border-right: 1px solid #ddd;

            height: 30px;

            padding: 0 10px;

            line-height: 30px;

        }

(5)不能忘了最后一个

        .last {

            border-bottom: 1px solid #ddd;

        }

(6)设置鼠标hover时出现下拉菜单

        .btn:hover ul {

            left: auto; /*默认ul的padding为0,位于按钮正下方*/

        }

(7)设置hover时改变背景颜色

        ul li a:hover {

            background-color: #ddd;

        }

(8)此时会有一个小bug,鼠标hover到按钮整一行时都会出现下拉菜单,因为此时最外层的<li>标签是块级元素,块级元素没有设置宽度默认的宽度是父元素宽度,而它的父元素是body,第(6)步写的是hover整个外层<li>标签,所以会出现这种情况。
解决办法:   可以在父元素<li>设置inline-block,子元素设置block,当子元素内容超出时,父元素宽度根据内容变化,所以,可以将按钮hover区域控制按钮边框之内。

        .btn{

            display: inline-block; /*设置btn是inline-block,

            默认宽度为内容宽度,则鼠标只会在hover到按钮区域时才会展开下拉菜单*/

        }

以下是完整代码:

<!DOCTYPE html>

<html>

 

<head>

    <meta charset="utf-8">

    <title>纯css实现下拉菜单</title>

    <style>

        li,

        li a {

            text-decoration: none;

            list-style-type: none;

            font-family: "宋体";

            font-size: 12px;

            color: #000;

        }

        

        .btn1 {

            display: block;

            border: 1px solid #ddd;

            width: 50px;

            height: 28px;

            text-align: center;

            line-height: 28px;

        }

        

        ul {

            margin-top: 1px;

            position: absolute; /*设置绝对定位,宽度为内容宽度*/

            left: -999em;   /*设置隐藏*/

            padding: 0;  /*离它的父元素的边界为0,所以可以位于父元素li的正下方*/

        }

        

        ul li a {

            display: inline-block;  /*菜单项宽度未知,设置inline-block宽度为内容宽度*/

            border-top: 1px solid #ddd;

            border-left: 1px solid #ddd;

            border-right: 1px solid #ddd;

            height: 30px;

            padding: 0 10px;

            line-height: 30px;

        }

        

        .last {

            border-bottom: 1px solid #ddd;

        }

        

        .btn:hover ul {

            left: auto; /*默认ul的padding为0,位于按钮正下方*/

        }

        

        ul li a:hover {

            background-color: #ddd;

        }

        .btn{

            display: inline-block; /*设置btn是inline-block,

            默认宽度为内容宽度,则鼠标只会在hover到按钮区域时才会展开下拉菜单*/

        }

    </style>

</head>

 

<body>

    <li class="btn"><a class="btn1" href="#">按钮</a>

        <ul>

            <li><a href="#">下拉菜单项</a></li>

            <li><a href="#">下拉菜单项</a></li>

            <li><a href="#">下拉菜单项</a></li>

            <li><a class="last" href="#">下拉菜单项</a></li>

        </ul>

    </li>

</body>

</html>

 

 

posted @ 2019-06-12 10:37  爱笑的小宇宙  阅读(818)  评论(0编辑  收藏  举报