2020-08-22-after

145 阅读7分钟

CSS伪类和伪元素区别?

  • 1.伪类(pseudo-classes)

其核心就是用来选择DOM树之外的信息,不能够被普通选择器选择的文档之外的元素,用来添加一些选择器的特殊效果

比如 :hover :active :visited :first-child :focus :lang等

由于状态的变化是非静态的,所以元素达到一个特定状态时,它可能得到一个伪类的样式;当状态改变时,它又失去这个样式

由此看可以看出,它的功能和class有些类似,但是它是基于文档之外的抽象,所以叫伪类

  • 2.伪元素(pseudo-elements)

DOM树没有定义的虚拟元素 核心就是需要创建通常不存在于文档的元素

比如::before ::after 选择的是元素指定内容,表示选择元素内容的之前的内容或之后内容

伪元素控制的内容和元素是没有差别的,但是它本身只是基于元素的抽象,并不存在于文档中,所以称为伪元素。用于将特殊的效果添加到某些选择器

  • 3.两者区别

表示方法

css2中伪类、伪元素都是单冒号:表示

css2.1后规定伪类用单冒号表示,伪元素用双冒号::表示

浏览器同样接受css2时代已经存在的伪元素(:before :after :first :line :first-letter等)的单冒号写法

css2之后所有新增的伪元素(::selection),应该采用双冒号的写法

css3中,伪类与伪元素在语法上也有所区别,伪元素修改以::开头。浏览器对以:开头的伪元素也继续支持,但建议规范书写为::开头 定义不同

伪类即假的类,可以添加类来达到效果

伪元素即假元素,需要通过添加元素才能到达效果

总结

伪类和伪元素都是用来表示文档树之外的"元素"

伪类和伪元素分别用单冒号:和双冒号::来表示

伪类和伪元素的区别,关键点在于如果没有伪元素(或伪类) 是否需要添加元素才能达到效果,如果是则是伪元素,反之是伪类

  • 4.相同之处

伪类和伪元素都不会出现在源文件和DOM树中。也就是说在html源文件中是看不到伪类和伪元素的

不同之处 伪类其实就是基于普通DOM元素而产生的不同状态,他是DOM元素的某一特征

伪元素能够创建在DOM树中不存在的抽象对象,而且这些抽象对象是能够访问到的

  • :link
  • :visited
  • :hover
  • :active
  • :focus
  • :not()
  • :first-child
  • :last-child
  • :nth-child
  • :nth-last-child 从后面计数
  • :only-child 只满足一个子元素
  • :target 当URL带有锚名称,指向文档内某个具体的元素时,:target匹配该元素。
  • :checked 被选中的input元素
  • :empty 匹配没有子元素的元素
  • :valid 匹配条件验证正确的表单元素
  • ::before/:before 在被选元素前插入内容
  • ::after/:after 在被元素后插入内容,其用法和特性与:before相似。
  • ::first-letter/:first-letter 匹配元素中文本的首字母。被修饰的首字母不在文档树中
  • ::first-line/:first-line 匹配元素中第一行的文本。这个伪元素只能用在块元素中,不能用在内联元素中。
  • ::selection 匹配用户被用户选中或者处于高亮状态的部分。在火狐浏览器使用时需要添加-moz前缀。该伪元素只支持双冒号的形式。
  • ::placeholder 匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效。该伪元素不是CSS的标准,它的实现可能在将来会有所改变,所以要决定使用时必须谨慎。在一些浏览器中(IE10和Firefox18及其以下版本)会使用单冒号的形式。
  • 对于伪元素 :before 和 :after 而言,属性 content 是必须设置的,我们知道属性的值可以为字符串,也可以有其它形式,比如指向一张图片的 URL
  • 配合伪类使用。伪元素 ::before 还可以配合伪类使用,这里举经常与 ::before 配合使用的伪类 :hover 例如 .before:hover:before{content:'you before'; color:red;}
  • 配合取值函数 attr() 使用 例如 a::before{content: attr(title)}

 伪类分类

(1)表示状态: :link   选择未访问的链接;

:visited  选择已访问的链接;

:hover  选择鼠标指针移入链接;

:active  被激活的链接,即按下单击鼠标左键但未松开;

:focus  选择获取焦点的输入字段;

######(2)结构化伪类:

  • :not 否定伪类,用于匹配不符合参数选择器的元素;
  • :first-child匹配元素的第一个子元素;
  • :last-child   匹配元素的最后一个子元素;
  • first-of-type  匹配属于其父元素的首个特定类型的子元素的每个元素;
  • :last-of-type  匹配元素的最后一个子元素;
  • :nth-child根据元素的位置匹配一个或者多个元素,它接受一个an+b形式的参数(an+b最大数为匹配元素的个数);
  • :nth-last-child   :nth-last-child与:nth-child相似,不同之处在于它是从最后一个子元素开始计数的;
  • :nth-of-type  :nth-of-type与nth-child相似,不同之处在于它是只匹配特定类型的元素;
  • :nth-last-type :nth-last-of-type与nth-of-type相似,不同之处在于它是从最后一个子元素开始计数的;
  • :only-child   当元素是其父元素中唯一一个子元素时。
  • :only-child匹配该元素; :only-of-type 当元素是其父元素中唯一一个特定类型的子元素时,
  • :only-child匹配该元素;
  • :target 当URL带有锚名称,指向文档内某个具体的元素时,:target匹配该元素;
(3)表单相关伪类:
  • :checked 匹配被选中的input元素,这个input元素包括radio和checkbox;
  • :default   匹配默认选中的元素,例如:提交按钮总是表单的默认按钮;
  • :disabled  匹配禁用的表单元素;
  • :empty   匹配没有子元素的元素。如果元素中含有文本节点、HTML元素或者一个空格,则:empty不能匹配这个元素;
  • :enabled  匹配没有设置disabled属性的表单元素;
  • :in-range 匹配在指定区域内元素;
  • :out-of-range    与:in-range相反,它匹配不在指定区域内的元素;
  • :indeterminate  indeterminate的英文意思是“不确定的”。当某组中的单选框或复选框还没有选取状态时,
  • :indeterminate匹配该组中所有的单选框或复选框; :valid     匹配条件验证正确的表单元素;
  • :invalid   与:valid相反,匹配条件验证错误的表单元素;
  • :optional  匹配是具有optional属性的表单元素。当表单元素没有设置为required时,即为optional属性;
  • :required  匹配设置了required属性的表单元素;
  • :read-write  匹配处于编辑状态的元素。input,textarea和设置了contenteditable的HTML元素获取焦点时即处于编辑状态;
  • :scope(处于试验阶段)  匹配处于style作用域下的元素。当style没有设置scope属性时,style内的样式会对整个html起作用;
伪元素
  • ::before/:before 在某个元素之前插入一些内容;
  • ::after/:after 在某个元素之后插入一些内容;
  • ::first-letter/:first-letter 为某个元素中的文字的首字母或第一个字使用样式;
  • ::first-line/:first-line 为某个元素的第一行文字使用样式
  • ::selection 匹配用户被用户选中或者处于高亮状态的部分;
  • ::placeholder 匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效;
  • ::backdrop(处于试验阶段) | 用于改变全屏模式下的背景颜色,全屏模式的默认颜色为黑色。该伪元素只支持双冒号的形式;