用纯css实现下拉菜单的几种方式

第一种:display:none和display:block切换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        ul{
            list-style: none;
        }
        .nav>li{
            float: left;
        }
        ul a{
            display: block;
            text-decoration: none;
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            color: white;
            background-color: #2f3e45;
        }
        .nav>li:first-child a{
            border-radius: 10px 0 0 10px;
        }
        .nav>li:last-child a{
            border-radius: 0 10px 10px 0;
        }
        .drop-down{
            /*position: relative;*/
        }
        .drop-down-content{
            padding: 0;
            display: none;
            /*position: absolute;*/
        }

        h3{
            font-size: 30px;
            clear: both;
        }
        .drop-down-content li:hover a{
            background-color:red;
        }
        .nav .drop-down:hover .drop-down-content{
            display: block;
        }
</style>
</head>
<body>
    <ul class="nav">
        <li><a href="#">下拉菜单</a></li>
        <li class="drop-down"><a href="#">下拉菜单</a>
            <ul class="drop-down-content">
                <li><a href="#">我是1</a></li>
                <li><a href="#">我是2</a></li>
                <li><a href="#">我是3</a></li>
            </ul>
            </li>
        <li><a href="#">下拉菜单</a></li>
        <li><a href="#">下拉菜单</a></li>
        <li><a href="#">下拉菜单</a></li>
    </ul>
    <h3>我是测试文字</h3>
</body>
</html>

这里写图片描述

这是首先考虑到的实现方法,给 .drop-down-content 添加display:none,当悬浮在.drop-down上时 .drop-down-content的display变成block,缺点是不能添加过渡属性,慢慢弹出下来菜单。当.drop-down-content显示时会把后面的盒子往下挤,因为.drop-down-content 显示时是存在于文档流中的,给.drop-down设置position:relative,.drop-down-content设置position:absolute,使下拉菜单脱离了文档流来解决,上面注释的地方改过来即可
这里写图片描述

第二种方法:给悬浮的这个li设置一个固定高度,然后设置超出部分隐藏,悬浮时显示。

<style>
        ul{
            list-style: none;
        }
        .nav>li{
            float: left;
        }
        ul a{
            display: block;
            text-decoration: none;
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            color: white;
            background-color: #2f3e45;
        }
        .nav>li:first-child a{
            border-radius: 10px 0 0 10px;
        }
        .nav>li:last-child a{
            border-radius: 0 10px 10px 0;
        }
        .drop-down{
            /*position: relative;*/
            height: 50px;
            overflow: hidden;
        }
        .drop-down-content{
            padding: 0;
            /*position: absolute;*/
        }

        h3{
            font-size: 30px;
            clear: both;
/*            position: relative;
            z-index: -1;*/
        }
        .drop-down-content li:hover a{
            background-color:red;
        }
        .nav .drop-down:hover{
            overflow: visible;
        }
</style>

这里写图片描述

有个问题:h3段落里面的文字会从下拉菜单中透过来,并且鼠标放在字上面的时候下拉菜单会缩回。
解决方式有两种:

1.给.drop-down设置position:relative,.drop-down-content设置position:absolute。
2.给h3设置position:relative;z-index:-1。

第三种方法:给下拉菜单设置固定的高度,下拉菜单的内容设置透明opacity: 0;,悬浮在下拉菜单时opacity: 1;来实现

<style>
        ul{
            list-style: none;
        }
        .nav>li{
            float: left;
        }
        ul a{
            display: block;
            text-decoration: none;
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            color: white;
            background-color: #2f3e45;
        }
        .nav>li:first-child a{
            border-radius: 10px 0 0 10px;
        }
        .nav>li:last-child a{
            border-radius: 0 10px 10px 0;
        }
        .drop-down{
            /*position: relative;*/
            height: 50px;
        }
        .drop-down-content{
            padding: 0;
            opacity: 0;
            /*position: absolute;*/
        }

        h3{
            font-size: 30px;
            clear: both;
/*            position: relative;
            z-index: -1;*/
        }
        .drop-down-content li:hover a{
            background-color:red;
        }
        .nav .drop-down:hover .drop-down-content{
            opacity: 1;
        }
</style>

效果同上。
上面的几种方法都是不能添加过渡效果的,鼠标滑过时下拉菜单就马上弹出来了,用户体验不是很好,下面这种方法可以添加过渡的效果来实现一定时间内来弹出

方法四:将下拉菜单的ul高度设置为0,并且超出部分隐藏掉。

<style>
        ul{
            list-style: none;
        }
        .nav>li{
            float: left;
        }
        ul a{
            display: block;
            text-decoration: none;
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            color: white;
            background-color: #2f3e45;
        }
        .nav>li:first-child a{
            border-radius: 10px 0 0 10px;
        }
        .nav>li:last-child a{
            border-radius: 0 10px 10px 0;
        }
        .drop-down{
            /*position: relative;*/
            height: 50px;
        }
        .drop-down-content{
            padding: 0;
            opacity: 0.3;
            height: 0;
            overflow: hidden;
            transition: all 1s ease;
            /*position: absolute;*/
        }

        h3{
            font-size: 30px;
            clear: both;
/*            position: relative;
            z-index: -1;*/
        }
        .drop-down-content li:hover a{
            background-color:red;
        }
        .nav .drop-down:hover .drop-down-content{
            opacity: 1;
            height: 150px;
        }

这里写图片描述

也会出现上面同样的问题,两种解决方式,把上面代码中注释的地方改过来即可。

