前端分享

CSS伪元素和伪类

1. 常见的伪元素和伪类

  • 常见的伪类 :focus :hover :active :visited :link :first-child :lang
  • 常见的伪元素(伪对象) :before :after :first-letter :first-line ::placeholder

2. 伪类

CSS3中对伪类的定义:

  • 伪类存在的意义是为了通过选择器找到那些不存在与DOM树中的信息以及不能被常规CSS选择器获取到的信息
  • 伪类由一个冒号:开头,冒号后面是伪类的名称和包含在圆括号中的可选参数
  • 任何常规选择器可以再任何位置使用伪类。伪类语法不区别大小写。一些伪类的作用会互斥,另外一些伪类可以同时被同一个元素使用。并且,为了满足用户在操作DOM时产生的DOM结构改变,伪类也可以是动态的

CSS3 新添加了一些伪类

3. 伪元素

CSS3中对伪元素的定义:

  • 伪元素在DOM树中创建了一些抽象元素,这些抽象元素是不存在于文档语言里的(可以理解为html源码)。比如:document接口不提供访问元素内容的第一个字或者第一行的机制,而伪元素可以使开发者可以提取到这些信息。并且,一些伪元素可以使开发者获取到不存在于源文档中的内容(比如常见的::before, ::after)
  • 伪元素的由两个冒号::开头,然后是伪元素的名称
  • 使用两个冒号::是为了区别伪类和伪元素(CSS2中并没有区别)。考虑到兼容性,CSS2中已存的伪元素仍然可以使用一个冒号:的语法,但是CSS3中新增的伪元素必须使用两个冒号::
  • 一个选择器只能使用一个伪元素,并且伪元素必须处于选择器语句的最后

4. 伪类和伪元素的区别

伪类和伪元素是CSS1和CSS2提出的概念,前两个阶段区分模糊,在CSS3中对这两个概念做了相对较清晰地概念,并且在语法上也很明显的将二者区别开。

  • 伪类本质上是为了弥补常规CSS选择器的不足,以便获取到更多信息;
  • 伪元素本质上是创建了一个有内容的虚拟容器;
  • CSS3中伪类和伪元素的语法不同;
  • 可以同时使用多个伪类,而只能同时使用一个伪元素 , 并且只能出现在末尾
  • 伪类与类优先级相同
  • 伪元素与标签优先级相同

为什么0.1 + 0.2 !== 0.3,如何保证这种判等是对的

因为JavaScript 使用IEEE754 (64位双精度)二进制浮点数计算标准;JavaScript中Number 都是按照这个标准存储的。

IEEE754 (32位双精度)存储数字时,从左到右,1位符号,8位指数位(阶码),23位有效数位(尾数)
IEEE754 (64位双精度)是 1位符号,11位指数位(阶码),52位有效数位(尾数)

0.1 转为二进制数时 是0.00011(0011),0011 部分无限循环,所以0.1的二进制在存储时,最后就会涉及到进位;0.2在转换时也是无限循环的。
所以 0.1 + 0.2 = 0.30000000000000004 而不是 0.3

解决方法:

  1. 不考虑精度
    code_1
  2. 使用ES6提供的Number.EPSILON (机器精度)
    code_2

列举字符串转数字的方法

1
2
3
4
5
6
7
8
Number构造函数
parseInt
parseFloat
+"1"
"1"*1
"1"|0
"1" >> 0
"1" << 0