【前端开发】CSS中的:hover伪类选择器 你真的搞懂怎么去使用它吗?

🚀 个人主页 极客小俊
✍🏻 作者简介:web开发者、设计师、技术分享博主
🐋 希望大家多多支持一下, 我们一起学习和进步!😄
🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注

什么是伪类

伪类就是专门用来表示元素的一种特殊状态的类!

举个栗子

访问过的超链接、普通的连接、获取焦点的文本框,这些状态都可以用伪类来进行选择和表示

当我们需要为这些处在特殊状态元素设置样式的时候,那么CSS就为这些状态提供了专门的选择器,

这些选择器就是 伪类选择器!

伪类选择器有很多,而今天我要说的就是一个很经典也是很有用的一个伪类选择器 :hover

:hover的作用

:hover 它表示用户通过鼠标滑过鼠标悬停元素上的CSS样式

通常我们都是把这个效果应用在a标签上, 也可以使用在其他元素标签

举个栗子

<style type="text/css">.test{text-decoration: none;}.test:hover{color: red;text-decoration: underline;}.test2:hover{color: green;}
</style><a href="javascript:;" class="test">重庆市</a>
<span class="test2">北京市</span>

效果如下

这是最简单的效果,我们平常开发也是经常会使用到的一种方式!

:hover案例演示

但这都是在控制元素本身,而:hover还可以用来控制其他元素!

我们可以根据html的结构分析判断出:hover可以用来控制子元素以及后代元素

举个栗子

<style type="text/css">.test {width: 100px;height: 100px;background: red;}.test > .box1 {width: 70px;height: 70px;background: blue;margin: 0 auto;}.test:hover {cursor: pointer;}.test:hover > .box1 {background: yellow;cursor: pointer;}
</style><div class="test"><div class="box1"></div>
</div>

如图

所以很多人没有搞明白, :hover是可以控制其他元素

但是一定要注意的是从html结构上来讲, 子元素才能被控制, 只要是子元素,不管层级多少都可以被控制到!

例如

<style type="text/css">.test {width: 100px;height: 100px;background: red;}.test > .box1 {width: 70px;height: 70px;background: blue;margin: 0 auto;}.test > .box1 > .box2 {width: 30px;height: 30px;background: green;margin: 0 auto;}.test:hover {cursor: pointer;}/*.test:hover > .box1 {background: yellow;cursor: pointer;}*//*当移动到.test上悬停的时候, 选择其后代子元素的.box并修改样式表*/.test:hover > .box1 >.box2 {background: yellow;cursor: pointer;}
</style><div class="test"><div class="box1"><div class="box2"></div></div>
</div>

如图

所以这也证明了,如果不是父子关系 那么其实:hover的实用性并不大!

因为:hover也类似于js中的onmouseoveronmouseout事件, 但我们实际开发中经常会遇到悬停在某个元素上的时候,另外一个元素也显示,并且还能移入到该元素上,那么如果不是父子关系html结构下,使用:hover将无法实现!

所以这里我个人认为,不要在兄弟关系的情况下去使用:hover

利用父子关系html嵌套结构我们可以结合:hover伪类实现一个简单的htm+css三级菜单效果

代码如下

