更新完就跳槽系列之CSS篇吊打面试官

linbojue
• 阅读 10

第一部分:基础概念

  1. CSS 选择器优先级计算规则(权重计算) 面试官会问:"如果一个元素同时被多个规则匹配,谁生效?如果有 !important 呢?" 权重等级(由高到低):

!important:无敌的存在(破坏性,慎用)。 内联样式 (Inline styles):style="..." —— 权重计为 (1, 0, 0, 0)。 ID 选择器:#id —— 权重计为 (0, 1, 0, 0)。 类、伪类、属性选择器:.class, :hover, [type="text"] —— 权重计为 (0, 0, 1, 0)。 元素、伪元素选择器:div, ::before —— 权重计为 (0, 0, 0, 1)。 通配符 *、组合符 + > ~、逻辑伪类 :not():权重为 (0, 0, 0, 0)。

计算规则:

不进位制:权重是基于等级叠加的,即使 11 个类选择器也打不过 1 个 ID 选择器(在现代规范中,虽然技术上是 256 进制,但在逻辑理解上应视为不可跨级)。 后来居上:如果权重完全相同,则最后定义的样式生效。 继承属性:继承而来的样式权重为 0,甚至不如通配符。

  1. 盒模型(标准盒模型与 IE 盒模型) 面试官会问:"这两种盒模型在计算宽度时有什么区别?" 标准盒模型 (W3C Standard): box-sizing: content-box (默认)。

width = 内容宽度 (content)。 盒子实际占据空间 = width + padding + border + margin。

IE 盒模型 (Quirks Mode): box-sizing: border-box。

width = 内容 + padding + border。 盒子实际占据空间 = width + margin。

  1. box-sizing: border-box 的作用与影响 面试官会问:"为什么要全局设置 border-box?" 作用: 将 padding 和 border 绘制在已设定的 width 和 height 之内。 影响:

布局可预测性:给一个 width: 50% 的盒子加 padding 或 border,它不会撑破父元素。 响应式设计必备:在处理百分比布局时,它是唯一的救星。 开发效率:不再需要根据 padding 反向计算 width。

  1. 元素的 display 属性 面试官会问:"inline-block 为什么会有空隙?"

block:独占一行;宽度默认 100%;可设置宽高、上下左右 margin/padding。 inline:不独占一行;无法设置宽高;垂直方向的 margin/padding 不占据空间(不影响布局流)。 inline-block:像文本一样排列,但拥有盒模型属性。

坑:元素间会有 4px 左右的空隙。原因:HTML 中的换行符/空格被解析为文本。 解:父元素 font-size: 0 或去掉 HTML 换行。

none:完全移除,不占位,触发回流(Reflow)和重绘(Repaint)。

  1. 文档流(Normal Flow)的概念 面试官会问:"什么是脱离文档流?" 定义: 浏览器默认的排版方式。块级元素垂直排列,行内元素水平排列。 脱离文档流的方式:

float (半脱离:位置脱离,但文本会环绕)。 position: absolute (全脱离)。 position: fixed (全脱离)。

后果: 父元素高度塌陷(针对 float),后方的元素会无视脱离的元素占据其位置。 6. position 定位详解 面试官会问:"sticky 什么时候会失效?"

static:默认,遵循文档流。 relative:相对自身定位。不脱离文档流(原本的位置会被留空)。常用于做 absolute 的基准。 absolute:相对于最近的非 static 祖先元素定位。脱离文档流。 fixed:相对于浏览器视口 (Viewport) 定位。脱离文档流。 sticky (粘性定位):

基于用户滚动,在 relative 与 fixed 之间切换。 失效场景:1. 父元素设置了 overflow: hidden/auto/scroll;2. 未指定阈值(如 top: 0);3. 父元素高度等于 sticky 元素高度。

  1. 外边距折叠(Margin Collapsing) 面试官会问:"如何防止两个相邻 div 的 margin 合并?" 现象: 垂直方向上,两个相邻的块级元素的 margin 会取最大值,而非相加。 三种情况:

相邻兄弟元素。 父元素与第一个/最后一个子元素(且父元素没 border/padding)。 空的块级元素(自身上下 margin 折叠)。

解决方案(BFC): 给父元素加 overflow: hidden、border 或改用 padding。 8. z-index 与堆叠上下文 (Stacking Context) 面试官会问:"为什么我给子元素设置 z-index: 9999,它还是被隔壁的 z-index: 1 盖住了?" 核心逻辑: z-index 只在同一个堆叠上下文中比较。 如何产生堆叠上下文?

根元素 。 position 为 relative/absolute 且 z-index 不是 auto。 position: fixed/sticky。 现代触发方式:opacity 小于 1、transform 不为 none、filter 不为 none、flex/grid 子元素的 z-index 不为 auto。

层叠等级(从底向上):

背景/边框 负 z-index 块级盒子 浮动盒子 行内盒子 z-index: 0 / auto 正 z-index

  1. CSS 单位

px:绝对单位,物理像素。 em:相对于当前元素的字体大小(如果设置在 font-size 上,则相对于父元素)。 rem:相对于根元素 () 的字体大小。响应式首选。 %:

width/height:相对于父元素。 padding/margin:无论垂直还是水平,都相对于父元素的宽度(面试必考点)。 transform: translate:相对于自身。

vw/vh:视口宽高的 1%。

  1. !important 的用法与影响 用法: 在属性值后加 !important,强制最高优先级。 影响:

破坏性:打破了 CSS 的自然级联规则,导致调试困难。 难以覆盖:除非再用一个权重更高或同样带 !important 的规则。

最佳实践:

绝不要在全局 CSS 中使用。 绝不要在制作插件/组件库时使用。 仅在覆盖无法修改的内联样式或第三方库样式时作为最后手段。

总结: "CSS 布局的核心其实就是处理元素如何占据空间(盒模型)、如何定位(Position/Flex/Grid)以及如何相互影响(BFC/层叠上下文)。现代开发中,我们优先通过 box-sizing: border-box 规避计算坑位,通过 BFC 解决 margin 折叠,利用 rem 和 vw/vh 实现多端适配,并尽量避免 !important 以维护样式的鲁棒性。"

第二部分:核心布局系统

  1. Flexbox 布局:弹性盒模型 Flexbox 是目前应用最广的一维布局方案(按行或按列)。 容器属性 (Container)

