谈谈css伪类与伪元素
前端er们大都或多或少地接触过CSS伪类和伪元素,比如最常见的:focus
、:hover
以及<a>
标签的:link
、:visited
等,伪元素较常见的比如:before
、:after
等。
在这里也许有不少人都见过:before,::before这样的写法,估计有些人很纳闷,这两者有什么区别吗?
有疑问,那我们就先把疑问解决了先,不要把疑问留着。其实:before,::before这两种写法都是等效,只是:befor是CSS2的写法,::before是CSS3的写法。双冒号(::)这是CSS3 规范中的要求,目的是为了区分伪类和伪元素,大多数浏览器都支持这两种表示方式。单冒号(:)用于 CSS3 伪类,双冒号(::)用于 CSS3 伪元素。对于 CSS2 中已经有的伪元素,例如 :before,单冒号和双冒号的写法 ::before 作用是一样的。一般情况下为兼容性考虑使用单冒号(:)。
解决完疑问,那我们就可以愉快的开始接下来的内容了。
伪类 - pseudo classes
伪类存在的意义是为了通过选择器找到那些不存在与DOM树中的信息(例如<a>
标签的:link
、:visited
等,这些信息不存在与DOM树结构中,只能通过CSS选择器来获取)以及不能被常规CSS选择器获取到的信息(例如要修改第几个子元素的样式)。
伪类的语法:
selector : pseudo-class {property: value}
CSS 类也可与伪类搭配使用:
selector.class : pseudo-class {property: value}
伪类选择器(这里的伪类选择器等效于文中所涉及到的伪类)与我们常用的类选择器的区别是:类选择器可以随便起名,譬如“p.right”,然后在页面p标签的class类中加入类“right”,但是伪类选择器是CSS中已经定义好的选择器,不能随便起名。下面是一些我们常见的伪类选择器:
:active —— 样式添加到正在被激活的元素
:focus —— 样式添加到获得焦点的元素
:hover —— 样式添加到鼠标悬浮的元素
:link —— 样式添加到未被访问过的链接
:visited —— 样式添加到已经访问过的链接
:first-child —— 样式添加到第一个子元素
:lang —— 样式添加到指定lang语言的标签
如何理解伪类可以通过选择器找到那些不存在与DOM树中的信息,我们看看下面这个栗子:
a:link {color: #FF0000} /* 未访问的链接 */
a:visited {color: #00FF00} /* 已访问的链接 */
a:hover {color: #FF00FF} /* 鼠标移动到链接上 */
a:active {color: #0000FF} /* 选定的链接 */
链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访问状态,和鼠标悬停状态。显然这个些状态并没有存在DOM树的信息里面。
我们再来看个栗子:
p:first-child {
color: red;
}
<div>
<p>我是文本</p>
<p>我是文本</p>
</div>
这个效果相当于下面的常规写法:
.red{
color: red;
}
<div>
<p class="red">我是文本</p>
<p>我是文本</p>
</div>
再举个栗子,通过:nth-child()
伪类可以实现一些很有意思的效果,比如:
table tr:nth-child(2n) td{
background-color: #ccc;
}
table tr:nth-child(2n+1) td{
background-color: #fff;
}
table tr:nth-child(2n+1):nth-child(5n) td{
background-color: #f0f;
}
上面的代码将所有偶数行背景色设置为#ccc
,不能被5整除的奇数行设置背景色#fff
,能够被5整除的奇数行设置背景色#f0f
。这如果要用常规CSS去实习这效果,恐怕没法搞吧,因为常规CSS选择器并没办法获取到这些元素的位置信息。
CSS3中还引入了许多新的伪类,感兴趣的可以参考这里。
伪元素 - Pseudo-elements
伪元素的语法:
selector:pseudo-element {property:value;}
CSS 类也可以与伪元素配合使用:
selector.class:pseudo-element {property:value;}
伪元素在DOM树中创建了一些抽象元素,这些抽象元素是不存在于文档语言里的(可以理解为html源码)。比如:documen接口不提供访问元素内容的第一个字或者第一行的机制,而伪元素可以使开发者可以提取到这些信息。并且,一些伪元素可以使开发者获取到不存在于源文档中的内容(比如常见的::before
,::after
)。
上面段话是伪元素的清晰定义,也是伪元素与伪类最大的区别。简单来说,伪元素创建了一个虚拟容器,这个容器不包含任何DOM元素,但是可以包含内容。另外,开发者还可以为伪元素定制样式。
常见的伪元素种类:
:first-letter —— 样式添加到文本首字母
:first-line —— 样式添加到文本首行
:before —— 样式添加到元素之前
:after —— 样式添加到元素之后
伪元素的由两个冒号::开头,然后是伪元素的名称,使用两个冒号::是为了区别伪类和伪元素(CSS2中并没有区别)。当然,考虑到兼容性,CSS2中已存的伪元素仍然可以使用一个冒号:的语法,但是CSS3中新增的伪元素必须使用两个冒号::。
来看个栗子:
p:first-letter {
color: red;
}
<p>我是文本</p>
其效果相当于:
span {
color: red;
}
<p><span>我</span>是文本</p>
效果如下:
注意:一个选择器只能使用一个伪元素,并且伪元素必须处于选择器语句的最后。
再来看看利用伪元素实现分割线的效果:
.spliter::before, .spliter::after {
content: '';
display: inline-block;
border-top: 1px solid black;
width: 200px;
margin: 5px;
}
<p class="spliter">分割线</p>
效果如下:
再来看一个:
.test-div {
width: 100px;
height: 100px;
margin-left: 20px;
background-color: #eee;
}
.test-div::before {
content: "♥";
color: red;
}
.test-div::after {
content: "♥";
color: blue;
}
<div class="test-div">helloworld</div>
效果如图:
利用伪元素其实还能实现很多效果,比如阴影效果、图像的形变效果、气泡效果等等,在这里我就不在贴出来了。师傅领进门,修行在个人,大家感兴趣的话百度一下,就有很多。
总结:
伪类的效果需要一个实际的类才能达到,而伪元素需要一个实际的元素才能达到。
伪类可以同时运用多个,而伪元素只能一次用一个。
在CSS3中,伪类用一个冒号:,伪元素用两个冒号::。
为兼容性考虑需要使用一个冒号的格式。
谈谈css伪类与伪元素的更多相关文章
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- CSS伪类和伪元素
一.伪类 CSS伪类用于向某些选择器添加特殊的效果,在W3规范中,CSS伪类有如下几个: CSS2.1 :active:向被激活的元素添加样式(激活是指点击鼠标那一下) :focus:向拥有键盘输入焦 ...
- CSS 属性 - 伪类和伪元素的区别
伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: ①写法不一样: ...
- 详解 CSS 属性 - 伪类和伪元素的区别[转]
首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...
- CSS 属性 - 伪类和伪元素
CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果.这里特殊指的是两者描述了其他 cs ...
- 关于css中伪类及伪元素的总结
css中的伪类和伪元素总是混淆,今天参考了很多资料,也查看了部分文档,现将伪类及伪元素总结如下: 一.由来: 伪类和伪元素的引入都是因为在文档树里有些信息无法被充分描述,比如CSS没有"段落 ...
- CSS的伪类和伪元素
伪类 W3C:"W3C" 列指示出该属性在哪个 CSS 版本中定义(CSS1 还是 CSS2). 属性 描述 CSS :active 向被激活的元素添加样式. 1 :focus 向 ...
- 详解 CSS 属性 - 伪类和伪元素的区别(再也不用概念盲了!!!)
首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...
- 《转载》详解 CSS 属性 - 伪类和伪元素的区别
首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...
随机推荐
- web测试之界面测试
所谓界面测试就是指,布局是否合理.整体风格是否一致.各个控件的放置位置是否符合客户使用习惯,此外还要测试界面操作便捷性.导航简单易懂性,页面元素的可用性,界面中文字是否正确,命名是否统一,页面是否美观 ...
- 基于 node 搭建博客系统(一)
系统分为两端,分别实现. 管理员端: 功能 :个人信息,设置,发布随笔,随笔列表,删除随笔,查找,文章 等. 技术点:Boostrap + AdminLTE; 基于nodejs 实现的express ...
- 深度理解select、poll和epoll
在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在大数据.高并发.集群等一些名词唱得火热之年代,select和poll的 ...
- 【PAT】B1036 跟奥巴马一起编程(15)(15 分
#include<stdio.h> int main() { int row,col; char c; scanf("%d %c",&col,&c); ...
- 3.1Python数据处理篇之Numpy系列(一)---ndarray对象的属性与numpy的数据类型
目录 目录 (一)简单的数组创建 1.numpy的介绍: 2.numpy的数组对象ndarray: 3.np.array(list/tuple)创建数组: (二)ndarray对象的属性 1.五个常用 ...
- macOS平台安装metasploit
1 在Github上克隆Metasploit git clone https://github.com/rapid7/metasploit-framework.git /usr/local/shar ...
- January 10th, 2018 Week 02nd Wednesday
No need to have a reason to love you. Anything can be a reason not to love you. 喜欢你,不需要什么理由:不喜欢你,什么都 ...
- Java设计模式之五 ----- 外观模式和装饰器模式
前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...
- 【Ansible 文档】【译文】Playbooks 变量
Variables 变量 自动化的存在使得重复的做事情变得很容易,但是我们的系统不可能完全一样. 在某些系统中,你可能想要设置一些与其他系统不一样的行为和配置. 同样地,远程系统的行为和状态也可以影响 ...
- [BJWC2011]元素
嘟嘟嘟 题中说选的数的编号亦或和不能为0,也就是在这个集合中,不能用不同的选取方案亦或出相同的值.由此联想到线性基的一个性质是,每一个数都能由线性基中特定的一些数亦或得到. 所以我们就是要求出这些数的 ...