纯CSS的导航下拉菜单

写在案例前:
本案例并非原创,百度一搜“css下拉菜单”一定能看见一模一样的案例,而且不止一个,所以就仿照这个案例又自己做了一遍,并且总结一下自己遇到的一些问题结合思考给出的解决办法,虽然不知道原作者是谁,但是还是要在这里感谢一下原作者,给了我不止一点思路。废话不多说,上图。
这里写图片描述

 <nav>
        <ul>
            <li><a href="#">导航一</a>
                <ul>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a></li>
                </ul>
            </li>
            <li><a href="#">导航二</a></li>
            <li><a href="#">导航三</a>
                <ul>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a>
                        <ul>
                            <li><a href="#">三级导航</a></li>
                            <li><a href="#">三级导航</a></li>
                            <li><a href="#">三级导航</a></li>
                        </ul>
                    </li>
                    <li><a href="#">二级导航</a></li>
                </ul>
            </li>
            <li><a href="#">导航四</a>
                <ul>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a></li>
                </ul>
            </li>
            <li><a href="#">导航五</a>
                <ul>
                    <li><a href="#">二级导航</a></li>
                    <li><a href="#">二级导航</a></li>
                </ul> 
            </li>
            <li><a href="#">导航六</a></li>
        </ul>
    </nav>   
nav {
    margin:100px auto;
    text-align:center;
}
nav ul {
    border-radius:10px;
    background:linear-gradient(to bottom,#efefef,#bbbbbb);
    padding:0 20px;
    display:inline-table;
    position:relative;  
    box-shadow:1px 1px 3px #666;
}
nav ul ul {
    display:none;
}
nav ul li {
    float:left; 
}
nav ul::after {
    content:"";
    display:block;
    clear:both;
}
nav ul li a {
    display:block;
    padding:25px 40px;
    color:#000;
    text-decoration:none;
    font-family:"微软雅黑";
}
nav ul li:hover > ul {
    display:block;
}
nav ul li:hover {
    background:linear-gradient(to bottom,#4f5964,#5f6975);
}
nav ul li:hover a {
    color:#FFF;
}
nav ul ul {
    background:#5f6975;
    border-radius:0;
    position:absolute;
    top:100%;
    padding:0;
}
nav ul ul li {
    float:none;
    border-top:1px solid #6b727c;
    border-bottom:1px solid #575f6a;
}
nav ul ul li a {
    color:#FFF;
}   
nav ul ul li a:hover {
    background:#4b545f;
}
nav ul ul ul {
    width:100%;
    position:absolute;
    left:100%;
    top:50%;
}

思路:

  1. 做一个下拉菜单,脑海里第一个闪过的效果就是:鼠标触及-下拉菜单出现-鼠标移开-下拉菜单隐藏
  2. 既然是纯css实现。首先需要了解display属性的特性,使用none、block值来实现下拉菜单的出现和隐藏。
  3. 搭配html结构,利用<ul><li></li></ul>对菜单进行分级
  4. 熟悉伪类选择器,:hover不止在文本中使用
  5. 利用::after伪元素选择器来清除浮动
  6. 使用position定位来控制下拉菜单的位置
  7. 考虑美观

以上案例用到了一些css3的新特性,如:圆角、背景阴影、背景色渐变、伪元素

  • 圆角 border-radius
    当值为四个数值时,按顺序分别表示左上角、右上角、右下角、左下角。
    当值为两个数值时,前者表示左上角、右下角;后者表示右上角、左下角;两者是对立关系。
    当值为一个数值时,说明元素的四个角都使用这一数值。
    border-radius还可以用来制作半圆,以及四分之一圆

半圆

div {
    width:100px;
    height:50px; 
    border-radius:50px 50px 0 0;
    background-color:#F00;
}
  • 背景阴影 box-shadow
    语法:box-shadow:【水平阴影】 【垂直阴影】【阴影模糊距离】 【阴影模糊程度】【阴影颜色】【内部阴影】/【外部阴影】
    其中,水平阴影、垂直阴影是必须项,其他为可选项,阴影位置默认为外部阴影(outset)。

  • 背景颜色渐变
    线性渐变语法 background:linear-gradient(方向,起始颜色,终止颜色);
    方向也称角度,线性渐变的角度是以圆心为起点的发散型角度。例如:想要一个由上往下的红白渐变 background:linear-gradient(to bottom,red,white);
    关于颜色渐变这一特性其实需要讲述的有很多,会单开一篇博文来做详细讲解

  • 伪元素
    上一篇博文中提到的利用伪元素选择器来清除浮动,在这个案例中就运用到了,详情请翻上一篇


遇到的问题及解决办法

  • display:inline-table不设置宽度时,宽度由内容撑开
    在案例中,并没有给任何父元素或者子元素添加宽、高,而是使用padding值和内容本身将元素撑开。在未设置display:inline-table的情况下,元素的宽就是整个浏览器的宽度,是随着浏览器的大小来改变的。设置后,元素的宽=padding-left+内容+padding-right

  • 给元素设置定位时,需要给一个宽度
    当第三级菜单出现时,文字是以单个竖排的方式来显示(中、英文文本的排列不同),如下图:
    中文文本表现方式

    这里写图片描述

    在上图的三级导航中,中、英文排序方式完全不同,position属性的定义中有一点很重要,如果不给添加定位后的元素宽度,那么此元素会以一个字符的宽度来显示,从中文文本中可以看出,它就是这么显示的,一个中文字代表一个字符;而英文文本中,一个单词代表一个字符,注意是一个单词,不是一个字母。
    所以给此元素添加一个宽度就可以使文本横向显示出来。

  • 21
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以通过CSS实现下拉菜单,以下是一个简单的示例: HTML代码: ``` <nav> <ul> <li><a href="#">菜单1</a></li> <li><a href="#">菜单2</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> </ul> </li> <li><a href="#">菜单3</a></li> </ul> </nav> ``` CSS代码: ``` nav ul { margin: 0; padding: 0; list-style: none; background-color: #333; } nav li { display: inline-block; position: relative; margin-right: 20px; } nav a { display: block; color: #fff; text-decoration: none; padding: 10px; } nav ul ul { display: none; position: absolute; top: 100%; left: 0; background-color: #333; } nav ul li:hover > ul { display:inherit; } nav ul ul li { width: 200px; float: none; display: list-item; position: relative; } nav ul ul ul li { position: relative; top:-60px; left:200px; } nav a:hover, nav ul ul ul a { background-color:#202020; } nav ul ul li:hover > ul { display:inherit; } ``` 注释: - `nav ul`,设置主菜单样式,将列表样式去掉,设置背景色; - `nav li`,设置每个菜单项的样式,将其设为行内元素,并设置相对定位; - `nav a`,设置菜单链接的样式,设为块级元素,设置文字颜色、去掉下划线、设置内边距; - `nav ul ul`,设置子菜单的样式,将其设为绝对定位,距离父菜单项顶部距离为100%,距离父菜单项左侧距离为0,设置背景色; - `nav ul li:hover > ul`,当鼠标悬停在主菜单上时,显示其下面的子菜单; - `nav ul ul li`,设置子菜单的每个列表项的样式,将其设为块级元素,取消浮动,设置相对定位,方便设置子菜单的子菜单; - `nav ul ul ul li`,设置子菜单的子菜单列表项样式,设置相对定位,将其位置调整到右上方; - `nav a:hover, nav ul ul ul a`,当鼠标悬停在菜单链接上时,设置背景色; - `nav ul ul li:hover > ul`,当鼠标悬停在子菜单上时,显示其下面的子菜单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值