html、css 实现二级菜单「建议收藏」

html、css 实现二级菜单「建议收藏」利用html、css实现二级菜单,一级菜单用浮动,二级菜单用定位

大家好,又见面了,我是你们的朋友全栈君。

本文中,一级菜单我设计了五个元素(然后给第四个元素设计了二级菜单)

在这里插入图片描述

html:

<nav>
    <ul class="topnav clearfix">
        <li><a href="">Lorem.</a></li>
        <li><a href="">Ratione.</a></li>
        <li><a href="">Atque!</a></li>
        <li>
            <a href="">Corrupti?</a>
            <div class="submenu">
                <ul>
                    <li>Lorem.</li>
                    <li>Possimus?</li>
                    <li>Iure.</li>
                    <li>Totam!</li>
                    <li>Consectetur.</li>
                </ul>
            </div>
        </li>
        <li><a href="">Voluptatum.</a></li>
    </ul>
</nav>

对于css代码,我来逐个讲解

一:解决高度坍塌(清除浮动)

因为一级菜单我是用ul li来做的,虽然ul是块级元素(display: block;),但是lidisplay: list-item;,多个是一行一行显示的

所以我使用了浮动,来让多个li元素排在一行

但是,li使用了浮动之后,会导致一个问题,高度坍塌: li的父元素ul是常规流元素块盒,它的height默认值为auto,此时,它的高度不会计算不考虑浮动元素;由于ul里面只有li元素,所以会导致一个悲剧,ul元素的height为0

高度坍塌解决办法:

