JS+CSS特效:HTML+JS+CSS 实现精致的带二级菜单的头部菜单

本篇,我们来演示一个二级菜单是怎么做出来的。

案例效果图

因为本次内容主要目标是实现顶部的导航菜单,所以我们不关心其他内容。

第一步:清除浏览器默认样式 & 添加基本样式

*{ margin: 0px; padding: 0px; box-sizing: border-box; }
ul { list-style: none; }
/* General Definitions  定义全局样式 */
body {background: #f3f3f3;font-family: "微软雅黑",Helvetica,weiruanyahei,Tahoma,Arial,Sans-serif;font-size: 14px;color: #333;box-sizing: border-box;transition: all .3s;
}
a{color: #414141;text-decoration: none;	
}
a:hover {color: #139ce4;
}

第二步:容器布局

通常情况下,我们可以用div来写,也可以ul来写,我个人习惯用ul。

一级菜单

<header><nav><ul class="nav-ul"> <li><a href="###">Home</a></li><li><a href="###">HTML&CSS</a></li> <li><a href="###">Js&JQuery</a></li> <li><a href="###">WordPress</a></li> <li><a href="###">Others</a></li></ul></nav>
</header>
布局样式表

header标签:头部的背景

header {position: fixed; /* 固定顶部导航 */ background: rgba(255,255,255,0.9);width: 100%;height: 96px;box-shadow: 0 2px 15px 0px rgba(0,0,0,0.1);  /* 盒子阴影 */z-index: 10;-webkit-backdrop-filter: blur(8px);backdrop-filter: blur(8px);
}

nav标签:定位导航菜单

nav {padding-top: 26px;width: 90%;float: right;margin-right: 20px;
}

ul li 标签:菜单样式

.nav-ul{ float: right; }

写到这里,我们实现了对菜单的定位,但这个时候的列表还是竖着的排列的。

接下来,我们写样式,要让它横过来。

.nav-ul>li {position: relative;float: left;margin-right: 10px;
}

美化一级菜单样式

接下来,我要把它变成它该有的样子

.nav-ul>li>a {float: left;margin-right: 0px;padding: 10px 30px;width: auto;   height: auto;  -moz-border-radius: 35px;-webkit-border-radius: 35px;border-radius: 35px;-khtml-border-radius: 35px;color: #777;font-weight: bold;font-size: 1.3rem;line-height: 30px;text-shadow: 2px 2px 0 #fff;overflow: hidden;
}
.nav-ul>li>a:hover {   
background: #efefef; 
color: #999;   
transition: all .7s;
text-shadow: 1px 2px 2x #fff;
box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.029) inset,5px 5px 6px rgba(0, 0, 0, 0.027) inset,10px 9px 12px rgba(0, 0, 0, 0.07) inset;
}

好了,一级导航菜单这样就算写完了。我们看看效果。

二级菜单

接下来,准备写二级菜单。先修改一下菜单结构。二级菜单,因为是通过一级菜单触发的,但又不是鼠标点击一级菜单,因为点击一级菜单,就要跳转走了。所以,我把二级菜单写在了 一级菜单的 li标签中间,与a标签并列。为了省事,我就不给每个菜单都添加二级菜单了。

菜单布局
<header><nav><ul class="nav-ul"> <li><a href="###">Home</a></li><li><a href="###">HTML&CSS</a><ul class="sub-menu"> <li><a href="###">布局与定位</a></li> <li><a href="###">CSS字体</a></li> <li><a href="###">导航&amp;按钮&amp;链接</a></li> <li><a href="###">表单&amp;控件</a></li> <li><a href="###">列表&amp;表格</a></li> <li><a href="###">背景&amp;边框</a></li> <li><a href="###">图片</a></li> <li><a href="###">图文排版</a></li> <li><a href="###">CSS3动画 </a></li> <li><a href="###">其他纯CSS </a></li> </ul> </li> <li><a href="###">Js&JQuery</a></li> <li><a href="###">WordPress</a></li> <li><a href="###">Others</a></li></ul></nav></header>

接下来我们看一下现在的菜单是什么样子的:

显然,我们需要给它进行样式美化,然后还要把这个菜单隐藏起来。只有当鼠标移动到一级菜单上时,才能显示二级菜单。

现在,就让我们分析一下这个二级菜单有那些特点。为了看得仔细,我们在浏览器界面按住ctrl键然后向上滚动鼠标中间的滚轮,让浏览器视窗比例变大。然后截图,细节就清晰可见了。