<style type="text/css">/*清除默认样式*/ul, li {padding: 0px;margin: 0px;list-style: none;}/*div样式*/#menu {border: 2px solid #ccc;border-right: none;float: left;margin: 100px 0 0 300px;}/*浮动li*/#menu ul li {position: relative;}/*设置a标签的样式*/#menu ul li a {width: 120px;height: 40px;text-align: center;line-height: 40px;display: block;border-right: 2px solid #ccc;background: #eee;color: #666;}/*当鼠标移动到 一级菜单的a标签上时*/#menu ul li a:hover {cursor: pointer;color: #f5576c;border-right: 2px solid transparent;}/*同时 当鼠标移动到 一级菜单的.first-list上时让sub1显示*/#menu ul > .first-list:hover .sub1 {display: block;}/*二级菜单*/#menu ul li .sub1 {position: absolute;left: 120px;top: -2px;border-top: 2px solid #ccc;background: #eee;display: none;/*z-index: 3;*/}/*设置二级菜单下的a标签样式*/#menu ul li .sub1 li a {border-top: 1px dotted #ccc;width: 120px;text-align: center;height: 39px;color: #666;}#menu ul li .sub1 li a:hover {color: #8fd3f4;border-right: 2px solid #ccc;}/*设置二级菜单下的最后一个li下的a标签样式*/#menu ul li .sub1 li:last-child {border-bottom: 2px solid #ccc;}#menu ul li .sub1 li {position: relative;}/*三级菜单*/#menu ul li .sub1 li .sub2 {/*z-index:5;*/position: absolute;top: -2px;left: 120px;display: none;border-top: 2px solid #ccc;}/* 显示三级菜单*/#menu .second-list:hover .sub2{display: block;}/*文字颜色*/#menu ul li .sub1 li .sub2 li a:hover {color: #fee140;}
</style><div id="menu"><ul id="menu_sub"><li class="first-list"><a herf=''>菜单1</a><ul class="sub1"><li class="second-list"><a herf=''>二级菜单1</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单2</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单3</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单4</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li></ul></li><li class="first-list"><a herf=''>菜单2</a><ul class="sub1"><li class="second-list"><a herf=''>二级菜单1</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单2</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单3</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单4</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li></ul></li><li class="first-list"><a herf=''>菜单3</a><ul class="sub1"><li class="second-list"><a herf=''>二级菜单1</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单2</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单3</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单4</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li></ul></li><li class="first-list"><a herf=''>菜单4</a><ul class="sub1"><li class="second-list"><a herf=''>二级菜单1</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单2</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单3</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li><li class="second-list"><a herf=''>二级菜单4</a><ul class="sub2"><li><a herf=''>三级菜单1</a></li><li><a herf=''>三级菜单2</a></li><li><a herf=''>三级菜单3</a></li><li><a herf=''>三级菜单4</a></li></ul></li></ul></li></ul>
</div>

效果如下

注意

虽然有些时候,我们可以使用:hover去选择兄弟关系的标签元素,但这种做法是有一定缺点的!

例如

<style type="text/css">.content {width: 300px;overflow: hidden;padding: 10px;border: 1px solid red;}.a, .b {width: 100px;height: 100px;background: pink;margin-top: 20px;line-height: 100px;text-align: center;float: left;margin-right: 10px;cursor: pointer;}.a:hover + .b {cursor: pointer;background: yellow;}
</style><div class="content"><div class="a">A</div><div class="b">B</div>
</div>

如图

你可以使用选择器选中后面的元素,因为是递进关系, 但你不能从后面的元素选择到前面,至少目前选择器还不支持这样子做,如果你不使用js或者jquery

所以只用css应该目前是不可以的,如果可以请你在评论区告诉我! 嘿嘿~~

布局小技巧

最后分享一个:hover布局的小技巧,我们有的时候经常在使用:hover的时候,会让元素抖动

相信很多朋友都遇到过这个问题!

举个栗子