(在html中,我给ul元素一个类选择器.clearfix

css:

.clearfix::after{ 
   
    content: "";
    display: block;
    clear: both;
}

在这里插入图片描述

二:实现一级菜单

在这里插入图片描述

css:

nav { 
   
    background: #008c8c;
    color: #fff;
    height: 40px;
    line-height: 40px;
}

nav .topnav>li{ 
   
    float: left;
    padding: 0 20px;
    height: 40px;
    width: 20%;
    box-sizing: border-box;
    text-align: center;
    position: relative;
}

文字垂直居中(line-height与height取相同的值):

height: 40px;
line-height: 40px;

文字水平居中:

text-align: center;

在这里插入图片描述
ul下的5个li元素,作为一级菜单,我将他们的宽度以百分比设置width: 20%,宽度百分比的值是相对于其包含块(其父元素ul)的width,而ul我没有设置宽度,它采用默认值width: auto,而且因为ul元素是常规流元素,此时,它的width会把水平剩余空间吸收掉。(可以这么认为:ul的宽度就是视口的宽度(视口:浏览器的可视窗口))

然后我又用到了css3的一个属性:

box-sizing: border-box;

每一个html元素,都可以看作一个盒子:

在这里插入图片描述
以我给的这个图为例,1536 × 40 ,1536为width,40为height (默认情况下,height、width决定的区域:内容盒,content-box)

但是

box-sizing

  • css3中的新属性,改变宽高(height、width)的影响范围
  • box-sizing: border-box;宽高影响范围为边框盒
    比如说:(width = 内容宽 + padding-left + padding-right + border-left + border-right),当width设置好之后,内容宽的值会随border和padding的取值而随之变化
  • 注意啊:box-sizing的取值只有content-box和border-box;前两者加paddding-box是background-clip的取值
  • 内容盒 content-box = 内容区(默认情况下,height、width决定的区域)
  • 填充盒 padding-box = 内容区 + 填充区
  • 边框盒 border-box = 内容区 + 填充区 + 边框

所以效果上来看就是:一级菜单中的5个元素,在水平方向上各占20%

我给一级菜单的li元素还设置了一个属性:相对定位

它是用来把一级菜单的li元素的内容盒给二级菜单作为包含块的:

  • 包含块:决定了盒子的排列规则
  • 将二级菜单的元素设置为绝对定位position: absolute;
  • 绝对定位元素的包含块:找祖先元素中第一个定位元素,改元素的填充盒;若找不到,则它的包含块为整个网页(初始化包含块)
    这样,二级菜单就会相对于其对应的一级菜单的内容盒进行定位了

在这里插入图片描述

三:实现二级菜单

以免篇幅拖沓,本文只给一级菜单的第四个li元素设计了二级菜单
在这里插入图片描述

  • 一般,页面上只显示一级菜单,需要点击一级菜单,才会出现相应的二级菜单
  • 需要用到伪类:hover
    鼠标悬停在元素上时的样式

(在html中,我给一级菜单的第四个li元素设置了一个选择器.submenu
css:

nav .topnav>li:hover{ 
   
    color: #f40;
    font-weight: bold;
}

nav .topnav>li .submenu{ 
   
    position: absolute;
    right: 0;
    width: 100%;
    background-color: #008c8c;
    color: #fff;
    text-align: left;
    line-height: 1.5;
    /* 不生成盒子(即隐藏) */
    display: none;
}

nav .topnav>li:hover .submenu{ 
   
    display: block;
    padding: 10px;
}

补充一嘴:在css中书写选择器时,比如:

nav .topnav>li:hover

选中nav元素下的.topnav元素的子元素li,并且有鼠标悬停在上面

  • 空格,选后代元素
  • >,选子元素

自此,本文结束,虽然比较简陋,但是二级菜单的基本结构是搭建起来了(一级菜单用浮动,二级菜单用定位)
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138595.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql慢日志查询_mysql开启慢查询日志

    mysql慢日志查询_mysql开启慢查询日志通过命令查看慢查询最长时间,一般默认10sSHOWVARIABLESLIKE’long_query_time我们可以修改该时间,比如我在这里设置为1s,方便测试。SETlong_query_time=1通过命令SHOWVARIABLESLIKE’%query%’;可以看到,log_slow_queries默认是OFF,我们必须要打开它,SETGLOBALslow_query_l

    2022年10月14日
    0
  • glPushMatrix 与 glPopMatrix[通俗易懂]

    glPushMatrix 与 glPopMatrix[通俗易懂]1.原理讲解 终于明白为什么使用glPushMatrix()和glPopMatrix()的原因了。将本次需要执行的缩放、平移等操作放在glPushMatrix和glPopMatrix之间。glPushMatrix()和glPopMatrix()的配对使用可以消除上一次的变换对本次变换的影响。使本次变换是以世界坐标系的原点为参考点进行。下面对上述结论做进一步的解释:1)OpenGL中

    2022年10月28日
    0
  • jdk1.7 hashmap扩容_Java并发实现原理:JDK源码剖析

    jdk1.7 hashmap扩容_Java并发实现原理:JDK源码剖析HashMap简介:HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据因为在查询上使用散列码(通过键生成一个数字作为数组下标,这个数字就是hashcode)所以在查询上的访问速度比较快,HashMap最多允许一对键值对的Key为Null,允许多对键值对的value为Null。它是非线程安全的。在排序上面是无序的。HashMap的主要成员变量…

    2022年9月21日
    0
  • OpenCV——Canny边缘检测(cv2.Canny())

    OpenCV——Canny边缘检测(cv2.Canny())Canny边缘检测Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。1986年,JohnF.Canny发表了著名的论文AComputationalApproachtoEdgeDetection,在该论文中详述了如何进行边缘检测。Canny()边缘检测步骤Canny边缘检测分为如下几个步骤:步骤1:去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。步骤2:计算梯度的幅度与方向。步骤3:非极大值抑制,即适当地让边缘“变瘦”。步骤4:确定边缘。使

    2022年5月25日
    39
  • 扩大传播面,让网络安全宣传更有力

    扩大传播面,让网络安全宣传更有力

    2022年3月4日
    43
  • TTL与RS-485电平转换芯片MAX485/MAX3485「建议收藏」

    TTL与RS-485电平转换芯片MAX485/MAX3485「建议收藏」常用的转换芯片是MAX485(5V),MAX3485(3.3V),它们都是半双工的。     A端和B端分别为接收和发送的差分信号端,当A引脚的电平高于B时,代表发送的数据为1;当A的电平低于B端时,代表发送的数据为0。下图是485抗干扰的原理:

    2022年8月10日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号