做这个demo时我碰到误区,以为把下拉菜单ul值设置为0,下拉菜单整体会隐藏掉,实际上是ul的高度变为了0,但是里面的内容并没有变化,觉得跟做导航时浮动li,ul的高度变成了0,li还能显示一样。一定要给ul设置overflow:hidden,整个下拉菜单才会隐藏。顺带提一句:我们做导航条的时候一般都是左浮动li标签,ul的高度就变成了0,然后给ul设置overflow:hidden,ul就会有高度了,包裹了li标签,后面的盒子会正常布局。

方法五:设置包裹下拉菜单的li元素position:relation;下拉菜单绝对定位,left:-999px;使下拉菜单跑到左边浏览器外面看不到的地方,悬浮时,left:0;使其出现在浏览器中显示。

<style>
        ul{
            list-style: none;
        }
        .nav>li{
            float: left;
        }
        ul a{
            display: block;
            text-decoration: none;
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            color: white;
            background-color: #2f3e45;
        }
        .nav>li:first-child a{
            border-radius: 10px 0 0 10px;
        }
        .nav>li:last-child a{
            border-radius: 0 10px 10px 0;
        }
        .drop-down{
            position: relative;
        }
        .drop-down-content{
            padding: 0;
            position: absolute;
            left: -999px;
        }
        h3{
            font-size: 30px;
            clear: both;
        }
        .drop-down-content li:hover a{
            background-color:red;
        }
        .nav .drop-down:hover .drop-down-content{
            left: 0;
        }
</style>

这里写图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下拉菜单是一个常见的前端组件,通常用于展示选项列表或者子菜单。下面是一些设计思路: 1. 使用 HTML 和 CSS 实现原生下拉菜单,这种方式可以在不加载任何 JavaScript 的情况下实现下拉菜单,并且浏览器兼容性较好。缺点是样式和交互能力受限。 2. 使用 JavaScript 和 CSS 实现定制化的下拉菜单,这种方式可以实现更多的交互效果,如下拉菜单的动画效果、搜索和筛选功能等。缺点是需要编写一定量的 JavaScript 代码,可能会增加页面加载时间。 3. 使用现成的 UI 框架或组件库,如 Bootstrap、Ant Design、Element UI 等,这种方式可以快速构建出美观、功能丰富的下拉菜单,并且具备良好的浏览器兼容性。缺点是可能存在一定的学习成本,而且需要依赖第三方库。 4. 使用 SVG 或 Canvas 技术自定义下拉菜单,这种方式可以实现更为复杂的交互效果和动画效果,但需要较高的技术水平和时间成本。 无论使用哪种方式,都需要考虑下拉菜单的可访问性、响应式设计以及用户体验等方面的问题。 ### 回答2: 下拉菜单是网页前端设计中常用的交互组件之一,它能够给用户提供一种方便快捷地选择操作的方式下拉菜单的前端设计思路主要包括以下几个方面: 1. 显示方式下拉菜单可以在点击或悬停触发时自动展开,也可以通过按钮点击展开。根据具体需求,可以选择合适的显示方式。 2. 样式设计:下拉菜单的样式设计需要与整体页面风格保持一致。可以通过背景色、边框样式、字体颜色等来使下拉菜单看起来与页面其他元素一致。 3. 动画效果:为了增强用户体验,可以在下拉展开和收起时添加过渡动画效果,使菜单的切换更加流畅自然。 4. 响应式设计:随着移动设备的普及,下拉菜单的前端设计还需要考虑到响应式布局,使其在不同设备上都能正常显示和使用。 5. 用户交互:下拉菜单的前端设计还需要考虑用户的操作习惯,如支持键盘导航、点击菜单项后的反馈等。同时,对于大型菜单内容,可以考虑增加搜索功能,方便用户快速定位。 6. 逻辑处理:为了确保下拉菜单的正确显示和操作,前端还需要实现相关的逻辑处理,如菜单的展开和收起、选中项的状态更新等。 综上所述,下拉菜单的前端设计需要考虑显示方式、样式设计、动画效果、响应式布局、用户交互和逻辑处理等各个方面,以提供流畅、友好的用户体验。 ### 回答3: 下拉菜单是网页设计中常见的交互元素,用于展示和选择多个选项。在前端设计下拉菜单时,需要考虑以下几个方面的设计思路: 1. 显示方式下拉菜单可以有不同的显示方式,如点击触发展开、鼠标悬停触发展开等。根据页面布局和用户体验需求,选择合适的显示方式。 2. 样式设计:下拉菜单的样式应与整个页面风格一致,保持统一的视觉效果。可以使用CSS设置菜单的背景色、边框样式、字体大小和颜色等。 3. 交互设计:下拉菜单需要具有良好的交互性,用户可以通过鼠标或触摸操作选择菜单项。可以使用JavaScript来实现菜单的展开和收起功能,并添加事件监听器来响应用户的选择动作。 4. 响应式设计:下拉菜单在不同设备上要有良好的适应性,包括手机、平板和电脑等。可以使用媒体查询来设置不同屏幕尺寸下的菜单样式和布局。 5. 数据处理:下拉菜单可能需要加载大量选项数据,需要考虑数据的加载和展示方式。可以通过异步加载数据,提高页面的加载速度和用户体验。 6. 无障碍设计:下拉菜单需要考虑无障碍性,保证屏幕阅读器用户和键盘操作用户能够正常使用菜单。可以添加适当的aria属性,提供语义化的标记。 总之,下拉菜单的前端设计需要注意样式、交互和响应式等方面,要保证菜单的美观性、易用性和适应性。同时要考虑用户体验和无障碍设计,提升网页的可访问性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值