# 1. 伪类和伪元素的区别
伪类和伪元素的根本区别在于:它们是否创造了新的元素。
- 伪元素/伪对象:不存在在DOM文档中,是虚拟的元素,是创建新元素。代表某个元素的子元素,这个子元素虽然在逻辑上存在,但却并不实际存在于文档树中。例如:用
::before
和::after
。 - 伪类:表示已存在的某个元素处于某种状态,但是通过dom树又无法表示这种状态,就可以通过伪类来为其添加样式。例如a元素的
:hover
,:active
等。
伪元素:
伪类:
另外:
- 伪类的效果可以通过添加实际的类来实现
- 伪元素的效果可以通过添加实际的元素来实现
- 所以它们的本质区别就是是否抽象创造了新元素
注意:
- 伪类只能使用
:
- 除了
::placeholder
和::selection
,伪元素既可以使用:
,也可以使用::
。 - 因为伪类是类似于添加类所以可以是多个,而伪元素在一个选择器中只能出现一次,并且只能出现在末尾。
# 1.1. :after/::after
和:before/::before
的异同
相同点
- 都可以用来表示伪元素,用来设置对象前的内容。
:before
和::before
写法是等效的,:after
和::after
写法是等效的。
不同点
:before/:after
是CSS2的写法,::before/::after
是CSS3的写法。:before/:after
的兼容性要比::before/::after
好 ,不过在H5开发中建议使用::before/::after
比较好。
注意:
- 伪元素要配合
content
属性一起使用 - 伪元素不会出现在DOM中,所以不能通过js来操作,仅仅是在CSS 渲染层加入
- 伪元素的特效通常要使用
:hover
伪类样式来激活 eg: 当鼠标移在span
上时,span
前插入'mike'
span:hover::before{
content: 'mike'
}
# 2. 伪元素注意事项
- 伪元素,它是一个元素的子元素,其意思就是说,我们无法用JS获取到这些伪元素,我们无法通过JS对其进行增、删、改,所以这也是它们的优点,因为它们不会增加JS查询DOM的负担,即对于JS来说伪元素是透明的。然后因为它们也不是实际的HTML标签,所以可以加快浏览器加载HTML文件,对SEO也有帮助(SEO 搜索引擎优化)。
- 如果我们把伪类的样式有
absolute
定位的话会把伪类强制变成块级元素,伪类本身是行内元素的。 img
、input
和其他的单标签是没有after
和before
伪元素的,因为单标签本身不能有子元素。
# 3. nth-child
和nth-of-type
的区别
p:nth-child(2)
是先找到第2个元素,然后看看它是否是p,是p才渲染p:nth-of-type(2)
是找到这些个p元素,然后渲染第2个p元素(如果第二个p存在,一定会渲染)
# 3.1. select:last-child
选择父元素的最后一个子元素,且同时满足select
条件的。两者缺一不可!
# 4. active
、hover
、link
、visited
、focus
的区别
link
表示链接在正常情况下(即页面刚加载完成时)显示的颜色。visited
表示链接被点击后显示的颜色。hover
表示鼠标悬停时显示的颜色。focus
表示元素获得光标焦点时使用的颜色,主要用于文本框输入文字时使用(鼠标松开时显示的颜色)。active
表示当所指元素处于激活状态(鼠标在元素上按下还没有松开)时所显示的颜色。
# 4.1. a
标签伪类的触发顺序
触发顺序为link
-->visited
--->hover
--->active
即记为love and hate
, 然后单独记住focus
在hover
和active
之间即可