display: flex / inline-flex:开启弹性布局。 flex-direction:决定主轴 (Main Axis) 方向(row, column)。 flex-wrap:换行方式(默认 nowrap,即便子元素超出也不换行,而是会被压缩)。 justify-content:主轴对齐方式。 align-items:交叉轴对齐方式(单行)。 align-content:多行在交叉轴上的对齐方式(针对换行后的整体)。

项目属性 (Items)

flex-grow:剩余空间放大比例(默认 0,不放大)。 flex-shrink:空间不足缩小比例(默认 1,自动缩小)。 flex-basis:在分配多余空间之前,项目占据的主轴空间(默认 auto)。

深入理解 flex: 1 的计算方式 面试官必问:flex: 1 代表什么?和 flex: auto 有什么区别?

flex: 1 是 flex: 1 1 0% 的简写。 flex: auto 是 flex: 1 1 auto 的简写。 区别点:在于 flex-basis。

如果是 0%:计算剩余空间时,不考虑元素内容本身的大小,强行平分。 如果是 auto:计算剩余空间时,先扣除元素内容的大小,只平分剩下的空间。

  1. Grid 布局:网格系统 Grid 是 CSS 唯一的二维布局方案,它将容器划分为"行"和"列"。 核心概念

fr (fraction):片段单位,代表网格容器中可用空间的一份。 auto-fit vs auto-fill:

auto-fill:尽可能多地填充列,即便列是空的。 auto-fit:会将空的列"折叠",让占位的列充满剩余空间。

显式网格 vs 隐式网格:

显式 (Explicit):通过 grid-template-columns/rows 定义好的轨道。 隐式 (Implicit):当项目超出了定义的轨道(比如定义了 2x2,但放了 5 个元素),浏览器自动生成的轨道。通过 grid-auto-rows 控制。

Grid 布局示例:自适应布局 css 体验AI代码助手 代码解读复制代码.container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; } /* 这行代码实现了:容器宽度足够时每列 200px 以上,不足时自动换行,且剩余空间平分。*/

  1. 传统布局:浮动与清除浮动 虽然现在少用,但这是考察"老兵"基本功的必考题。 浮动的本质: 最初是为了实现"文字环绕图片"。 带来的问题: 父元素高度塌陷(因为浮动元素脱离了文档流)。 清除浮动 (Clearfix):

BFC 法:给父元素 overflow: hidden(最简单)。 伪元素法(标准做法):

css 体验AI代码助手 代码解读复制代码.clearfix::after { content: ""; display: block; clear: both; }

  1. 水平垂直居中的多种方案 面试官会问:"你能写出几种居中方式?"

Flexbox (最推荐): display: flex; justify-content: center; align-items: center; Grid: display: grid; place-items: center; Absolute + Transform (未知子元素宽高): position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); Absolute + Margin: auto (已知宽高): position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto;

  1. 圣杯布局与双飞翼布局 这两种布局的目标一致:三栏布局,中间栏(Main)最先加载(在 HTML 中排在最前面),两侧宽度固定,中间自适应。 圣杯布局 (Holy Grail Layout)

原理:利用父元素的 padding 为左右侧留出空间,子元素全部 float: left,左右侧通过 relative 定位和负 margin 回位。 缺点:当中间栏宽度小于侧边栏时,布局会乱。

双飞翼布局 (Double Wing Layout)

原理:源自淘宝前端团队。中间栏内部增加一个包裹层(inner),直接设置 margin: 0 200px 为左右侧留空。不需要 relative。 优点:结构更稳,不会因为宽度过小崩溃。

现代实现(Flex/Grid) 吊打点:不要再写 float 了。面试时说出:"在现代开发中,我会优先使用 Flex 或 Grid 实现,代码更简洁且语义化。" 6. 实战:左右两栏固定,中间自适应(且改变排序) 场景要求:HTML 结构中,Main 在最前(利于 SEO),但视觉上 Left 在左,Main 在中,Right 在右。 方案一:Flexbox (最简单) html 体验AI代码助手 代码解读复制代码

Main (First in DOM)

css 体验AI代码助手 代码解读复制代码.container { display: flex; } .content { flex: 1; order: 2; } /* order 控制视觉顺序 */ .left { width: 200px; order: 1; } .right { width: 200px; order: 3; }

方案二:Grid (最强大) css 体验AI代码助手 代码解读复制代码.container { display: grid; grid-template-columns: 200px 1fr 200px; grid-template-areas: "L M R"; } .left { grid-area: L; } .content { grid-area: M; } .right { grid-area: R; }

  1. 多列布局 (Multi-column) 类似报纸排版。

column-count:设置列数。 column-gap:列间距。 column-rule:列之间的分割线。

应用场景:瀑布流布局的简单替代方案(虽然顺序是垂直填充的)。 总结: "布局方案的选择取决于场景。对于一维对齐(如导航栏、均匀分布列表),Flexbox 是绝对的首选,特别是 flex: 1 的剩余空间分配算法非常灵活。对于二维复杂的结构,Grid 提供的 grid-template-areas 让 CSS 代码几乎变成了视觉原型图,极大降低了维护成本。至于圣杯和双飞翼,它们是浮动时代的智慧结晶,理解其负 margin 的运用有助于深入理解文档流,但在现代项目中,我会倾向于使用 order 属性或 Grid 区域来优雅地解决 DOM 顺序与视觉顺序不一致的问题。"

第三部分:视觉表现与样式

  1. CSS 变量(Custom Properties) 面试官会问:"CSS 变量和 Sass/Less 变量有什么区别?" 核心特性:

