深入理解CSS伪类
前面的话
伪类经常与伪元素混淆,伪元素的效果类似于通过添加一个实际的元素才能达到,而伪类的效果类似于通过添加一个实际的类来达到。实际上css3为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。本文将详细介绍伪类的详细知识
锚点
关于锚点<a>,有常见的5个伪类,分别是:link,:hover,:active,:focus,:visited
a:link{background-color:pink;}/*品红,未访问*/
a:hover{background-color:lightblue;}/*浅蓝,鼠标悬停*/
a:active{background-color:lightgreen;}/*浅绿,正被点击*/
a:focus{background-color:lightgrey;}/*浅灰,拥有焦点*/
a:visited{color:orange;}/*字体颜色为橙色,已被访问*/
/*[注意]visited伪类只能设置字体颜色、边框颜色、outline颜色的样式*/
伪类顺序
对于伪类顺序,有一个口诀是love-hate,代表着伪类的顺序是link、visited、focus、hover、active。但是否伪类的顺序只能如此呢?为什么是这个顺序呢?
CSS层叠中有一条法则十分重要,就是后面覆盖前面,所以伪类的顺序是需要精心考虑的。
【1】link和visited必须在最前面,且没有先后顺序,否则link或visited的效果将被覆盖
[注意]link和visited称为静态伪类,只能应用于超链接
【2】hover、active、focus这三个伪类必须是focus、hover、active的顺序,因为在focus状态下,也需要触发hover和active,而要触发active一定要先触发hover,所以active要放在hover后面
[注意]hover、active、focus称为动态伪类,可应用于任何元素,但IE7-浏览器不支持:focus,:hover和:active在IE6-浏览器下只支持给<a>设置
所以最终的顺序只有两种:link、visited、focus、hover、active或visited、link、focus、hover、active
a:link{background-color:pink;}/*品红,未访问*/
a:visited{color:orange;}/*字体颜色为橙色,已被访问*/
a:focus{background-color:lightgrey;}/*浅灰,拥有焦点*/
a:hover{background-color:lightblue;}/*浅蓝,鼠标悬停*/
a:active{background-color:lightgreen;}/*浅绿,正被点击*/
UI元素伪类
UI元素伪类包括:enabled、:disabled、:checked三个,主要针对于HTML中的form元素,IE8-浏览器不支持
:enabled 可用状态
:disabled 不可用状态
:checked 选中状态
input:enabled{
border: 1px solid black;
background-color: transparent;
}
input:disabled{
border: none;
background-color: gray;
}
input:checked{
outline: 2px solid lightblue;
}
<button onclick = "btn.disabled = false;">按钮可用</button>
<button onclick = "btn.disabled = true;">按钮不可用</button>
<input type="button" id="btn" value="按钮">
<br>
<label>Male<input type="radio" name="sex" /></label>
<label>Female<input type="radio" name="sex" /></label>
[注意]input和:和enabled之间都不可以有空格
结构伪类
结构伪类可分为以下3种情况,IE8-浏览器不支持
//以下情况都是E为父元素,F为子元素
【1】:nth-child(n)、:nth-last-child(n)、first-child、last-child、:only-child
E F:nth-child(n) 选择父元素的第n个子元素
E F:nth-last-child(n) 选择父元素的倒数第n个子元素
E F:first-child 父元素的第一个子元素,与E F:nth-child(1)等同
E F:last-child 父元素的最后一个子元素,与E F:nth-last-child(1)等同
E F:only-child 选择父元素中只包含一个子元素
[注意]:first-child和:last-child只有IE6-浏览器不支持
n可以是整数(从1开始),也可以是公式,也可以是关键字(even、odd)
p:first-child 代表的并不是<p>的第一个子元素,而是<p>元素是某元素的第一个子元素
p > i:first-child 匹配所有<p>元素中的第一个<i>元素
p:first-child i 匹配所有作为第一个子元素的<p>元素中的所有<i>元素
li:nth-child(odd){color: red;}
li:nth-last-child(3){color: green;}
li:first-child{color: blue;}
li:last-child{color: yellow;}
div:only-child{background-color:lightgrey;}
<ul>
<li><div>第一个DIV</div></li>
<li><div>第二个DIV</div></li>
<li><div>第三个DIV</div></li>
<li><div>第四个DIV</div></li>
<li><div>第五个DIV</div></li>
<li><div>第六个DIV</div></li>
</ul>
【2】:nth-of-type(n)、:nth-last-of-type(n)、:first-of-type、:last-of-type、:only-of-type
E F:nth-of-type(n) 选择父元素的具有指定类型的第n个子元素
E F:nth-last-of-type(n) 选择父元素的具有指定类型的倒数第n个子元素
E F:first-of-type 选择父元素中具有指定类型的第1个子元素,与E F:nth-of-type(1)相同
E F:last-of-type 选择父元素中具有指定类型的最后1个子元素,与E F:nth-last-of-type(1)相同
E F:only-of-type 选择父元素中只包含一个同类型的子元素
.box div:nth-of-type(even){color: red;}
.box p:nth-last-of-type(3){color: green;}
.box div:first-of-type{color: blue;}
.box p:last-of-type{color: yellow;}
.box div:only-of-type{color: pink;}
<div class="box">
<div>第一个div</div>
<p>第一个p</p>
<div>第二个div</div>
<p>第二个p</p>
<div class="in">第三个div</div>
<p>第三个p</p>
</div>
<div class="box">
<div>第四个div</div>
</div>
【3】:root、:not、:empty、:target
:root 选择文档的根元素
:not 选择除某个元素之外的所有元素
:empty 选择没有子元素的元素,而且该元素也不包含任何文本节点
:target 匹配锚点对应的目标元素
[注意]:not选择器常用于导航之间的竖线处理,如li:not(:last-of-type)
:root{color:red;}
div:not{background-color: lightgrey;}
p:empty{height:30px;width:30px;background:pink;}
:target{color:blue;}
<body>
<a href="#test">测试</a>
<div>第一个div</div>
<p>第一个p</p>
<div id="test">第二个div</div>
<p>第二个p</p>
<p></p>
</body>
其他
【1】:lang() 匹配某个语言,IE7-浏览器不支持
p:lang(en) 匹配语言为"en"的<p>
【2】不仅可以使用单一伪类,也可以伪类结合使用
[注意]顺序无关
div:hover:first-child{background-color: lightgreen;}
div:last-of-type:active{background-color: lightblue;}
<div>第一个div</div>
<div>第二个div</div>
速查表
下面是伪类的速查表
/* Logical Combinations */
:matches() /*:any()*/ /* 匹配 集合内指定 的元素 */
:not() /* 排除 满足指定关系 的元素 */
:has() /* 匹配 满足指定关系 的元素*/ /* Linguistic Pseudo-classes */
:dir() /* 匹配 设置dir(文字书写方向)属性 的元素 */
:lang() /* 匹配 设置lang(定义元素语言)属性 的元素 */ /* Location Pseudo-classes */
:any-link /* 匹配 任意有链接锚点 的元素*/
:link /* 匹配 未处于访问记录中 的链接 */
:visited /* 匹配 处于访问记录中 的链接 */
:target /* 匹配 URL指向的锚点 的元素 */
:scope /* 匹配 设置scoped属性的style标签 的作用域 */ /* User Action Pseudo-classes */
:hover /* 匹配 处于鼠标悬停状态 的元素 */
:active /* 匹配 处于激活状态 的元素 */
:focus /* 匹配 处于聚焦状态 的元素 */
:focus-ring /* 匹配 处于聚焦状态元素 的UA样式(聚焦轮廓) */
:focus-within /* 匹配 子节点处于聚焦状态 的元素 */
:drop /* 匹配 处于拖拽状态 的元素 */
:drop() /* 匹配 处于指定拖拽状态 的元素 */ /* Time-dimensional Pseudo-classes */
:current /* 匹配 处于当前状态 的定义了timeline属性的元素 */
:past /* 匹配 处于过去状态 的定义了timeline属性的元素 */
:future /* 匹配 处于将来状态 的定义了timeline属性的元素 */ /* Resource State Pseudos */
:playing /* 匹配 处于播放状态 的元素 */
:paused /* 匹配 处于暂停状态 的元素 */ /* The Input Pseudo-classes */
:enabled /* 匹配 可以编辑 的元素 */
:disabled /* 匹配 禁止编辑 的元素 */
:read-only /* 匹配 内容只读 的元素 */
:read-write /* 匹配 内容可编辑 的元素 */
:placeholder-shown /* 匹配 显示字段占位符文本 的元素 */
:default /* 匹配 页面载入默认选中 的元素 */ :checked /* 匹配 选中状态 的元素 */
:indeterminate /* 匹配 模糊状态 的元素 */ :valid /* 匹配 输入内容通过类型验证 的元素 */
:invalid /* 匹配 输入内容无法通过类型验证 的元素 */
:in-range /* 匹配 输入数值符合范围 的元素 */
:out-of-range /* 匹配 输入数值溢出范围 的元素 */
:required /* 匹配 设置必填属性 的元素 */
:optional /* 匹配 可选字段 的元素 */
:user-invalid /* 匹配 用户输入内容未通过验证 的元素 */ /* Tree-Structural pseudo-classes */
:root /* 匹配 文档树 的根元素*/
:empty /* 匹配 无子节点 的元素 */
:blank /* 匹配 仅包含空格或者换行符 的元素 */ :nth-child(n) /* 匹配 符合元素集合中指定位置 的元素 */
:nth-last-child(n) /* 反序匹配 符合元素集合内指定位置 的元素 */
:first-child /* 匹配 符合元素集合内首个 的元素 */
:last-child /* 匹配 符合元素集合内末尾 的元素 */
:only-child /* 匹配 无兄弟节点 的元素 */ :nth-of-type(n) /* 匹配 符合元素集合中同类型指定位置 的元素 */
:nth-last-of-type(n) /* 反序匹配 符合元素集合中同类型指定位置 的元素 */
:first-of-type /* 匹配 每个在元素集合中初次出现 的元素 */
:last-of-type /* 匹配 每个在元素集合中末次出现 的元素 */
:only-of-type /* 匹配 无同类兄弟节点 的元素*/ /* Fullscreen API */
:fullscreen /* 匹配 全屏显示模式中 的元素 */ /* Page Selectors */
:first /* 打印文档时首页的样式 */
:left /* 打印文档时左侧的样式 */
:right /* 打印文档时右侧的样式 */
深入理解CSS伪类的更多相关文章
- 理解css伪类和伪元素
伪类就是可以通过直接添加一个类样式达到同等效果,而伪元素,则需要先添加一个元素,然后在元素上添加样式才能达到同等效果 伪类 :active 向被激活的元素添加样式. :focus 向拥有键盘输入焦点的 ...
- CSS伪类的理解
因为之前一直对css伪类没有过多的了解,在网上看到一段css代码,不能理解 a:hover span.title{ color:red; ......... } 现通过查询css手册,其实css伪类只 ...
- CSS 伪类 (Pseudo-classes)
CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪类 (Pseudo-classes)实例: 超链接 本例演示如何向文档中的超链接添加不同的颜色. 超链接 2 本例演示如何向超链接添加其他样式. ...
- 应用越来越广泛的css伪类
说起css伪类,学习web前端网页设计的同学们应该对此应该不是很陌生,以前很多的网页的特效大多是通过js来实现的.但是随着CSS3不断开发,利用css实现网页的特效不仅响应不错,而且还减少了很多的代码 ...
- js动态改变css伪类样式
首先我们来看下页面上需要实现的基本效果,如下图所示: 因此我们可以使用如下js代码来试试看,是否能使用js改变伪类?如下代码所示: $(function() { $('.listnav li').cl ...
- 谈谈css伪类与伪元素
前端er们大都或多或少地接触过CSS伪类和伪元素,比如最常见的:focus.:hover以及<a>标签的:link.:visited等,伪元素较常见的比如:before.:after等. ...
- CSS伪类:first-child与:first-of-type的异同
CSS里关于元素匹配里面有两个非常类似却又不尽相同的选择器,伪类 :first-child 和 :first-of-type 两者在匹配方式上有很大差异,其实在一开始自己也没去注意这个细节,直到上次一 ...
- CSS伪类和伪元素
一.伪类 CSS伪类用于向某些选择器添加特殊的效果,在W3规范中,CSS伪类有如下几个: CSS2.1 :active:向被激活的元素添加样式(激活是指点击鼠标那一下) :focus:向拥有键盘输入焦 ...
- CSS伪类选择器
一.CSS伪类选择器用于给某些选择器添加效果语法规则:选择器:伪选择器例:a:link {color: #FF0000} 未访问的链接 a:visited {color: #00FF00} 已访问的链 ...
随机推荐
- torch-ios框架XCODE使用备忘
1.首先编译框架 ./generate_ios_framework 2.把框架包含进project 在general-link Frameweork and Libraries 加入这个框架,注 ...
- MVC3/4伪静态 jexus mvc伪静态
第一步修改RouteConfig.cs文件 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute ...
- Linux内核--网络栈实现分析(四)--网络层之IP协议(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7514017 更多请看专栏,地址 ...
- Activity类生命周期
Activity通常就是一个单独的屏幕.每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件作出响应. 从开发者角度看,Activity是一个J ...
- windows配置php开发环境
1.安装xampp. xampp集成了php.prel.mysql.apache等网站工具,安装超简单,本身也超级好用.点击下载xampp 2.讲xmapp中的php配置到环境变量 比如我的xampp ...
- IOS9 新加关键字 nullable、nonnull、null_unspecified、null_resettable
#import "ViewController.h" @interface ViewController () @property(nonatomic,nullable)NSStr ...
- linux-9基本命令之-查看系统负载 uptime
uptime 查看系统负载 uptime @1.查看每一秒的刷新一次系统负载运行情况 [root@localhost /]# watch -n uptime 系统当前时间 系统已运行时间 ...
- 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)
解剖SQLSERVER 第二篇 对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...
- 移动开发发展方向-----Hybird混合开发3大方案
移动开发发展方向-----Hybird混合开发3大方案
- Java多线程8:wait()和notify()/notifyAll()
轮询 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处 ...