<style type="text/css">.box:hover{border-radius: 10px;border: 1px solid #cccccc;width: 60px;text-align: center;cursor: pointer;}
</style><div class="box">重庆市</div>

如图

其实这个问题很简单,如果你学过盒子模型就应该知道元素的margin+border+padding+width结构

这里的情况很明显是因为border增加的元素大小,所以导致鼠标悬停上之后,加了border边框,让元素发生了抖动, 其实解决办法也有很多,这里我推荐一种就是:提前先加好一个透明边框

或者说是提前把一些要悬停显示的CSS样式先写好, 这样一来就不会发生抖动了!

代码如下

.box{width: 60px;border-radius: 10px;border: 1px solid transparent;  /*设置透明*/text-align: center;
}.box:hover{border-radius: 10px;border: 1px solid #cccccc;width: 60px;text-align: center;cursor: pointer;
}

效果

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某大厂关于Linux系统相关面试题

一、Linux系统和Shell 1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;(1) 删除所有空行&#xff1b;(2) 在非空行前面加一个"AAA"&#xff0c;在行尾加一个"BBB"&#xff0c;即将内容为11111的一行改为&#xff1…

【Linux】第三十八站:信号处理

文章目录 一、信号处理二、再谈进程地址空间三、内核如何实现信号的捕捉四、sigaction 一、信号处理 我们知道&#xff0c;信号保存以后&#xff0c;会在合适的时候进行处理这个信号。 那么信号是如何被处理的&#xff1f;什么时候进行处理呢&#xff1f; 当我们的进程从内核…

如何在Microsoft 365中直接启用 Loop服务

Microsoft Loop是一种变革性共同创建体验&#xff0c;可将工具和设备上的团队、内容和任务汇集在一起&#xff0c;使团队能够共同思考、规划和创建内容。 在之前分享过的文章中已经介绍了如何在Microsoft Teams、Outlook和Word中使用Loop服务&#xff0c;今天继续介绍如何在Mi…

微信小程序上传时报错message:Error: 系统错误,错误码:80051,source size 2148KB exceed max limit 2MB

问题&#xff1a; 微信小程序上传时错误码&#xff1a;80051,source size 2248KB exceed max limit 2MB 问题原因&#xff1a; 由于代码中的静态资源 图片大小超了200k以及主包的体积超出1.5M 解决办法 分包 tabBar 是主包的&#xff0c;不需要分包处理&#xff0c;以下是分…

http和https的区别是什么?https有什么优缺点?

HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。这个简单模型是早期Web成功的有功之臣&#xff0c;因为它…

在Java中,如何实现对象的拷贝?

开发中可以使用第三方库如Apache Commons Lang的SerializationUtils类或Google的Guava库来实现对象的深拷贝。这些库提供了更加灵活和方便的深拷贝实现方式&#xff0c;同时也提供了更多的自定义选项和错误处理机制。 在Java中&#xff0c;对象的拷贝可以分为浅拷贝&#xff0…

增加Vscode引用路径

增加Vscode引用路径 增加Vscode引用路径问题说明解决思路1在Vscode中进行配置缺点 解决思路2 增加Vscode引用路径 问题说明 在嵌入式开发中需要经常用到库函数(SPL), Vscode需要配置引用路径才能对函数名或变量进行跳转 解决思路1 与Keil5 MDK类似, 在配置C/C的json文件中添…

容器和虚拟机的对比

容器和虚拟机的对比 容器和虚拟机在与硬件和底层操作系统交互的方式上有所不同 虚拟化 使多个操作系统能够同时在一个硬件平台上运行。 使用虚拟机监控程序将硬件分为多个虚拟硬件系统&#xff0c;从而允许多个操作系统并行运行。 需要一个完整的操作系统环境来支持该应用。…

SpringBoot内置工具类

Collections java.util包下的Collections类&#xff0c;该类主要用于操作集合或者返回集合 一、排序 List<Integer> list new ArrayList<>();list.add(2);list.add(1);list.add(3);Collections.sort(list);//升序System.out.println(list);Collections.reverse(…

React一学就会(7): 细说redux及其应用

不知不觉一个星期结束了&#xff0c;很快就要过年了&#xff0c;中间休息了两天&#xff0c;小孩生病&#xff0c;我也有点感冒了&#xff0c;还好&#xff0c;我的这个 React 基础教学课程也基本结束了。大家有不明白的可以留言问我&#xff0c;我一定竭尽所能的帮助你。后面几…

leetcode刷题(剑指offer) 79.单词搜索

79.单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水…

如何在Win系统安装Jupyter Notbook并实现无公网ip远程访问本地笔记

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…