你可能需要知道的前端小知识——CSS的选择器和伪元素

427 阅读4分钟
  • 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  • 选择器:根据特征判断是否选中元素

  • 伪元素:语法和伪类相似,选出dom树中“不存在”的元素。

简单选择器

全体选择器

  • *
  • 选中任意元素,常用在页面样式reset

标签选择器

  • 常见的标签,也可配合命名空间使用
  • 对某一种标签的所有原则进行选择

id选择器

  • #后跟id
  • 针对特定id的选择器

class选择器

  • .后跟class
  • 针对特定class的选择器

属性选择器

  • 可以一定程度上替代id选择器和class选择器
  • 根据HTML元素的属性来选中元素

[attr]

  • 直接在方括号中放入属性名,检查元素是否具有这个属性,只要元素有这个属性,不论属性是什么值,都可以被选中

[attr=val]

  • 检查元素属性attr的值是否为val,是val元素被选中

[attr~=val]

  • 检查元素属性attr的值中是否含有val,含有val元素被选中

[attr|=val]

  • 检查元素属性attr的值是否是val或者以val-为前缀,如果是元素被选中

[attr^=val]

  • 检查元素属性attr的值是不是以val开头,如果是元素被选中

[attr$=val]

  • 检查元素属性attr的值是不是以val结尾,如果是元素被选中

[attr*=val]

  • 检查元素属性attr的值中是否有val,如果是元素被选中
  • [attr~=val]不同:
<div>
    <p title="web param">p1</p>
    <p title="web param">p2</p>
    <p title="web param">p3</p>
    <p title="web para">p4</p>
</div>
// [title~=para] 只选中p4
// [title*=para] p1、p2、p3、p4都会被选中

伪类选择器

  • 建议在不得不使用伪类选择器的场景下使用伪类

树结构伪类

  • :root:树的根元素
  • :empty:没有子节点的元素,这里的没有子节点包括空白符和空格
  • :nth-child:nth-last-child:从前数和从后数第n个元素
    • 相似的还有:first-child:last-child 表示第一个元素和最后一个元素

链接相关的伪类

  • :link:表示未访问过的链接
  • :visited:表示已访问过的链接
  • :active:表示用户正在激活的元素(用户按下按钮,还未抬起,这个按钮就处于激活状态)
  • :focus:表示焦点落在这个元素之上
  • :target:用于选中浏览器URL的href所指定的元素

逻辑伪类

  • :not:可搭配简单伪类选择器使用,目前不支持嵌套

选择器组合

  • 无连接符号
  • 且的关系
    • 空格
    • ~
    • +
    • >
    • ||
  • 或的关系,,多个内容一样的css选择器的简写

选择器的优先级

  • 使用一个三元组(a,b,c)来构成一个复杂选择器的优先级
    • id选择器的数目为a
    • 伪类选择器和class选择器的数目为b
    • 伪元素选择器和标签选择器数目为c
  • 优先级=base*base*a+base*b+c
  • base是个足够大的正整数
  • 行内属性的优先级高于a,b,c
  • !important比行内属性的优先级还高,要谨慎使用

伪元素

已有内容套上一个元素

::first-line

  • 元素的第一行(指的是排版后显示的第一行,和html中的换行没有关系)
  • 对块级元素起作用,如果是多个块级元素嵌套,对最内层的块级元素起作用
  • 可设置的CSS属性一般是字体相关的属性和背景

::first-letter

  • 元素的第一个字母
  • 适用所有标签
  • 可设置的CSS属性除了字体相关、背景,也可使用盒模型相关以及浮动

新建一个元素

::before

  • 在元素内容前插入一个虚拟元素
  • 必须指定content属性才生效,支持所有CSS属性

::after

  • 在元素内容后插入一个虚拟元素
  • 必须指定content属性才生效,支持所有CSS属性

总结

  • 在合适的情况下选择使用合适的选择器选择元素和伪元素,可以有效的提高css的性能和可读性
  • 对选择器有更多看法,欢迎留言讨论