- 伪元素是真的有元素
- 前者是单冒号,后者是双冒号
总结一下伪类与伪元素的特性及其区别:
- 伪类本质上是为了弥补常规CSS选择器的不足,以便获取到更多信息;
- 伪元素本质上是创建了一个有内容的虚拟容器;
- CSS3中伪类和伪元素的语法不同;
- 可以同时使用多个伪类,而只能同时使用一个伪元素;
1、伪类
- 获取不存在与DOM树中的信息。比如
<a>
标签的:link
、visited
等,这些信息不存在与DOM树结构中,只能通过CSS选择器来获取;- 获取不能被常规CSS选择器获取的信息。比如伪类
:target
,它的作用是匹配文档(页面)的URI中某个标志符的目标元素,例如我们可以通过如下代码来实现页面内的区域跳转:举个栗子,通过
: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
。如果不使用伪类而是使用JavaScript代码来实现上述的效果,恐怕要复杂很多。可以总结出:nth-child()
伪类的效果是将被常规css选择器筛选出的元素按照既定规定进行再次筛选。CSS3中还引入了许多新的伪类,感兴趣的读者可以参考这里。
2、伪元素
伪元素在DOM树中创建了一些抽象元素,这些抽象元素是不存在于文档语言里的(可以理解为html源码)。比如:documen接口不提供访问元素内容的第一个字或者第一行的机制,而伪元素可以使开发者可以提取到这些信息。并且,一些伪元素可以使开发者获取到不存在于源文档中的内容(比如常见的
::before
,::after
)。
伪元素的由两个冒号
::
开头,然后是伪元素的名称。
使用两个冒号
::
是为了区别伪类和伪元素(CSS2中并没有区别)。当然,考虑到兼容性,CSS2中已存的伪元素仍然可以使用一个冒号:
的语法,但是CSS3中新增的伪元素必须使用两个冒号::
。
一个选择器只能使用一个伪元素,并且伪元素必须处于选择器语句的最后。
注:不排除未来会加入同时使用多个伪元素的机制。
同样,第一段话是伪元素的清晰定义,也是伪元素与伪类最大的区别。简单来说,伪元素创建了一个虚拟容器,这个容器不包含任何DOM元素,但是可以包含内容。另外,开发者还可以为伪元素定制样式。
已::first-line
为例,它获取了指定元素的第一行内容并且将第一行的内容加入到虚拟容器中。如果通过JavaScript来实现这个逻辑,那么要考虑的因素就太多了,比如制定元素的宽度、字体大小,甚至浮动元素的图文混排等等。当然,这些问题确实是可以用JavaScript来解决的,但是相对于::first-line
简简单单的几个字,用JavaScript恐怕不止这些吧!
举个综合使用伪类和伪元素的栗子:
q:lang(de)::after{
content: " (German) ";
}
q:lang(en)::after{
content: " (English) ";
}
q:lang(fr)::after{
content: " (French) ";
}
q:not(:lang(fr)):not(:lang(de)):not(:lang(en))::after{
content: " (Unrecognized language) ";
}
以上代码通过伪类"lang
获取不同lang
属性的节点,并为之设置伪元素::after
,伪元素的内容是此节点的语言类型。
例子
<style>
li:first-child {
height: 20px;
width: 100px;
background-color: #139aff;
}
li:last-child {
height: 60px;
width: 100px;
background-color: #89ff56;
line-height: 60px;
}
p:first-of-type {
background-color: red;
}
p:last-of-type {
background-color:deeppink;
}
/*每个p标签之前新增一个Hello文本*/
.container p::before {
content: 'Hello';
}
.container p::after {
content: 'Thanks';
}
.container p::first-letter {
font-size: 32px;
}
.container p::first-line {
background-color: #f1ffad;
}
/*所有选中的元素会变色*/
.container p::selection {
background-color: #1025ff;
color: red;
}
</style>
<body>
<ul>
<li>111</li>
<li>222</li>
<li>333</li>
<li>444</li>
<li>555</li>
</ul>
<div>
<h1>h1文本</h1>
<p>p文本1</p>
<p>p文本2</p>
<p>p文本3</p>
<p>p文本4</p>
</div>
<div class="container">
<p> css1 </p>
<p> css2 </p>
<p> css3 </p>
<p>我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素,我在学伪元素</p>
</div>
</body>
</html>
原文链接: