Doraemon Starry Sky Backdrop
dorabighead Avatar
dorabighead
首页 / 专栏文章 / CSS宝典
前端学习 作者: Dora

CSS宝典

Core Summary 导读概览

今日小哆啦提笔,将闭关期间整理的CSS宝典略作总结,与诸位共赏。此番分享,虽不敢言妙笔生花,但聊胜于空谈胡诌,且看能否在欢笑中助尔等拨开前端迷雾!

小哆啦闭关修炼已久,潜心攻读专业秘技,方才下山考研本欲大展宏图,怎奈山河虽壮志难酬,终是觉察考研无望。思来想去,不若弃考研之念,重拾敲代码之道,复盘前端奇术,以备闯荡职场江湖。 今日小哆啦提笔,将闭关期间整理的CSS宝典略作总结,与诸位共赏。此番分享,虽不敢言妙笔生花,但聊胜于空谈胡诌,且看能否在欢笑中助尔等拨开前端迷雾!

1、说一说你对盒模型的理解

盒模型是前端布局的基础概念,它描述了 HTML 元素的结构和占用的空间,包括内容区(Content)、内边距(Padding)、边框(Border)和外边距(Margin)。在标准盒模型中,widthheight 仅指内容区的大小,而元素的总宽度和高度需要加上内边距、边框和外边距。而在 IE 盒模型中,widthheight 包括内容、内边距和边框的总和,通过设置 box-sizing 属性可以切换盒模型模式。比表:

对比项 标准盒模型 (content-box) IE 盒模型 (border-box)
定义 widthheight 只包含内容区的大小。 widthheight 包含内容区、内边距和边框的总和。
总宽度计算 内容宽度 + 左右内边距 + 左右边框 直接等于 width,内容宽度会减去内边距和边框的宽度。
总高度计算 内容高度 + 上下内边距 + 上下边框 直接等于 height,内容高度会减去内边距和边框的高度。
默认模式 现代浏览器的默认盒模型模式。 早期 IE 浏览器的默认盒模型模式。
设置方式 使用 box-sizing: content-box; 使用 box-sizing: border-box;
适用场景 需要明确内容区域的大小,常用于文本和图片内容布局。 更易于控制元素的总宽度和总高度,适合复杂布局场景。

2、css所有选择器及其优先级、使用场景,那些可以继承、如何运用@规则

CSS 选择器及优先级
选择器类型 示例 描述 优先级 使用场景
通配选择器 * 选中所有元素 0,0,0,0 全局样式重置,如清除默认边距。
元素选择器 h1, p 选中指定类型的 HTML 元素 0,0,0,1 为特定 HTML 标签设置默认样式。
类选择器 .class 选中具有指定类名的元素 0,0,1,0 为特定类型的组件或区域设置样式。
ID 选择器 #id 选中具有指定 ID 的元素 0,1,0,0 独立样式设置,如页面唯一模块的布局。
属性选择器 [type="text"] 选中具有指定属性的元素 0,0,1,0 表单控件样式、状态样式的设置。
伪类选择器 :hover, :nth-child 选中元素特定状态 0,0,1,0 动态交互样式,列表项的奇偶样式设置。
伪元素选择器 ::before, ::after 为元素插入内容 0,0,1,0 设置修饰性内容,如装饰图标、背景效果。
组合选择器 div p, div > p 选中特定父子或兄弟关系的元素 根据组成选择器的优先级计算 结构化样式设置,如特定容器内的子元素样式。
群组选择器 h1, h2, h3 同时选中多个不同类型的元素 根据每个选择器独立计算 简化代码,为多个类型元素设置相同样式。

优先级规则

  • 行内样式:1000,如 style="color: red;"
  • ID 选择器:0100
  • 类、伪类、属性选择器:0010
  • 元素、伪元素选择器:0001
  • 通配选择器、继承样式优先级最低。

优先级冲突解决

  • 后定义的样式覆盖之前的。
  • 使用 !important 提升优先级(慎用)。

哪些样式可以继承

可继承的属性

  • 文本属性color, font, letter-spacing, line-height, visibility
  • 列表属性list-style

不可继承的属性(默认)

  • 盒模型相关margin, padding, border, width, height
  • 定位和显示position, display, top, left

如何强制继承 使用 inherit 明确指定子元素继承父元素属性:

css复制代码div {
  color: blue;
}
p {
  color: inherit; /* 子元素继承父元素的 color 属性 */
}

CSS @规则的运用

CSS 的 @规则 是一组用于条件控制、引入外部资源或定义关键区域的声明。

@规则 示例 作用 使用场景
@import @import "style.css"; 引入外部 CSS 文件 分离样式文件,模块化管理。
@media @media (max-width: 768px) {...} 响应式设计,按条件加载样式 移动端与桌面端样式分离。
@keyframes @keyframes slide { ... } 定义动画关键帧 定制动画效果。
@font-face @font-face { ... } 定义自定义字体 使用外部字体文件。
@supports @supports (display: grid) {...} 检测浏览器是否支持某些样式特性 渐进增强策略,根据浏览器支持情况加载新特性样式。
@page @page { margin: 1cm; } 设置打印页面样式 打印优化。
@namespace @namespace svg "http://www.w3.org/..."; 定义命名空间 区分不同 XML 命名空间样式。

使用场景总结

  • 选择器选择场景:根据优先级和具体需求选择合适的选择器组合,避免过度嵌套提升性能。
  • 继承场景:文本样式继承优化全局一致性;强制继承或覆盖实现细化定制。
  • @规则应用场景:响应式设计(@media)、动画效果(@keyframes)、跨平台字体支持(@font-face)。

3、CSS伪类和伪元素有哪些,它们的区别和实际应用

定义与区别
特性 伪类 (:pseudo-class) 伪元素 (::pseudo-element)
定义 表示元素的某种特定状态,用于选择特定条件下的元素。 表示元素的一部分内容,用于创建和样式化虚拟元素。
语法 单冒号 : 开头(如 :hover)。 双冒号 :: 开头(如 ::before)。
应用范围 选择已有的元素。 作用于元素的子内容或生成虚拟内容。
W3C 推荐用法 单冒号也可用于伪元素(兼容性考虑),但推荐用双冒号。 双冒号区分伪类和伪元素。

常用伪类及应用

伪类表示元素状态,通常用于用户交互、位置选择等场景。

伪类 示例 描述 应用场景
:hover a:hover {} 鼠标悬停在元素上时触发 按钮交互、超链接悬停效果。
:focus input:focus {} 元素获得焦点时触发 表单聚焦高亮。
:nth-child(n) li:nth-child(2n) {} 选中第 n 个子元素(从 1 开始计数) 列表项奇偶样式区分。
:first-child p:first-child {} 选中父元素的第一个子元素 特殊样式,如列表首项突出显示。
:last-child p:last-child {} 选中父元素的最后一个子元素 表单最后一项间距调整。
:not(selector) div:not(.active) {} 选中不符合选择器条件的元素 排除特定样式设置。
:disabled button:disabled {} 选中不可用状态的元素 禁用按钮灰化处理。
:checked input:checked {} 选中复选框或单选框时触发 表单控件状态高亮。

常用伪元素及应用

伪元素用于生成和操作虚拟内容,如装饰性内容和文本样式化。

伪元素 示例 描述 应用场景
::before div::before {} 在元素内容前插入内容 添加装饰图标或修饰文本。
::after div::after {} 在元素内容后插入内容 添加尾部修饰符号或清除浮动。
::first-line p::first-line {} 选中元素第一行文本 文本段落首行样式调整,如首行缩进或高亮显示。
::first-letter p::first-letter {} 选中元素首字母 段落首字母放大、加粗、设为小型大写字母等排版设计。
::selection ::selection {} 选中用户高亮的文本内容 设置用户文本选择时的背景色和文字颜色。
::marker li::marker {} 定义列表项的标记样式(仅用于列表元素) 自定义有序或无序列表的标记外观。
::placeholder input::placeholder {} 定义表单控件占位符文本样式 表单提示文字设计。

实际应用场景
  • 伪类

    • 表单交互input:focus { border: 1px solid blue; } 用于高亮聚焦的输入框,提升用户体验。
    • 导航菜单a:hover { color: red; } 鼠标悬停在菜单项时改变文字颜色,提供交互反馈。
  • 伪元素

    • 装饰性内容div::before { content: '🌟'; } 在元素前添加星标作为修饰。

    • 清除浮动

      .clearfix::after {
        content: '';
        display: block;
        clear: both;
      }
      

      解决浮动布局问题,确保父元素高度自动适配子元素。


注意

  • 伪类关注元素状态,通过条件控制元素样式,用于交互逻辑。
  • 伪元素作用于内容本身,生成虚拟元素或装饰性内容,用于增强页面设计效果。

4、CSS几种定位的规则、定位参照物、对文档流的影响,如何选择最好的定位方式,雪碧图实现原理


定位规则及参照物
定位方式 规则及表现 定位参照物 对文档流的影响 应用场景
Static (默认定位) 元素按照正常文档流排列,topleft 等属性无效 父元素(正常文档流顺序) 不脱离文档流 常规排版,不需要特殊样式时使用。
Relative (相对定位) 元素相对其在文档流中的原始位置偏移,不影响其占用空间 元素自身 不脱离文档流 微调元素位置,如轻微位移或视觉调整。
Absolute (绝对定位) 元素完全脱离文档流,根据最近的已定位祖先元素定位;若无,则相对于 html 元素。 最近的已定位父级元素或 html 脱离文档流,影响其他元素的布局 弹窗、浮动图层、动态布局等场景。
Fixed (固定定位) 元素完全脱离文档流,相对于浏览器窗口固定位置,不随滚动条滚动。 浏览器窗口 脱离文档流,固定在视窗内 头部导航、固定按钮或广告等场景。
Sticky (粘性定位) 元素在滚动时表现为 relativefixed 的混合;在特定滚动范围内相对父级元素移动 最近的滚动容器 不完全脱离文档流,部分影响其他布局 表头随内容滚动(如表格列标题)。

对文档流的影响
  • Static 和 Relative: 元素仍占用文档流中的空间,其他元素会考虑其位置。
  • Absolute 和 Fixed: 元素脱离文档流,原位置不再占用空间,其他元素会填充其空隙。
  • Sticky: 在滚动范围内,部分脱离文档流,同时占用原空间。

如何选择最优定位方式
  1. 根据布局需求:

    • 常规布局:使用 staticrelative
    • 浮动元素:使用 absolute,定位在父级容器内。
    • 固定导航栏:使用 fixed,确保元素始终在视口内。
    • 滚动交互:使用 sticky,提供灵活的滚动效果。
  2. 避免不必要的复杂度:

    • 能用 relative 实现的,不用 absolute
    • 能用 sticky 实现的,不用 fixed
  3. 注意性能优化:

    • 对于频繁滚动的页面,sticky 更适合,避免频繁重绘。

雪碧图实现原理

雪碧图 (Sprite) 是一种优化网页加载速度的技术,将多个小图标合并为一张图片,通过 CSS 的背景定位来显示需要的部分。

实现步骤

  1. 图片合并: 将多个小图片合并成一张大图,减少 HTTP 请求次数。

  2. CSS 背景定位: 使用 background-image 设置雪碧图作为背景;通过 background-position 精确显示所需区域:

    .icon {
        width: 32px; height: 32px;
        background-image: url('sprite.png');
        background-repeat: no-repeat;
    }
    .icon-home {
        background-position: 0 0;
    }
    .icon-search {
        background-position: -32px 0;
    }
    
  3. 使用场景:

    • 导航栏图标。
    • 按钮状态变化(普通、悬停、点击)。
  4. 优点:

    • 减少请求次数,提高加载速度。
    • 统一管理小图片,方便维护。
  5. 缺点:

    • 如果图片位置调整,需重新计算坐标。
    • 无法使用单个图标的响应式调整,需要配合 media queries 或其他方式处理。

注意

  • 定位规则的选择应考虑布局复杂性和性能需求。
  • 雪碧图通过减少 HTTP 请求优化加载性能,但需精确背景定位以确保内容显示正确。

5、写出尽可能多的水平垂直居中的方案并对比它们的优缺点

代码实现 代码简洁性 动态内容支持 浏览器兼容性 适用场景 优缺点
Flexbox css<br>.parent { display: flex; justify-content: center; align-items: center; height: 100%; }<br>.child { width: 100px; height: 100px; } 现代布局、动态内容居中 优点: 简洁、现代,适应性强,代码量少,无需固定宽高。 缺点: 依赖现代浏览器支持,但现代浏览器已广泛支持。
Grid css<br>.parent { display: grid; place-items: center; height: 100%; }<br>.child { width: 100px; height: 100px; } 中高 简单布局,适用于动态内容 优点: 最简洁的实现,单行代码即可居中。 缺点: 老旧浏览器(如 IE)不支持 Grid 布局。
Position + Transform css<br>.parent { position: relative; height: 100%; }<br>.child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100px; height: 100px; } 动态内容的绝对定位居中 优点: 精确居中,兼容性好。 缺点: 父容器需设置 position 和固定高度,代码略复杂。
Position + Margin css<br>.parent { position: relative; height: 100%; }<br>.child { position: absolute; top: 50%; left: 50%; margin-top: -50px; margin-left: -50px; width: 100px; height: 100px; } 中低 固定大小元素的居中 优点: 适用于固定宽高的元素。 缺点: 不支持动态内容,需手动计算宽高的一半,且代码复杂度较高。
Table css<br>.parent { display: table; width: 100%; height: 100%; }<br>.child { display: table-cell; vertical-align: middle; text-align: center; } 老旧浏览器兼容布局,适用于文本居中 优点: 浏览器兼容性好,不依赖固定高度。 缺点: 语义化较差,不适合现代布局需求。
Line-height css<br>.parent { height: 100px; line-height: 100px; text-align: center; }<br>.child { display: inline-block; } 单行文本的水平垂直居中 优点: 实现简单,代码量少。 缺点: 仅支持单行文本居中,不适用于多行文本或复杂布局。
Inline-block css<br>.parent { text-align: center; height: 100%; }<br>.parent:before { content: ''; display: inline-block; height: 100%; vertical-align: middle; }<br>.child { display: inline-block; vertical-align: middle; } 图标、小型内容的居中 优点: 适用于简单内容居中,兼容性强。 缺点: 代码较繁琐,不适用于复杂布局。
Float + Clearfix css<br>.parent { position: relative; height: 100%; }<br>.child { float: left; position: relative; top: 50%; left: 50%; transform: translate(-50%, -50%); } 中低 老项目中的遗留居中方式 优点: 浏览器兼容性好,适合老旧代码维护。 缺点: 实现方式不直观,代码冗余,已不推荐。

6、请说一下你对BFC盒子模型的理解。

BFC(块级格式化上下文) 是一个在CSS中定义的布局环境,它用于控制块级元素的布局行为。它的本质是创建一个独立的渲染区域,BFC内的布局行为不会影响到外部元素,外部的布局也不会干扰到BFC内的元素。

BFC的主要特点

  1. 独立的布局环境:BFC是一个独立的区域,它内部的元素的布局规则不会影响到外部的元素布局,也不会被外部的元素影响。
  2. 浮动元素:BFC能够处理浮动元素,使其不脱离文档流。浮动元素如果在BFC内,它会像其他元素一样参与布局,不会被外部元素所干扰。
  3. 外边距合并:在同一个BFC内,两个相邻的块级元素会发生外边距合并。只有在不同BFC之间,外边距才会分开。
  4. 清除浮动:BFC能有效地清除浮动。通过创建BFC,我们可以让浮动元素的父元素自适应高度,防止浮动元素脱离文档流造成的父元素高度塌陷问题。

如何创建BFC

BFC可以通过以下几种方式创建:

  • 浮动元素:任何带有 float 属性的元素,都会创建BFC。
  • 绝对定位元素position: absoluteposition: fixed 会创建BFC。
  • overflow 属性:如果元素的 overflow 属性设置为 hiddenautoscroll,它也会创建BFC。
  • 块级元素display: block 本身也会创建BFC。
  • 表格布局元素display: tabledisplay: inline-table 等也会创建BFC。

BFC的实际应用

  1. 清除浮动:当一个父元素包含浮动子元素时,我们可以通过给父元素设置 overflow: hidden 来创建BFC,清除浮动,防止父元素高度塌陷。

    css复制代码.parent {
      overflow: hidden; /* 创建BFC */
    }
    
  2. 避免外边距合并:为了防止相邻元素的外边距合并,我们可以通过给其中一个元素设置 overflow: hiddenfloat 来创建BFC。

    css复制代码.child {
      overflow: hidden; /* 创建BFC,避免外边距合并 */
    }
    
  3. 控制浮动元素影响:通过BFC的特性,浮动元素的布局可以被其他元素独立控制,从而避免浮动元素与其他布局产生冲突。

7.CSS函数有哪些?

以下是CSS函数的分类及其详细信息,整理成表格:

分类 函数名 作用 示例
颜色相关 rgb() / rgba() 用红、绿、蓝通道定义颜色,rgba()支持透明度。 color: rgb(255, 0, 0);``background-color: rgba(255, 0, 0, 0.5);
hsl() / hsla() 通过色调、饱和度和亮度来定义颜色,hsla()支持透明度。 color: hsl(120, 100%, 50%);``background-color: hsla(120, 100%, 50%, 0.3);
尺寸与布局 calc() 进行动态计算,支持加、减、乘、除等运算。 width: calc(100% - 20px);
min() 返回给定值中的最小值。 width: min(50%, 300px);
max() 返回给定值中的最大值。 height: max(100px, 10vh);
clamp() 根据给定的最小值、最大值和计算值动态计算。 font-size: clamp(16px, 5vw, 24px);
位置与变换 rotate() 旋转元素的角度。 transform: rotate(45deg);
translate() 平移元素,支持横向和纵向的移动。 transform: translate(50px, 100px);
scale() 缩放元素,支持横向和纵向的缩放。 transform: scale(1.5);
skew() 扭曲元素,支持横向和纵向的扭曲。 transform: skew(30deg, 20deg);
字体与文本 attr() 获取元素的属性值,用于 content 属性。 content: attr(href);
视觉效果 box-shadow() 为元素添加阴影效果。 box-shadow: 10px 10px 15px rgba(0, 0, 0, 0.3);
text-shadow() 为文本添加阴影效果。 text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
动画与过渡 transition() 定义元素状态变化时的过渡效果。 transition: all 0.3s ease-in-out;
animation() 定义 CSS 动画。 animation: fadeIn 2s ease-in-out infinite;
@keyframes 定义动画的关键帧,控制动画在不同时间点的样式。 @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } }
响应式设计 @media 根据不同的设备条件(如屏幕宽度)应用不同的样式。 @media (max-width: 768px) { .container { display: flex; flex-direction: column; } }
变量与自定义 var() 引用 CSS 变量的值。 color: var(--main-color);
图片与外部资源 url() 引用外部资源(如图片、字体文件等)。 background-image: url('image.jpg');
其他 @import 引入外部 CSS 文件。 @import url('style.css');
@supports 检查浏览器是否支持某些 CSS 特性。 @supports (display: grid) { .container { display: grid; } }
@font-face 定义自定义字体。 @font-face { font-family: 'MyFont'; src: url('myfont.woff'); }

8、PostCSS、Sass、Less的异同,以及使用配置。

PostCSS、Sass、Less的异同
功能 PostCSS Sass Less
语言特性 PostCSS 本身是一个工具,不提供特定语法;通过插件实现功能。 提供了强大的嵌套规则、变量、混合等功能。 提供类似 Sass 的嵌套规则、变量、混合等功能。
变量定义 依赖 postcss-simple-vars 插件实现变量。 使用 $ 开头定义变量。 使用 @ 开头定义变量。
计算能力 通过插件(如 postcss-calc)实现动态计算。 内置强大的运算功能,支持加减乘除等数学运算。 支持基本的数学运算。
混合(Mixin 通过插件(如 postcss-mixins)实现。 支持复杂的函数混合(@mixin@include)。 使用定义和调用方式类似函数(mixincall)。
继承 通过插件(如 postcss-extend)实现。 支持样式继承(@extend)。 支持通过 extend() 方法继承样式。
生态系统 完全依赖插件扩展,功能非常灵活。 内置功能完善,少依赖插件。 功能有限,适合中小型项目。
兼容性 需根据插件选择支持的浏览器版本。 通常需要编译为 CSS 使用,兼容性强。 同 Sass,需要编译为 CSS。
配置方式 基于插件的灵活配置。 使用 CLI 或编译工具,如 dart-sass 使用 CLI 或编译工具,如 lessc
使用场景 针对需要高度定制的项目或特定功能优化。 大型项目,适合复杂的样式逻辑。 中小型项目,适合快速开发。
性能 依赖插件数量,复杂性较高可能影响编译速度。 编译速度较快,尤其是 dart-sass 编译速度快,适合实时开发。
less和sass的详细功能对比
特性 Sass Less
嵌套规则 支持 @at-root 提高灵活性 支持基础嵌套
变量管理 支持局部变量、全局变量 变量全局污染
逻辑与循环 强大的条件和循环支持 支持,但功能有限
继承与占位符选择器 支持占位符选择器,继承灵活 通过 extend(),功能有限
模块化 支持 @use 和命名空间 仅支持简单的 @import
生态系统 活跃且支持强大 较少更新,依赖其他工具

9.CSS模块化方案有哪些,谈谈你对CSS模块化的理解?

CSS模块化方案

要实现一套完整的 CSS 模块化方案,可以从以下三个方面入手:命名规则CSS ModulesCSS-in-JS

1、命名规则

命名规则是最基础的 CSS 模块化方案,主要通过规范化的命名方式解决样式冲突问题。以下是常见的命名方案:

命名方案 特点 示例
BEM Block-Element-Modifier,按照模块、元素和状态命名,结构清晰,层次分明。 button__icon--active
OOCSS 对象化 CSS,将样式划分为结构与皮肤两个部分,适合共享性高的项目。 .card, .card--shadow
SMACSS 分类 CSS 文件为 Base、Layout、Module、State 和 Theme 减少冲突。 .nav, .nav--expanded
ITCSS 从低到高分层(Settings全局配置 > Tools函数 > Generic全局样式 > Elements基础样式 > Components独立模块样式 > Utilities工具类样式)。 u-hidden, c-button

优缺点

  • 优点:简单直观,无需额外工具支持。
  • 缺点:依赖人工遵守,复杂项目中可能仍会出现命名冲突。

2. CSS Modules

CSS Modules 是一种基于工具的样式隔离方案,避免全局样式冲突。以下是常见的实现方式:

工具/技术 特点 示例
CSS Modules 默认作用域隔离,每个样式文件仅作用于当前组件,编译时自动生成唯一类名。 styles.button
Scoped CSS (Vue) Vue 的单文件组件样式隔离方式,使用 scoped 属性实现组件级别样式。 <style scoped>
Shadow DOM 原生浏览器支持,通过 Shadow DOM 实现样式隔离。 attachShadow()

优缺点

  • 优点:样式隔离,避免命名冲突,适合组件化开发。
  • 缺点:依赖构建工具,操作全局样式较复杂。

3、CSS-in-JS

是将样式与逻辑绑定,通过 JavaScript 管理样式的方案,以下是常见工具:

工具/库 特点 示例
Styled-Components 使用模板字符串定义样式,支持动态样式和主题切换,适合 React 项目。 styled.buttoncolor: red;``
Emotion 性能优化更好,支持标签模板和对象样式写法,动态样式更灵活。 csscolor: blue;``
Vue Scoped CSS + JS 在 Vue 中通过内联样式动态绑定 CSS。 :style="{ color: textColor }"
JSS 类似 Emotion 的库,支持动态样式生成,但社区活跃度稍低。 jss.createStyleSheet()

优缺点

  • 优点:支持动态样式、逻辑与样式高度绑定,适合复杂交互组件。
  • 缺点:运行时性能开销高,不适合简单项目。
理解

CSS 模块化是一种组织和管理 CSS 样式的开发方法,旨在解决传统 CSS 开发中常见的样式冲突、难以维护、低复用性等问题。模块化通过将样式拆分为独立、可复用的模块,使代码更清晰、更高效、更易于扩展。

核心问题

  1. 样式冲突:传统 CSS 是全局作用域,多个开发者协作时容易出现样式覆盖或冲突。
  2. 难以维护:样式文件规模扩大后,定位问题或理解依赖关系变得困难。
  3. 低复用性:没有复用机制,导致代码冗余。

CSS 模块化的核心目标

  1. 隔离作用域:避免不同模块之间的样式冲突。
  2. 高复用性:将常用样式抽象为组件,便于重复使用。
  3. 增强可维护性:清晰的结构和命名规则,使代码更易阅读和修改。

10、什么是CSS阻塞渲染?如何防止CSS阻塞渲染。

定义

CSS 阻塞渲染是指当浏览器解析 HTML 文档时,遇到外部样式表 (<link> 标签) 会暂停渲染页面内容,直到 CSS 文件完全加载并解析完成。这种行为是浏览器为了确保页面渲染的视觉稳定性。

CSS 阻塞渲染的原因

  1. CSS 是构建渲染树的必要条件

    • 渲染树需要 DOM 和 CSSOM。没有完整的 CSSOM,浏览器无法确定页面样式,因此会暂停渲染。
  2. 保护用户体验

    • 如果渲染在样式加载完成之前进行,可能会导致 "FOUC"(Flash of Unstyled Content),即页面先以无样式的状态显示,再突然变成有样式的状态。这会显得突兀。
  3. 外部 CSS 文件依赖网络

    • 外部样式表需要网络请求加载。如果网络延迟或文件体积过大,会导致加载时间延长。
  4. CSS 的层级依赖

    • 如果 CSS 文件中有 @import 或多个文件互相依赖,浏览器需要按顺序加载并解析,进一步延长阻塞时间。

CSS 阻塞渲染的表现

当浏览器解析 HTML 文档时,遇到以下情况会发生 CSS 阻塞渲染:

  • 使用 <link rel="stylesheet"> 加载外部样式表。
  • CSS 文件中包含嵌套的 @import 指令。

CSS 阻塞渲染的影响

  1. 页面渲染时间增加,影响首屏加载速度。
  2. 用户可能会长时间看到空白页面或不完整内容。

优化 CSS 阻塞渲染的策略

  • 关键 CSS 优化: 将页面首屏需要的样式写为内联 CSS。

  • 延迟加载非关键样式: 使用动态加载或将非关键样式表标记为异步加载。

    <link rel="stylesheet" href="styles.css" media="print" onload="this.media='all';">
    
  • 减少样式表数量: 合并和压缩 CSS 文件,减少网络请求。

  • 使用 preload 加载样式表: 提前声明关键样式,减少加载时间。

    <link rel="preload" href="styles.css" as="style" onload="this.rel='stylesheet';">
    

通过这些优化,可以有效减少 CSS 阻塞渲染对页面加载性能的影响。

11、CSS3中过渡与动画的差异。

特性 过渡(Transitions) 动画(Animations)
触发方式 依赖状态变化(如 hoverfocus 等) 独立执行,不依赖状态
复杂程度 简单的状态变化 支持多关键帧,适合复杂动画
控制能力 无法单独控制动画的播放 可控制方向、次数、延迟等
循环支持 不支持循环 支持循环(iteration-count
适用场景 简单的交互效果(如按钮变色、缩放) 复杂的动画(如旋转、位移、多段动画)

12、说一下你了解的响应式布局有哪些,他们有什么异同。


实现方式 概念 优点 缺点 性能 自适应能力
流式布局 使用百分比宽度,使布局随父容器大小自动调整。 简单易用,快速实现响应式布局,浏览器兼容性好。 适用性有限,复杂布局难以实现;缺乏精准控制。 性能优,CSS 规则简单,浏览器解析负担小。 依赖容器大小,能适应基础场景,但不适用于需要精准控制的复杂布局。
媒体查询 使用 @media 定义不同屏幕尺寸条件下的 CSS 规则,从而调整布局和样式。 灵活且强大,可精准优化不同设备上的显示效果。 需要手动维护多个规则,复杂页面容易导致样式冲突;增加代码复杂度。 性能较好,但过多条件可能增加样式解析时间。 适配性强,能针对不同分辨率和设备灵活调整布局。
弹性盒子(Flexbox) 一维布局模型,基于主轴和交叉轴动态分配元素位置和大小。 代码简洁,布局灵活,子元素可自动适应父容器大小;现代浏览器优化完善,兼容性好。 不支持二维布局,仅适用于单行或单列的场景。 性能较优,布局算法高效,浏览器优化程度高。 适用于一维布局,自适应性强,但二维布局需结合其他方式。
栅格系统 将页面划分为固定数量的列,通过列宽控制布局。 提供标准化布局结构,适用于大多数场景;易于团队协作和维护。 依赖框架(如 Bootstrap),引入冗余代码;列数固定,灵活性不如 CSS Grid。 性能中等,引入框架增加加载时间,部分冗余功能可能浪费资源。 适合多列布局场景,但列数固定限制了灵活性,需结合媒体查询优化适应性。
CSS Grid 二维网格布局,可同时控制行和列,适用于复杂布局场景。 强大且灵活,适合复杂布局;支持精确控制布局区域和嵌套布局。 学习曲线较高;低版本浏览器兼容性较差。 性能较优,直接使用浏览器内置功能,无需额外框架。 适配性强,支持复杂场景的自适应;能更精确地控制布局结构。

13、说一下你对flex布局的理解。

Flex 布局,即弹性盒子布局,是一种为了解决传统布局方式(如浮动、定位)在页面对齐和分配空间上的局限性而提出的布局模型。它特别适用于一维布局(横向或纵向)中的灵活排列和对齐。

1. 概念与核心原理

Flex 布局通过定义一个容器(flex container),让其子元素(flex items)按照主轴(main axis)和交叉轴(cross axis)来排列和分布。子元素的大小、对齐方式和位置会根据可用空间动态调整。

2. 主要特性

  • 一维布局:支持主轴和交叉轴上的灵活布局。
  • 子元素可调整大小:子元素可以按比例分配剩余空间,也可以根据内容大小自动调整。
  • 对齐方便:支持主轴和交叉轴上的各种对齐方式,简化了垂直和水平居中的实现。

3. 核心属性

  1. 父容器的属性(flex container):

    • display: flex:定义为弹性容器。
    • flex-direction:主轴方向(如 row, column)。
    • justify-content:主轴对齐方式(如 flex-start, center, space-between)。
    • align-items:交叉轴对齐方式(如 stretch, center)。
    • flex-wrap:子元素是否换行(如 nowrap, wrap)。
  2. 子元素的属性(flex items):

    • flex:定义子元素的增长、缩小、初始大小的比例(如 flex: 1 1 auto)。
    • align-self:单独设置某个子元素的交叉轴对齐方式。
    • order:改变子元素在布局中的排列顺序。

4. 优缺点

优点 缺点
- 简单易用,代码简洁,能快速实现复杂的对齐和分布需求。 - 不支持二维布局(行和列同时布局),复杂布局场景需要结合其他方案。
- 对不同屏幕尺寸具有良好的适应性,可动态调整子元素大小和位置。 - 对旧版浏览器(如 IE10 以下)支持不佳。
- 减少对浮动(float)和绝对定位的依赖,提高布局的灵活性和可维护性。 - 使用错误的 flex 值可能导致子元素意外变形或溢出容器。

5. 实际应用场景

  1. 导航栏:子元素按比例分配宽度,或居中对齐。
  2. 垂直和水平居中:父容器设置 display: flex; justify-content: center; align-items: center;
  3. 网格布局:结合 flex-wrap 创建多行布局。
  4. 弹性卡片布局:子元素根据内容动态调整大小。
💭

评论与探讨 Comments

欢迎留下你的思考、探讨或勘误指正

支持免登录 · Markdown
正在载入讨论区...