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,并且有鼠标悬停在上面

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • sql注入及用PrepareStatement就不用担心sql注入了吗?

    sql注入及用PrepareStatement就不用担心sql注入了吗?首先讲一下sql注入所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露

  • 用FastJson将JSON字符串转Json[通俗易懂]

    用FastJson将JSON字符串转Json[通俗易懂]一、导入jar<!–fastjson–><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.15</version></dependency>二、Fas

  • 电脑pin码忘了登录不进系统_做好这些优化,电脑5秒开机不是梦[通俗易懂]

    电脑pin码忘了登录不进系统_做好这些优化,电脑5秒开机不是梦[通俗易懂]为保证及时获取最新消息建议置顶公众号编辑:王富国审核:瓦彦文昨天公众号没有发文章,一是因为没有动力,毕竟写了文章没有回报,看不到任何的反馈,还有什么意思?二是因为我帮我一个朋友处理了一下她的电脑,也耗费了不少时间,也从中又得到了一些对电脑优化的经验,现在也给大家分享一下。本文较长,请耐心看完!昨天我这位朋友的电脑是全新的,对,刚买的,她自己看的,也是让我比较后,她自己选择购买的,配置大…

  • javaweb-spring-51

    javaweb-spring-51

  • malloc函数,大大的详解

    malloc函数,大大的详解1,关于malloc以及相关的几个函数     #include(Linux下)      void*malloc(size_tsize);      voidfree(void*ptr);      void*calloc(size_tnmemb,size_tsize);      void*realloc(void*ptr,size_t

  • mac视频录制工具推荐[通俗易懂]

    mac视频录制工具推荐[通俗易懂]AVAideScreenRecorderforMac是一款mac视频录制工具,可帮助用户可以选择录制整个屏幕或自定义区域,支持声音的同步录制,以1080p等高清质量以高达60fps的速度录制屏幕活动、视频和游戏。它可以让您以无损质量处理所有屏幕录制任务,包括Zoom会议、视频通话、文件、在线课程等。除了屏幕捕获之外,我们的屏幕录像机还可以作为一个令人难以置信的音频和声音和录音机,将您的录音提升到一个新的水平。任何希望为音乐制作、音频笔记或其他任何东西创建专业品质音频的人都可

发表回复

您的电子邮箱地址不会被公开。

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