2021应届秋招前端面经(一)CSS部分

CSS css权重 (Specificity)

  • 较长的css选择器权重会大于较短的css选择器
  • id选择器权重高于class选择器
官方文档说明:
  • Specificity is the means by which browsers decide which CSS property values are the most relevant to an element and, therefore, will be applied. Specificity is based on the matching rules which are composed of different sorts of CSS selectors
  • 官方文档中用 Specificity: 特异性 来表示一个 css selector 和其元素的相关性. 相关性越强, 即表示表示其权重最高。
  • Specificity is a weight that is applied to a given CSS declaration, determined by the number of each selector type in the matching selector
  • Specificity 是由 selector 中 不同 selector type 的数目决定的。
根据 W3 标准中的规定, css selector 分为 4 种 type: a, b, c, d. 他们的数目计算规则为:
  • a: 如果 css 属性声明是写在 style=“” 中的, 则数目为 1, 否则为 0
  • b: id 选择器的数目
  • c: class 选择器, 属性选择器(如 type=“text”), 伪类选择器(如: ::hover) 的数目
  • d: 标签名(如: p, div), 伪类 (如: :before)的数目
在比较不同 css selector 的权重时, 按照 a => b =>c => d 的顺序进行比较.
由第一个 selector type a 的计算规则可知: 写在 html 代码 style 属性中的 css 相较写在 css 选择器中的 css 属性具有最高的优先级。
而 id selector (b) 相较 class selector (c) 有更高的优先级. 这也和我们平时的经验相吻合。
  • 除了上面 Specificity 计算规则中的 css 选择器类型, 还有一些选择器如: *, +, >,:not() 等. 这些选择器并不会被计算到 css 的权重当中 。
  • 有一个需要特别注意一下的选择器: :not(), 虽然它本身是不计权重的, 但是写在它里面的 css selector 是需要计算权重的。
  • 如果 a,b,c,d 算完都一样,最后声明的 css selector 会生效。
  • 如果我重复同样的 css selectory type, 权重会被重复计算。
关于!important:
按照 MDN的说法, !important 是不在 css 选择器的权重计算范围内的, 而它之所以能让 css 选择器生效是因为浏览器在遇见 !important 时会进行特殊的判断. 当多个 !important 需要进行比较时, 才会计算其权重再进行比较.
通常来说, 不提倡使用 !important. 如果你认为一定要使用, 不妨先自检一下:
  • 总是先考虑使用权重更高的 css 选择器, 而不是使用 !important
  • 只有当你的目的是覆盖来自第三方的 css(如: Bootstrap, normalize.css)时, 才在页面范围使用 !important
  • 永远不要 在你写一个第三方插件时使用 !important
  • 永远不要在全站范围使用 !important
css 行内 块级 及 行内块级元素
块级元素 block:
顾名思义,该元素呈现“块”状,所以它有自己的宽度和高度,可以自定义width和height。并且独自占据一行高度(float浮动除外),一般可作为其他容器使用,可容纳块级元素和行内元素。
块级元素有以下特点:
  • 每个块级元素都是独占一行。
  • 元素的高度(height)、宽度(width)、行高(line-height)和边距(margin,padding)都是可以设置的。
  • 元素的宽度如果不设置,默认为父元素的宽度(父元素宽度100%)
常见的块元素:
//定义地址 //定义文档中的分页区或节
//定义列表
//定义列表中的项目
//创建html表单 -->//定义标题 //水平线
  • //定义列表项目
      //定义有序列表
        //定义无序列表//定义段落 //定义html表格//表格主体//定义表格页脚thead>//定义表格表头 //定义表格中的行
        行内元素 inline:
        行内元素不可以设置(width)和高(height),但可以与其他行内元素位于同一行,行内元素内一般不跨域包含块级元素。行内元素的高度一般由元素内部的字体大小决定,宽度由内容的长度控制。
        行内元素有以下特点:
        • 每一个行内元素可以和别的行内元素共享一行,相邻的行内元素会排列在同一行里,直到一行排不下,才会换行。
        • 行内元素的高度、宽度、行高及顶部和底部边距不可设置。
        • 元素的宽度就是它包含的文字或图片的宽度,不可改变
        常见的行内元素:
        //标签可定义锚 //字体加粗 //大号字体效果 小号字体效果
        //换行 //斜体文本效果 //向网页中嵌入一副图画 //输入框 //创建单选或多选菜单 //组合文档中的行内元素 //定义下标文本//定义上标文本
        //定义表格中标准单元格 //定义表头单元格 <