动态性:CSS 变量在运行时生效,可以通过 JavaScript 动态修改(el.style.setProperty('--color', 'red'));而 Sass 变量在编译时就确定了。 作用域:遵循层叠和继承规则。:root 中定义的是全局变量,在特定选择器内定义的是局部变量。 备用值:var(--name, #000),当变量未定义时可回退。

吊打点:提到"响应式主题切换"。无需重写几百行 CSS,只需修改 :root 下的变量值,全站样式瞬间改变。 2. background 复合属性与细节 面试官会问:"如何实现背景图不随页面滚动?" 复合顺序: background: color image repeat attachment position / size。注意 size 必须跟在 position 后面,并用 / 分隔。 关键子属性:

background-attachment: fixed:背景相对于视口固定(视差滚动效果的基础)。 background-clip:背景绘制区域。重点:text 值(搭配 -webkit- 前缀)可实现文字渐变色。 background-origin:背景图片绘制的起点(border-box, padding-box, content-box)。 多重背景:可以写多个 url(),用逗号分隔,第一个写在最上面。

  1. 边框、轮廓与阴影

border:占据空间,影响盒模型。 outline (轮廓):不占据空间,不影响布局。常用于 focus 状态,对无障碍友好。 box-shadow:h-offset v-offset blur spread color inset。

性能坑:巨大的 blur(模糊)会消耗大量 GPU 算力,滚动页面时可能导致掉帧。 技巧:可以用多层阴影叠加实现极其逼真的材质感。

  1. 文本样式与排版 line-height:

单位区别:建议用无单位数值(如 1.5)。因为无单位数值会被继承为比例,而带单位(如 1.5em)会被继承为计算后的绝对像素值,导致子元素行高错乱。

文本截断(Ellipsis):

单行:overflow: hidden; white-space: nowrap; text-overflow: ellipsis; 多行:-webkit-line-clamp: 3; display: -webkit-box; -webkit-box-orient: vertical;(这是标准事实,虽然带前缀但最通用)。

  1. 过渡(Transition)与动画(Animation) 面试官会问:"这两者怎么选?怎么优化性能?"

Transition:状态 A 到状态 B 的简单补间(如 :hover)。需要触发源。 Animation:复杂的、多阶段的、可循环的(使用 @keyframes)。

性能优化(必考):

尽量只动 transform 和 opacity。 为什么?因为这两者在 CSS 渲染管线中属于 Composite(合成) 阶段,不触发 Reflow(回流)和 Repaint(重绘),性能极高。 will-change: transform:提前通知浏览器创建层,开启硬件加速。

  1. CSS 变换(Transform) 2D/3D

2D 操作:translate, scale, rotate, skew。 3D 操作:translateZ, rotateY 等。

核心细节:

perspective (透视):必须设在父元素上,才能看到 3D 的远近效果。 顺序影响:transform: rotate(45deg) translate(100px) 和反过来结果不同。因为坐标轴会随旋转而旋转。

  1. 滤镜(Filter)与混合模式(Mix-blend-mode)

filter:作用于元素自身。常用:blur()(毛玻璃基础)、grayscale()(全站变灰)、drop-shadow()(给不规则形状加阴影,比 box-shadow 聪明)。 mix-blend-mode:元素内容与下层背景的融合方式。

场景:白色背景的图片去掉背景(multiply),或者黑底白字的文字反色(difference)。

  1. clip-path 与 mask 面试官会问:"怎么做一个三角形或五角星?"

clip-path:裁剪路径。可以定义 polygon, circle 等。超出部分不可见且不响应点击事件。 mask (遮罩):类似 Photoshop 的蒙版。使用一张图片或渐变来控制透明度。常用于图标的动态变色或复杂的图片淡入效果。

  1. CSS 渐变(Gradients) 渐变不是图片,是浏览器动态生成的 Image。

linear-gradient:线性渐变。支持角度(45deg)或方向(to right)。 radial-gradient:径向渐变。 conic-gradient:锥形渐变。

神技:可以用锥形渐变几行代码写出一个饼图。

硬停止(Hard Stops):linear-gradient(#f00 50%, #00f 50%),通过设置相同的百分比,可以画出没有任何过渡的色块。

总结: "在处理 CSS 视觉表现时,我非常关注渲染性能。比如,我会优先使用 transform 代替 top/left 来实现位移,因为这能避开浏览器的布局阶段。对于复杂的交互,我倾向于利用 CSS 变量 结合 JS 来控制状态,这样能保持逻辑与样式的解耦。 此外,在处理特殊视觉需求时,我会考虑 clip-path 和 mask 的方案,这比传统的透明图片更具可扩展性且减小了请求体积。对于现代浏览器,mix-blend-mode 和 filter 能在无需 Canvas 的情况下实现非常炫酷的 UI 特效。"

第四部分:响应式与适配

  1. 响应式 vs 自适应 (Responsive vs. Adaptive) 面试官会问:"这两者有什么本质区别?"

响应式 (Responsive):一套代码,通过流式布局 (Fluid Grid) 和媒体查询,让布局在不同尺寸下"自动流动"。(如 Bootstrap)。 自适应 (Adaptive):为不同设备提供几套固定的模板。浏览器检测设备(UA 或尺寸)后加载对应的静态布局。

吊打点:现代开发中,两者往往结合使用。我们会用响应式处理细微的尺寸变化,用自适应逻辑处理差异巨大的交互体验(如 PC 端是悬停菜单,移动端是侧边栏)。 2. 媒体查询(@media)与移动优先 移动优先 (Mobile First): 使用 min-width。先写移动端样式,再向上叠加。

优点:代码更简洁(基础样式通常在小屏幕),对低性能设备更友好。

常用断点(避开特定机型,按设备类型):

< 576px:手机 576px ~ 768px:平板(竖屏) 768px ~ 992px:平板(横屏) 992px ~ 1200px:普通桌面显示器

1200px:大屏

  1. 视口 (Viewport) 元标签与视口单位 html 体验AI代码助手 代码解读复制代码

核心作用: 告诉浏览器,页面的逻辑宽度等于设备的物理宽度,并禁止浏览器自动缩放(默认情况下,移动端会假装自己是 980px 宽)。 单位进阶:

vw / vh:相对于视口。 vmax / vmin:相对于宽高中较大/较小的一个。在处理屏幕横竖屏旋转时,vmin 常用于确保图标不超出屏幕。

  1. 响应式图片(srcset, sizes, ) 面试官会问:"如何根据屏幕像素密度(DPR)加载不同图片?"

srcset:给浏览器一组图片源及其宽度(如 image-1x.jpg 1x, image-2x.jpg 2x)。 sizes:告诉浏览器图片在布局中占据的实际宽度。 标签:用于"美术指导(Art Direction)"。比如在 PC 端显示横图,在移动端裁剪为竖图。

html 体验AI代码助手 代码解读复制代码 更新完就跳槽系列之CSS篇吊打面试官

  1. 移动端 1 像素边框问题 面试官会问:"为什么 border: 1px 在 Retina 屏上看起来很粗?" 原因: CSS 像素是逻辑像素。在 DPR=2 的手机上,1px 的 CSS 像素等于 2px 的物理像素。 最佳方案(伪元素 + Scale): css 体验AI代码助手 代码解读复制代码.border-1px { position: relative; } .border-1px::after { content: ""; position: absolute; top: 0; left: 0; width: 200%; height: 200%; border: 1px solid #000; transform: scale(0.5); transform-origin: left top; }

  2. 横竖屏适配与安全区域 (Safe Area)

横竖屏查询:@media (orientation: landscape / portrait)。 安全区域(针对 iPhone 留海屏):

设置 viewport-fit=cover。 使用环境变量:padding-bottom: env(safe-area-inset-bottom);。

  1. 容器查询(@container) —— 2024年面试杀手锏 面试官会问:"除了媒体查询,还有什么能做自适应?" 媒体查询的局限性: 它是基于整个"视口"的。 容器查询 (Container Queries): 让组件根据其父容器的宽度来改变样式。 场景: 同一个侧边栏组件,放在侧边栏(窄)时显示垂直列表,放在中间区域(宽)时显示网格布局。 css 体验AI代码助手 代码解读复制代码.parent { container-type: inline-size; } @container (min-width: 400px) { .child { display: flex; } }

  2. CSS 层叠层(@layer) 作用:解决 CSS 权重战争。你可以定义不同的层级(如 base, theme, utilities),即便 base 里的选择器权重极高,也会被 utilities 里的样式覆盖。 优势:不再需要为了覆盖样式而疯狂加 !important。

  3. clamp(), min(), max() 函数 面试官会问:"不用媒体查询,如何让字体随屏幕变大而变大,但有上下限?"

clamp(min, preferred, max): font-size: clamp(1rem, 5vw, 2rem); 这行代码实现了:字体最小 1rem,最大 2rem,中间随视口宽度(5vw)动态变化。

min() 和 max():用于在两个值之间取极值,常用于设置响应式宽度上限:width: min(90%, 1200px);。

  1. 响应式排版(Responsive Typography) 技巧:使用 rem 结合 clamp()。 计算公式:通过设置 html { font-size: calc(16px + (24 - 16) * (100vw - 400px) / (1200 - 400)); } 这种线性增长公式,实现丝滑的字体过渡(虽然现在更推荐用 clamp)。

第五部分:性能与渲染

  1. CSS 选择器性能:为什么从右向左匹配? 面试官会问:"#nav ul li a 这个选择器,浏览器是怎么找元素的?" 底层原理: 浏览器引擎(如 WebKit 或 Gecko)在匹配选择器时,是从最右边的选择器(关键选择器,Key Selector)开始向左匹配的。 为什么?

效率更高:如果从左往右,浏览器需要先找到 #nav,再遍历其下所有的 ul,再遍历所有的 li……如果页面很大,匹配失败的成本极高。 从右往左,第一步就过滤掉了页面中绝大多数非 标签。对于剩下的 ,再去检查它的父级是否符合条件。这样匹配路径更短,性能损耗更低。

优化建议:

避免使用通配符 * 作为关键选择器。 减少层级嵌套(建议不超过 3 层)。 多用类名,少用标签名作为末尾选择器。

  1. 重排(Reflow/回流)与重绘(Repaint) 这是 CSS 性能最经典的话题,必须答出渲染流水线(Rendering Pipeline)。 重排 (Reflow):

定义:当元素的几何属性(宽、高、位置、布局等)改变时,浏览器需要重新计算元素在页面上的位置,并重新生成布局树(Layout Tree)。 触发场景:增删 DOM、修改 width/height/margin/padding、获取 offsetTop/getBoundingClientRect(会强行触发同步回流)。 代价:最高,会引发父元素甚至全页面的重新布局。

重绘 (Repaint):

定义:当元素的外观属性(颜色、背景色、阴影等)改变,但不影响布局时。 代价:较轻,不需要重新布局,但依然需要重新像素化填充。

核心结论: 重排必将引起重绘,重绘不一定引起重排。 3. 硬件加速(GPU 加速)与 will-change 面试官会问:"如何让动画不卡顿?" 分层(Layering)机制: 浏览器会将复杂的页面分成多个层。某些属性会让元素拥有独立的合成层(Compositing Layer)。 如何触发: transform: translateZ(0)、opacity、filter。 GPU 的作用: 这些层在 GPU 中直接进行纹理混合,不经过主线程的 Layout 和 Paint 阶段。 will-change: 告诉浏览器该元素即将变化,请提前为其创建合成层。 坑:不可滥用。每个合成层都占内存,层过多会导致内存飙升,反而变卡(甚至白屏)。 4. CSS 对首屏加载(FCP, LCP)的影响 CSS 是性能瓶颈:CSS 是阻塞渲染的资源。在 CSSOM 构建完成前,浏览器不会渲染页面。

FCP (First Contentful Paint):如果 CSS 文件过大或嵌套太深,FCP 会被显著推迟。 LCP (Largest Contentful Paint):核心图片(如 Banner)的样式加载慢,会导致 LCP 指标变差。

优化思路:精简 CSS,减少 @import(会增加请求链路深度)。 5. 关键 CSS(Critical CSS)提取 吊打点:谈谈如何处理"白屏时间"。 概念: 将页面首屏(折叠屏上方区域)所需的 CSS 提取出来,直接内联在 中,而剩下的全量 CSS 采用异步加载。 作用: 消除渲染阻塞请求,实现近乎瞬时的首屏呈现。 工具: 可以使用 Critical 或 Puppeteer 自动提取。 6. CSS 代码分割与异步加载 代码分割: 利用 Webpack/Vite,将不同路由的 CSS 拆分成独立文件,实现"按需加载"。 异步加载技巧: html 体验AI代码助手 代码解读复制代码

  1. CSS 优化最佳实践

减少嵌套:Sass/Less 嵌套不要超过 3 层,生成的 CSS 选择器更精简。 压缩:使用 CSSNano 等工具去除空格、注释。 复用(原子化思想):类似 Tailwind CSS 的思路,通过复用工具类减少重复的样式定义,从而减小 CSS 体积。

  1. 为什么 transform 和 opacity 做动画最高效? 这是"吊打面试官"的核心知识点。 渲染流水线:

JavaScript / CSS (修改样式) Style (计算样式) Layout (计算几何信息 - 重排) Paint (绘制像素 - 重绘) Composite (图层合成 - 合成阶段)

原因: 修改 left/top 会触发 Layout;修改 background-color 会触发 Paint。 但是:修改 transform 和 opacity 直接跳过了 Layout 和 Paint,只运行 Composite 阶段。这一步在 GPU 中完成,主线程被完全释放,因此即便 CPU 忙碌,动画依然丝滑(60FPS)。 总结: "对于 CSS 性能,我从加载和渲染两个维度考虑。 在加载阶段,我会通过 Critical CSS 提取和 媒体查询异步加载 来优化 FCP,确保页面能尽快渲染出内容。 在渲染阶段,我深度关注浏览器的渲染管线。我会尽量使用 transform 和 opacity 来代替 top/left 做位移和显隐动画,因为它们能避开 Layout 和 Paint,直接在 Composite 阶段 由 GPU 完成。 同时,我会警惕合成层爆炸问题,合理使用 will-change 而不滥用。在编写选择器时,我会考虑到浏览器从右向左匹配的特性,避免使用通配符或过深的嵌套,从而减轻 Style 计算的负担。"

第六部分:架构与工程化

  1. BEM 命名方法论 面试官会问:"为什么要用这么长的命名?block__element--modifier 有什么好处?" 核心结构:

Block (块):独立、有意义的实体(如 .menu)。 Element (元素):块的一部分,不能脱离块独立存在(如 .menu__item)。 Modifier (修饰符):改变状态或外观(如 .menu__item--active)。

深层价值:

解决权重战争:BEM 提倡几乎所有的选择器都只有一个类名,这使得优先级非常平整,不会出现 .nav ul li a 这种难以覆盖的高权重选择器。 自解释性:从类名就能看出组件结构,降低维护成本。 防止样式污染:通过长命名空间规避全局冲突。

吊打点:提到 "BEM 并不建议嵌套三层以上"。例如不要写 .block__el1__el2,而应提取为新的 Block 或扁平化为 .block__el2。 2. CSS Modules 面试官会问:"CSS Modules 是如何实现局部作用域的?" 原理: 在构建阶段(Webpack/Vite),将 CSS 类名哈希化。

源文件:.title { color: red; } 编译后:.title_x5a8j { color: red; }

优点:

彻底解决命名冲突:每个文件都是独立作用域。 显式依赖:在 JS 中通过 import styles from './style.module.css' 引入,代码引用关系清晰。

缺陷: 变量共享不方便(需要 :export 语法),类名动态拼接略显繁琐。 3. CSS-in-JS (Styled-components, Emotion) 面试官会问:"为什么 React 社区喜欢 CSS-in-JS?它有什么副作用?" 设计哲学: All in JS。样式是组件逻辑的一部分,利用 JS 的变量、函数和逻辑来增强 CSS。 优点:

动态样式极致灵活:直接根据 props 计算样式()。 自动按需加载:只有组件被渲染,样式才会被注入到 标签。 零配置作用域:天然不存在冲突。

缺点(吊打点):

运行时开销 (Runtime Overhead):在浏览器端实时解析 JS 并生成 CSS 插入 DOM,在大规模渲染时会导致掉帧。 Bundle 体积:需要引入额外的 JS 库(如 styled-components 库本身约 12KB)。 无法缓存 CSS 文件:样式随 JS 逻辑一起加载,无法利用浏览器的 CSS 独立缓存机制。

  1. 原子化 CSS (Tailwind CSS) 面试官会问:"Tailwind 会让 HTML 变得很乱,为什么它还会流行?" 哲学: Utility-First(实用优先)。不再写 .card,而是写 class="p-4 bg-white shadow-md rounded-lg"。 核心优势:

不再为起名烦恼:减少了大脑开销。 CSS 体积不再膨胀:无论页面多复杂,CSS 总量会趋于稳定(因为常用的 utility 类是有限的)。 极致的开发速度:无需在 JS 和 CSS 文件间反复切换。

底层机制: 使用 PurgeCSS 扫描 HTML/JS,只打包你用过的类,生产环境体积极小。 思考:虽然 HTML 看起来乱,但它解决了样式冗余和死代码问题。 5. CSS 预处理器(Sass, Less)与现代 CSS 面试官会问:"现代 CSS 已经支持变量和嵌套了,Sass 还有必要吗?" Sass/Less 的核心价值:

复杂的逻辑运算:@for, @if, @each 循环,Mixins 函数计算。 模块化管理:@use 和 @import 将样式拆分并合并。

现状对比:

Native CSS Nesting(原生嵌套)现已得到主流浏览器支持。 CSS Variables(原生变量)是动态的(运行时),而 Sass 变量是静态的(编译时)。

结论: 对于简单的嵌套和变量,现代 CSS 足够;对于大型 UI 库或需要复杂逻辑的系统,Sass 依然不可替代。 6. PostCSS 的作用与常见插件 面试官会问:"PostCSS 是不是就是为了加浏览器前缀的?" 定义: PostCSS 是 CSS 界的 Babel。它本身不做什么,而是提供一个插件系统来处理 CSS。 常用插件(展现深度):

Autoprefixer:自动添加 -webkit- 等前缀。 PostCSS Preset Env:让你现在就能用未来的 CSS 语法(类似 Babel 转换 JS)。 cssnano:压缩 CSS,优化代码。 px-to-viewport / px2rem:移动端适配插件。

工作原理: CSS → AST (抽象语法树) → 插件处理 → 字符串。 💡 综合对比:架构如何选型? 如果你是技术负责人,你会怎么选?(这是面试官最想听到的"大局观")

中小型项目 / 快速迭代:选 Tailwind CSS。开发速度快,体积小,维护成本低。 大型企业级后台 / 复杂 UI 组件库:选 Sass + CSS Modules 或 BEM。结构清晰,逻辑复用性强。 追求极致动态化 / 强交互设计系统:选 Styled-components。虽然有运行时损耗,但开发体验和动态响应最好。

💡 吊打面试官的总结话术: "CSS 工程化本质上是在 '隔离性'、'复用性'、'灵活性' 和 '性能' 之间寻找平衡。 BEM 是规范上的约束,它用低成本解决了命名冲突; CSS Modules 是工具上的约束,它实现了真正的作用域隔离; CSS-in-JS 将 CSS 逻辑化,特别适合复杂状态驱动的 UI,虽然牺牲了一点点运行时性能; 而 Tailwind CSS 则是一种范式转移,它通过原子化从根本上解决了 CSS 代码膨胀问题。 在实际架构中,我会结合 PostCSS 来保证兼容性,并根据团队规模和项目生命周期,在 'Sass + CSS Modules'(稳健型)和 'Tailwind'(敏捷型)之间做抉择。同时,我也在关注现代 CSS 的发展,如原生嵌套和容器查询,以减少对预处理器的依赖。"

第七部分:深度思考与开放题 这是 CSS 知识体系的最后一块拼图——底层机制与架构设计。在高级前端面试中,面试官不仅看你能不能画出页面,更看重你对 CSS 设计哲学(Design Philosophy) 的理解以及在大规模工程中的博弈能力。

  1. CSS 的层叠(Cascade)具体规则 面试官会问:"CSS 的 C 代表 Cascade(层叠),请问它是按照什么顺序决定最终样式的?" 层叠是 CSS 的核心灵魂。当多个样式规则指向同一个元素时,浏览器会遵循以下优先级顺序(由高到低): 来源与重要性 (Origin & Importance):

User Agent !important (浏览器默认样式的强制项,极少见) User !important (用户自定义设置的强制项) Author !important (开发者写的 !important) Author (开发者写的普通 CSS) User (用户自定义设置) User Agent (浏览器默认样式,如 div 是 block)

层叠层 (Cascade Layers - @layer): 这是 CSS2022 引入的新特性。在同一个来源内,后声明的 @layer 优先级更高。 注意:未联网到层(Unlayered)的样式 优先级高于所有定义在 @layer 里的样式。 选择器权重 (Specificity): (Inline, ID, Class/Attribute, Element)。 出现顺序 (Order of Appearance): 权重相同时,"后来居上"。 吊打点:很多候选人只知道"权重",但不知道 "来源" 和 "层叠层"。如果你能解释清楚 @layer 如何解决第三方库样式覆盖问题,面试官会觉得你紧跟前沿规范。 2. CSS 继承(Inheritance)机制 面试官会问:"哪些属性可以继承?如何强制一个不继承的属性继承?" 默认继承的属性: 主要是文本相关的。

font-family, font-size, color, line-height, text-align, visibility, cursor 等。

默认不继承的属性: 主要是盒模型和布局相关的。

margin, padding, border, width/height, position, display, background 等。(想象一下,如果 border 能继承,父元素加个边框,所有子元素全带边框,那页面就乱套了)。

控制继承的四个关键字:

inherit:强制继承父元素的值。 initial:恢复为该属性的浏览器默认值(初始值)。 unset(高级):如果是默认继承的属性,效果同 inherit;如果是非继承属性,效果同 initial。 revert:回退到用户代理(浏览器)定义的样式。

  1. 如何组织大型项目的 CSS 代码? 面试官会问:"当项目有几百个组件时,你怎么保证 CSS 不失控?" 这考察的是架构思想。你可以从以下维度回答: 方法论 (Methodologies):

ITCSS (Inverted Triangle CSS):倒三角架构。将 CSS 按从全局到具体的顺序分为 7 层:Settings -> Tools -> Generic -> Elements -> Objects -> Components -> Trumps。这能极好地控制样式流向和权重变化。 BEM:通过严格的命名规范确保组件独立性。

工程化手段:

CSS Modules:从工具层面实现样式私有化,杜绝全局污染。 Design Tokens:将颜色、间距、字号抽离为变量(CSS Variables 或 Sass Variables),实现"一处修改,全站生效"。 按需加载:通过代码分割(Code Splitting)让每个页面只加载自己需要的 CSS 模块。

吊打点:提到 "样式死代码消除(Purge/Unused CSS)" 和 "原子化 CSS(Tailwind)" 的结合。大型项目最怕 CSS 只增不减,解释你如何通过自动化工具发现并清理废弃样式。 4. 如何处理 CSS 样式冲突? 面试官会问:"当你引入一个第三方库,它的样式把你的页面搞乱了,你怎么办?" 这是一个非常现实的博弈问题。你可以给出"组合拳"方案: 方案一:提高自身权重(权宜之计)。 增加一个父级 ID 或类名来提升权重。 方案二:使用 CSS Modules / Shadow DOM(从物理上隔离)。 如果项目支持 Web Components,使用 Shadow DOM 可以实现完美的样式真空隔离,外部样式绝对进不来。 方案三:利用 @layer 层叠层(最优雅方案)。 将第三方库的样式包裹在 @layer library 中,将自己的业务样式包裹在 @layer base 中。通过声明层级顺序,确保业务层永远覆盖库层,即便你的权重比它低。 方案四:样式重置 (Reset/Normalize)。 在项目入口处统一浏览器差异,确保基准线一致。 💡 总结:深度思考的深度在哪里? 面试官问这些开放题,是在看你的 "防御性编程" 意识。

初级开发者:见招拆招,样式冲突了就加 !important。 中级开发者:懂得用 BEM 或 CSS Modules 规避问题。 高级/资深开发者:

会考虑 "级联流" 的可预测性(Predictability)。 会考虑 "样式系统的伸缩性"(Scalability)。 会利用最新的 W3C 规范(如层叠层、容器查询)从底层架构上消灭冲突。

作者:豆苗学前端 链接:https://juejin.cn/post/7598104596779368494 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。北京 成都​

http://zzzcffp.wikidot.com/

http://whzcffp.wikidot.com/

http://cszcffp.wikidot.com/

http://szzcffp.wikidot.com/

http://gzzcffp.wikidot.com/

http://nnzcffp.wikidot.com/

海口

http://gyzcffp.wikidot.com/

http://kmzcffp.wikidot.com/

http://xazcffp.wikidot.com/

http://lzzcffp.wikidot.com/

http://wlmqzcffp.wikidot.com/

http://qdzcffp.wikidot.com/

http://hhhtzcffp.wikidot.com/

https://infogram.com/9862pdf-1hnq41opz805p23

https://infogram.com/9862pdf-1hxj48mqegpv52v

https://infogram.com/9862pdf-1h0r6rzw5yp8w4e

https://infogram.com/9862pdf-1hmr6g8jzx7lz2n

https://infogram.com/9862pdf-1h9j6q75k9go54g

https://infogram.com/9862pdf-1hnq41opz80ek23

https://infogram.com/9862pdf-1hnp27eqydmdn4g

https://infogram.com/9862pdf-1hxj48mqegpeq2v

https://infogram.com/9862pdf-1h0n25oplqo8l4p

https://infogram.com/9862pdf-1h1749wqmgz1q2z

https://infogram.com/9862pdf-1hnp27eqyrd9y4g

https://infogram.com/9862pdf-1h984wv1drd3z2p

https://infogram.com/9862pdf-1hmr6g8jzrz8z2n

https://infogram.com/9862pdf-1h9j6q75kekj54g

https://infogram.com/9862pdf-1h7v4pd08y8x84k

https://infogram.com/9862pdf-1hxj48mqedewq2v

https://infogram.com/9862pdf-1hmr6g8jzrzno2n

https://infogram.com/9862pdf-1h1749wqmgmgq2z

https://infogram.com/9862pdf-1h984wv1drkoz2p

https://infogram.com/9862pdf-1h0n25oplv1zz4p

https://infogram.com/9862pdf-1h9j6q75kelx54g

https://infogram.com/9862pdf-1hnq41opzer1k23

https://infogram.com/9862pdf-1hxj48mqedlqq2v

https://infogram.com/9862pdf-1hmr6g8jzrvro2n

https://infogram.com/9862pdf-1h0n25oplv1ll4p

https://infogram.com/9862pdf-1h9j6q75kelnv4g

https://infogram.com/9862pdf-1hnq41opzervp23

https://infogram.com/9862pdf-1hnp27eqyr7wy4g

https://infogram.com/9862pdf-1h984wv1drmvz2p

https://infogram.com/9862pdf-1hmr6g8jzr0wz2n

https://infogram.com/9862pdf-1h0n25oplvndz4p

https://infogram.com/9862pdf-1hxj48mqed90q2v

https://infogram.com/9862pdf-1h984wv1drmgd2p

https://infogram.com/9862pdf-1h0r6rzw5m7ml4e

https://infogram.com/9862pdf-1h1749wqmgymq2z

https://infogram.com/9862pdf-1h9j6q75kenzv4g

https://infogram.com/9862pdf-1hnq41opzed7p23

https://infogram.com/9862pdf-1hnp27eqyr93y4g

https://infogram.com/9862pdf-1h984wv1dryjz2p

https://infogram.com/9862pdf-1hmr6g8jzr51z2n

https://infogram.com/9862pdf-1h1749wqmgenl2z

https://infogram.com/9862pdf-1h9j6q75kez854g

https://infogram.com/9862pdf-1h7v4pd08ygk84k

https://infogram.com/9862pdf-1hxj48mqedyjq2v

https://infogram.com/9862pdf-1h984wv1dry7d2p

https://infogram.com/9862pdf-1h0n25oplv7nl4p

https://infogram.com/9862pdf-1hnq41opzevkp23

https://infogram.com/9862pdf-1hxj48mqedk352v

https://infogram.com/9862pdf-1h0r6rzw5mn5l4e

https://infogram.com/9862pdf-1h1749wqmg5yq2z

https://infogram.com/9862pdf-1h9j6q75ke13v4g

https://infogram.com/9862pdf-1hnq41opze70p23

https://infogram.com/9862pdf-1h0r6rzw5mjvw4e

https://infogram.com/9862pdf-1h0n25oplv59z4p

https://infogram.com/9862pdf-1hnq41opze7jk23

https://infogram.com/9862pdf-1hnp27eqyrwgn4g

https://infogram.com/9862pdf-1hxj48mqedxdq2v

https://infogram.com/9862pdf-1h0r6rzw5mj9l4e

https://infogram.com/9862pdf-1h7v4pd08lnwj4k

https://infogram.com/9862pdf-1hnq41opz8kop23

https://infogram.com/9862pdf-1hnp27eqyd3ky4g

https://infogram.com/9862pdf-1hxj48mqeg5o52v

https://infogram.com/9862pdf-1h984wv1d53zz2p

https://infogram.com/9862pdf-1hmr6g8jzxdyz2n

https://infogram.com/9862pdf-1h1749wqmzl8l2z

https://infogram.com/9862pdf-1h7v4pd08lnv84k

https://infogram.com/9862pdf-1hxj48mqeg5gq2v

https://infogram.com/9862pdf-1hmr6g8jzxd5o2n

https://dribbble.com/zhanqiu4/collections/7730381

https://dribbble.com/zhanqiu4/collections/7730382

https://dribbble.com/zhanqiu4/collections/7730383

https://dribbble.com/zhanqiu4/collections/7730384

https://dribbble.com/zhanqiu4/collections/7730385

https://dribbble.com/zhanqiu4/collections/7730386

https://dribbble.com/zhanqiu4/collections/7730387

https://dribbble.com/zhanqiu4/collections/7730388

https://dribbble.com/zhanqiu4/collections/7730389

https://dribbble.com/zhanqiu4/collections/7730390

https://dribbble.com/zhanqiu4/collections/7730394

https://dribbble.com/zhanqiu4/collections/7730395

https://dribbble.com/zhanqiu4/collections/7730393

https://dribbble.com/zhanqiu5/collections/7730415

https://dribbble.com/zhanqiu5/collections/7730414

https://dribbble.com/zhanqiu5/collections/7730413

https://dribbble.com/zhanqiu5/collections/7730412

https://dribbble.com/zhanqiu5/collections/7730411

https://dribbble.com/zhanqiu5/collections/7730409

https://dribbble.com/zhanqiu5/collections/7730408

https://dribbble.com/zhanqiu5/collections/7730406

https://dribbble.com/zhanqiu5/collections/7730405

https://dribbble.com/zhanqiu5/collections/7730404

https://dribbble.com/zhanqiu5/collections/7730403

https://dribbble.com/zhanqiu5/collections/7730402

https://dribbble.com/zhanqiu5/collections/7730401

https://dribbble.com/zhanqiu5/collections/7730400

https://infogram.com/9862pdf-1h9j6q75k955v4g

https://infogram.com/9862pdf-1h0n25oplqp5z4p

https://infogram.com/9862pdf-1h7v4pd08lvw84k

https://infogram.com/9862pdf-1hnp27eqyd05n4g

https://infogram.com/9862pdf-1h984wv1d5wzd2p

https://infogram.com/9862pdf-1h0r6rzw5yo8l4e

https://infogram.com/9862pdf-1h1749wqmz08q2z

https://infogram.com/9862pdf-1hnq41opz8ymp23

https://infogram.com/9862pdf-1h1749wqmz0pl2z

https://infogram.com/9862pdf-1h7v4pd08lqd84k

https://infogram.com/9862pdf-1hnp27eqdjm7n4g

https://infogram.com/9862pdf-1h0r6rzwyqpjl4e

https://infogram.com/9862pdf-1h0n25opqjool4p

https://infogram.com/9862pdf-1hxj48mqgjmn52v

https://infogram.com/9862pdf-1h1749wqzjwjl2z

https://infogram.com/9862pdf-1h9j6q759q7e54g

https://infogram.com/9862pdf-1h984wv15gved2p

https://infogram.com/9862pdf-1h0n25opqjkkl4p

https://infogram.com/9862pdf-1h9j6q759q0pv4g

https://infogram.com/9862pdf-1hnp27eqdjkxy4g

https://infogram.com/9862pdf-1h0n25opqj80z4p

https://infogram.com/9862pdf-1h7v4pd0lqn584k

https://infogram.com/9862pdf-1hnp27eqdj3yn4g

https://infogram.com/9862pdf-1h984wv15g3md2p

https://infogram.com/9862pdf-1h1749wqzjvlq2z

https://infogram.com/9862pdf-1h0n25opqjyyl4p

https://infogram.com/9862pdf-1h7v4pd0lqw9j4k

https://infogram.com/9862pdf-1hxj48mqgjpr52v

https://infogram.com/9862pdf-1h0r6rzwyqpkw4e

https://infogram.com/9862pdf-1h1749wqzjv0l2z

https://infogram.com/untitled-1h0n25opq07el4p

https://infogram.com/untitled-1hnq41op8yvop23

https://infogram.com/untitled-1hnp27eqd08ky4g

https://infogram.com/untitled-1h1749wqz058l2z

https://infogram.com/untitled-1h1749wqz058l2z

https://infogram.com/9862pdf-1h7v4pd0lvoq84k

https://infogram.com/9862pdf-1h984wv15w9kd2p

https://infogram.com/9862pdf-1h9j6q759qv7v4g

https://infogram.com/untitled-1hnq41op8jk9p23

https://infogram.com/9862pdf-1hxj48mqgj5152v

https://infogram.com/untitled-1h0r6rzwyo93w4e

https://infogram.com/untitled-1h9j6q759ol1v4g

https://infogram.com/untitled-1h0r6rzwyo7ew4e

https://infogram.com/microsoft-office-word-2007-docx-1h7v4pd0lv1r84k

https://infogram.com/untitled-1hxj48mqg09zq2v

https://infogram.com/untitled-1h9j6q759on3v4g

https://infogram.com/untitled-1h984wv15wyqz2p

https://infogram.com/untitled-1h0r6rzwyo1vw4e

https://infogram.com/untitled-1h0n25opq079z4p

https://infogram.com/untitled-1h7v4pd0lvg084k

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
菜园前端 菜园前端
2年前
考考你CSS的选择器权重
原文链接:选择器权重选择器权重划分代表有多个选择器同时选中同一个元素时,应该以谁的为准,这里就会涉及到权重的问题。现实生活举例假设你的好朋友小明和路人小红同时掉水里,你先救谁?那你可能会先救小明,因为小明的优先级/权重比较高。基础案例在同一层级下同一层级代
Stella981 Stella981
4年前
Less 嵌套
本节我们学习Less中的嵌套,嵌套应该很容易理解,HTML语言中就支持标签的嵌套。我们在使用CSS时,如果想要为多层嵌套的元素设置样式,要么给元素加上一个类选择器或ID选择器,要么使用后代选择器。例如:.xkd{fontsize:14px;}.xkdp{lineheight:25
Stella981 Stella981
4年前
Sass @media指令
本节我们学习Sass中的@media指令,@media指令用于设置样式规则到不同的媒体类型,这和CSS的使用规则差不多,但是它还有一点不同,就是@media指令可以嵌套在Sass选择器中。有点类似于JS冒泡功能,它会冒泡到样式表的顶层。@media指令的使用示例:.xkd{
Wesley13 Wesley13
4年前
CSS基本语法及页面引用
css基本语法及页面引用(1)css基本语法css的定义方法是:选择器{属性:值;属性:值;属性:值;}选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值。代码示例:/css注释ctrlshift"/"/d
Wesley13 Wesley13
4年前
CSS基本用法介绍
CSS介绍css定义如何显示HTML元素.当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染).CSS语法css实列每个CSS样式由两个组成部分:选择器和声明。声明又包括属性和属性值。每个声明之后用分号结束。css注释/这是注释/CSS的几种引入方
Stella981 Stella981
4年前
Nepxion Discovery 5.4.2 发布
发布日志版本更新:升级SpringBoot到2.1.9.RELEASE服务端更新:增加服务本身的权重路由修复叠加执行权重规则和版本区域策略会失效的Bug修复DiscoveryEnabledStrategy中apply方法执行两次的Bug
Stella981 Stella981
4年前
Sass
嵌套规则(NestedRules)Sass允许将一套CSS样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器mainp{color:00ff00;width:97%;.redbox{
Wesley13 Wesley13
4年前
JS和CSS加载(渲染)机制不同
一、结论CSS可以在页面加载完成后随时渲染。举个例子:通过js给某个元素加一个id或者css,只要这个id或者css有对应的样式,此元素的样式就会自动生效。JS不可以在页面加载完成后生效。最明显的例子就是使用EasyUI的时候,iframe中哪些样式无效(EasyUi是依靠JS进行样式处理的,所以无法运行JS,那么样式也就无法设置。简单点说
Stella981 Stella981
4年前
CSS前端经典面试题及解析——小白入门必备
1.CSS选择器的优先级是如何计算的?浏览器通过优先级规则,判断元素展示哪些样式。优先级通过4个维度指标确定,我们假定以a、b、c、d命名,分别代表以下含义:1.a表示是否使用内联样式(inlinestyle)。如果使用,a为1,否则为0。2.b表示ID选择器的数量。3.c表示类选择器、属性