目标样式
  1. 蓝色的圆角边框;
  2. 它有个比白色稍稍深一点点的背景色和圆角内框;
  3. 一行两列的菜单项布局;
  4. 菜单框的最外面的上边框中间位置,还有个蓝色的小三角,指向它的上级菜单,
  5. 菜单项的顶部有1像素的白边,下面有像素的灰色边,另外就是两列菜单项中间有一条灰色的线,右侧菜单项的左边有一条白色的边框线,这形成了一种立体的感觉。
  6. 当鼠标移动到菜单项上时:它的背景色变成了浅蓝色,菜单链接颜色变成了蓝色,且有1个像素的白色阴影,产生了按钮文字凹陷的效果。

接下来,让我们一行行去实现这些样式。

首先是蓝色外边框和内部的浅白色圆形内框。

.sub-menu{position: absolute;top:50px;border-radius: 10px;background: #fcfcfc;border:5px solid #139ce4;width: auto;height:auto;}

先做个边框看看哈:

接下来,布局菜单项:

.sub-menu li a {display: block;position: relative;float: left;background: #fcfcfc;line-height: 2.5rem;width: 50%;color: #999;font-size: 0.9rem;text-shadow: 1px 1px 0 #fff;transition: all .3s;border-top:1px solid #fff;border-bottom: 1px solid #f1f1f1;   border-left:1px solid #fff;border-right:1px solid #f1f1f1;box-sizing: border-box;
}

看看效果:

(⊙o⊙)… 跟我想的不一样呢。 没有解决的问题:

1. 文字没有撑开宽度。

2.文字没有居中

3.貌似内框的圆角消失了。

我们一个个来解决:

  1. 试试文字禁止换行的效果。
  2. 文字居中,这个要使用 text-align:center属性
  3. 把a标签的背景色去掉试试。
.sub-menu li a {display: block;position: relative;float: left;  line-height: 2.5rem;width: 50%;color: #999;font-size: 0.9rem;text-shadow: 1px 1px 0 #fff;transition: all .3s;border-top:1px solid #fff;border-bottom: 1px solid #f1f1f1;   border-left:1px solid #fff;border-right:1px solid #f1f1f1;box-sizing: border-box;white-space: nowrap; /* 禁止文字换行 */text-align: center;
}

刷新一下浏览器:

(⊙o⊙)… 虽然文字没有换行,可这宽度依然很。。。

看来要换个思路解决问题。我在二级菜单里写了一个宽度50%,当然是为了实现一行两列。那么如果我给菜单设定宽度呢?试试。

width: 120px;

这???一行两列果断消失了。

好吧,那我去把父元素 sub-menu的宽度设置成它的两倍。。

.sub-menu{position: absolute;top:50px;border-radius: 10px;background: #fcfcfc;border:5px solid #139ce4;overflow: visible;width: 240px;height: auto;}
.sub-menu li a {display: block;position: relative;float: left;  line-height: 2.5rem;width: 120px;color: #999;font-size: 0.9rem;text-shadow: 1px 1px 0 #fff;transition: all .3s;border-top:1px solid #fff;border-bottom: 1px solid #f1f1f1;   border-left:1px solid #fff;border-right:1px solid #f1f1f1;box-sizing: border-box;white-space: nowrap; /* 禁止文字换行 */text-align: center;
}

然而:

等下,我想到一个可能的办法:

因为要解决这个菜单的定位,所以,前面我把这个菜单的定位写成了 绝对定位。所以,当它的宽度设为100%时,它等于父元素的宽度。那么我们发现,它的菜单项的宽度有时候文字会很多,所以,我可以设定它的菜单项宽度等于父元素的宽度。为了容纳一行两列的布局,我可以把它的宽度设置成200%;

然后,子菜单的宽度设为50%。

Q:为什么是50%?父元素的宽度是200%,子菜单项的宽度不应该是100%吗?

A:请仔细思考一下,子菜单的父元素的宽度是多少?50%是哪个宽度的50%?

试一下:

.

.sub-menu{width:200%;}
.sub-menu li a{width:50%;
}

刷新看看:

OYE~ 宽度有了,但是位置貌似还不太对,要让它基于父元素水平居中对齐。还得给它增加一个属性。

.sub-menu{ width:200%; left:-50%; }

刷新再看看:

这下居中的没问题了。剩下就是小三角和内圆角。。

小三角利用before的来写一个border的就行,这个容易。

先来写这个小三角

.sub-menu::before {display: block;content: "";height: 0;width: 0;position: absolute;border: 12px solid;border-color: transparent transparent #139ce4 transparent;
}

刷新一下,看看定位在哪里:

高度不太对,大概需要向上移动24-36像素左右。

.sub-menu::before {left: 50%;transform: translateX(-50%);top: -30px;
}

水平的话,写个居中。。。高度就得微调了,试试看看效果:

额,高了一点。把之前的top:-30px,改一下:

top: -28px;

剩下的就是内框的圆角了。

既然a标签把它填满导致了原来的内圆角没有了,而去掉了a标签的背景色依然没有出现圆角。那么我不妨把第一行的两个菜单项和最后一行的两个菜单项写个圆角。这里利用子选择器实现。为了避免菜单项数量改变而导致样式的变化,需要把样式写在最后两个子列表项上,而不是第7和第8上面。所以,在最后两个列表项上,我们使用的 nth-last-child 而不是 nth-child。


.sub-menu li:nth-child(1) a{border-radius: 5px 0 0 0;overflow: hidden;
}
.sub-menu li:nth-child(2) a{border-radius: 0 5px 0 0;overflow: hidden;
}/* 
.sub-menu li:nth-child(7) a{border-radius: 0 0 5px 0;overflow: hidden;
}
.sub-menu li:nth-child(8) a{border-radius: 0 0 0 5px;overflow: hidden;
}
*/.sub-menu li:nth-last-child(1) a{border-radius: 0 0 5px 0;overflow: hidden;
}
.sub-menu li:nth-last-child(2) a{border-radius: 0 0 0 5px;overflow: hidden;
}

顺便,把右侧菜单项的右边框去掉:

.sub-menu li:nth-child(2n) a{border-right:0px;
}

刷新页面,放大一倍,截图看看

基本样式就是这样了,接下来我们把鼠标hover效果写一下:

.sub-menu li a:hover {color: #139ce4;	background: #e7f6fd;
}

嗯,先看就完美了。接下来,就剩下最后一步了。把它的常态设置为不可见,当鼠标到一级菜单时,再将它改为可见。

大功告成

我们截图看效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246162.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

万界星空科技电线电缆行业MES系统核心功能

在日新月异的科技浪潮中&#xff0c;电线电缆行业作为国民经济的重要支柱&#xff0c;正面临着前所未有的挑战与机遇。如何在激烈的市场竞争中脱颖而出&#xff0c;实现生产效率与产品质量的双重飞跃&#xff0c;成为了每一家线缆企业亟需解决的课题。万界星空科技&#xff0c;…

电池放电倍率

电池放电倍率是指电池在单位时间内放电的速率与其额定容量之比 &#xff0c;放电倍率越大&#xff0c;表示电池能够在较短的时间内释放更多的电能。一般来说&#xff0c;电池的放电倍率会影响其使用时的性能和寿命。 电池的放电倍率主要取决于其设计和制造工艺。一般来说&#…

Github 2024-07-17 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目3Python项目3Rust项目2TypeScript项目2MDX项目1项目化学习 创建周期:2538 天协议类型:MIT LicenseStar数量:161973 个Fork数量…

气象数据文件名解析:使用正则表达式提取时间信息

气象数据文件名解析&#xff1a;使用正则表达式提取时间信息 前言 在处理大量气象数据文件时&#xff0c;文件名往往携带了关键的元数据信息&#xff0c;如日期、时间、地点、测量设备等。其中&#xff0c;时间信息尤为重要&#xff0c;因为它帮助我们理解数据的时效性和用于…

2024 50+行业大模型应用解决方案全解

第一章&#xff1a;以“生成”能力赋能产业智慧化 从当前大模型的行业应用发展中可以看到&#xff0c;现阶段的大模型更适合于企业的“生成”任务&#xff0c;而非“决策”任务。 “生成”任务主要指文本生成、对话系统、语言翻译等&#xff0c;大模型可以通过分析大量文本数…

算法项目报告:物流中的最短路径问题

问题描述 物流问题 有一个物流公司需要从起点A到终点B进行货物运输&#xff0c;在运输过程中&#xff0c;该公司需要途径多个不同的城市&#xff0c;并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间&#xff0c;该公司需要确定经过哪些配送站点&#xff…

<数据集>猫狗识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3686张 标注数量(xml文件个数)&#xff1a;3686 标注数量(txt文件个数)&#xff1a;3686 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cat, dog] 序号类别名称图片数框数1cat118811892dog24982498 使用标…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中&#xff0c;语言是连接我们的桥梁。印尼语翻译通&#xff0c;一款专为打破语言障碍而生的智能翻译软件&#xff0c;让您与印尼语的世界轻松接轨。无论是商务出差、学术研究&#xff0c;还是探索印尼丰富的文化遗产&#xff0c;印尼语翻译通都是您的…

win10安装Docker Desktop启动失败闪退解决方案和Docker Desktop历史版本下载

我的系统是Windows 10 专业版&#xff0c;最近想安装docker desktop&#xff0c;安装最新版本后启动不了&#xff0c;一直报WSL update failed&#xff0c;过一会还闪退&#xff0c;百度各种方法还是没办法解决。 解决方法&#xff1a; 最后安装旧版本才正常启动&#xff08;…

怎么注册一个小程序

目录 开始申请账号选择注册的账号类型填写邮箱和密码激活邮箱填写主体信息选择主体类型 安装开发工具你的第一个小程序编译预览相关链接 开始 开发小程序的第一步&#xff0c;你需要拥有一个小程序账号&#xff0c;通过这个账号你就可以管理你的小程序。 跟随这个教程&#x…

MySQL 数据库 - SQL

SQL通用语法 SQL通用语法 SQL语句可以单行或者多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。 注意&#xff1a;空格和缩进的个数是没有限制的&#xff0c;可以是 “一个” 也可以是 “多个”。MySQL数据库的SQL语句不区分大小写&#xff0c;…

【转型Web3开发第二课】Dapp开发入门基础 | 02 | MetaMask配置网络

本文首发于公众号&#xff1a;Keegan小钢 前言 完成了《转型 Web3 开发第一课》之后&#xff0c;得到了不少读者的认可&#xff0c;很多都在问什么时候开始下一课&#xff0c;近期终于抽出了时间开始搞起这第二课。 这第二课的主题为「Dapp开发入门基础」&#xff0c;即想要转…

【Linux】Ubuntu部署K8S集群-图文并茂(超详细)

Ubuntu部署K8S集群 1. 模版机系统环境准备1.1 安装Ubuntu1.2 设置静态IP地址 2. 主机准备2.1 使用模板机创建主机2.2 主机配置2.2.1 修改静态IP2.2.2 修改主机名2.2.3 主机名-IP地址解析2.2.4 时间同步2.2.5 内核转发、网桥过滤配置2.2.6 安装ipset和ipvsadm2.2.7 关闭SWAP分区…

Android调用FFmpeg解码MP3文件并使用AudioTrack播放操作详解

文章目录 总体流程Android读取MP3文件调用FFmpeg进行MP3文件解码AudioTrack播放PCM原理工作原理1. 缓冲区和流模式2. 缓冲区管理3. 音频渲染流程4. 缓冲区大小和延迟5. 线程和同步 使用示例 使用JNI调用AudioTrack播放PCM1.通过JNI创建AudioTrack对象2.调用AudioTrack的write方…

QT实现滑动页面组件,多页面动态切换

这篇文章主要介绍了Qt实现界面滑动切换效果&#xff0c;对大家的学习或工作具有一定的参考借鉴价值&#xff0c;需要的朋友可以参考下。 一、简述 一个基于Qt的动态滑动页面组件。 二、 设计思路 1、自定义StackWidget类&#xff0c;继承自QWidget&#xff0c;实现一个堆叠…

乐尚代驾项目概述

前言 2024年7月17日&#xff0c;最近终于在低效率的情况下把java及其生态的知识点背的差不多了&#xff0c;投了两个礼拜的简历&#xff0c;就一个面试&#xff0c;总结了几点原因。 市场环境不好 要知道&#xff0c;前两年找工作&#xff0c;都不需要投简历&#xff0c;把简历…

《绝区零》公测“翻车”

“《绝区零》重塑米哈游荣光”到“《绝区零》翻车米哈游没招了”,这样极与极的舆论反转,只用了不到一天的时间。 7月,米哈游自研游戏《绝区零》上线公测。虽然品类略显小众,主打动作手游,但系出名门的优势还是让《绝区零》在公测前预下载阶段大放异彩——直接登上了百余国…

Ubuntu/Kali简洁高效安装最新版的docker-compose

基于docker已安装的情况下&#xff0c;通过执行一下代码完成docker-compose的安装 sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep \"tag_name\": | sed …

区块链资料

Quantstamp - Public Security Assessments smart-contract-sanctuary-bsc/contracts/mainnet at master tintinweb/smart-contract-sanctuary-bsc GitHub https://github.com/slowmist/Cryptocurrency-Security-Audit-Guide/blob/main/README_CN.md sFuzz: 高效自适应的智…

有赞群团团开团大团长跑路,用户资金保护并没有保障到位!

近日群团团的开团大团长“肥肥购物”已经跑路了&#xff0c;留下了一堆烂账。有的团长5月21号买的购物卡到现在还没有进行成功交付&#xff0c;据帮卖团长反馈该笔订单一直没有确认收货且处于未完结的状态&#xff0c;但是这笔订单货款钱却迟迟无法进行成功退款。 下方是帮卖团…