5758 字
29 分钟
前端CSS核心知识点 - Anki记忆卡片集

一套完整的前端CSS核心知识点Anki记忆卡片集,包含32张精心制作的卡片,涵盖从基础概念到现代开发实践的全面内容。

📚 卡片概览#

本卡片集包含以下类型的学习内容:

  • 概念类:深入理解CSS核心原理和机制
  • 问题类:解决实际开发中的常见问题
  • 实战类:掌握具体的代码实现技巧

🎯 学习目标#

通过这套卡片,您将掌握:

  • CSS布局和定位的核心概念
  • 现代响应式设计技术
  • 性能优化和最佳实践
  • 浏览器兼容性解决方案
  • 工程化开发工具使用

📖 卡片内容#

BFC(块级格式上下文)#

Q: 概念:BFC是什么?如何创建?解决什么问题? A:

  • 定义:CSS独立渲染区域,内部元素与外部隔离
  • 创建floatposition: absolute/fixeddisplay: inline-block/table-celloverflow: hidden/auto
  • 解决问题:边距重叠、高度塌陷、浮动覆盖、布局换行
  • 代码.margin-collapse { overflow: hidden; }

清除浮动的方式#

Q: 问题:清除浮动的方式有哪些? A:

  • 触发BFC法:父元素设置overflow: hidden/auto,兼容性好(IE7+)
  • 伪元素清除法(推荐)
    .clearfix::after {
    content: "";
    display: block;
    clear: both;
    }
    无副作用,现代主流方案
  • 空标签法(不推荐)<div style="clear: both"></div>,增加冗余标签
  • 现代替代方案:使用Flexbox/Grid布局取代浮动,父容器设置display: flow-root(创建BFC)

CSS实现三角符号#

Q: 实战:如何用CSS实现三角符号? A: 记忆口诀:盒子宽高均为零,三面边框皆透明。

div:after{
position: absolute;
width: 0px;
height: 0px;
content: " ";
border-right: 100px solid transparent;
border-top: 100px solid #ff0;
border-left: 100px solid transparent;
border-bottom: 100px solid transparent;
}

原理:利用边框相交形成三角形,设置三面透明,一面有颜色。

元素水平垂直居中#

Q: 问题:如何让一个元素水平垂直居中? A: 水平居中

  • 行内元素:text-align: center
  • 块级元素定宽:margin: 0 auto
  • 块级元素不定宽:display: inline-block + 父元素text-align: center

垂直居中

  • 单行文本:line-height = height
  • 块级元素:display: flex + align-items: center

终极解决方案

/* 方案1:Flexbox */
.parent {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
/* 方案2:绝对定位 + Transform */
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
/* 方案3:Grid布局 */
.parent {
display: grid;
place-items: center; /* 水平垂直居中 */
}

适配场景:现代浏览器优先Flex/Grid,兼容旧版用定位+Transform,文本内容用line-height/text-align。

隐藏页面元素的方法#

Q: 问题:隐藏页面中某个元素的方法有哪些? A:

  • opacity: 0:元素透明不可见,保留布局空间,事件可触发
  • visibility: hidden:元素完全隐藏,保留布局空间,事件不触发
  • display: none:元素从文档流移除,不占空间,事件不触发(触发重排)

性能影响display: none > visibility > opacity(仅重绘)

box-sizing盒子模型#

Q: 概念:box-sizing是什么?有哪些属性值? A: 核心作用:控制元素尺寸的计算规则,解决因内边距(padding)和边框(border)导致的布局错位问题。

属性值对比

计算规则别名特点
content-box总宽度 = width + padding + border标准盒子模型默认值,内边距和边框会增加元素实际占用空间
border-box总宽度 = width(包含内边距和边框)IE盒子模型内边距和边框不会增加元素实际占用空间
inherit继承父元素的 box-sizing 设定-用于需要统一盒子模型的嵌套场景

应用场景

  • 标准盒子模型(content-box):适用于需要精确控制内容尺寸的场景(如文本区块)
  • IE盒子模型(border-box):✅ 简化响应式布局开发(设置 width:100% 包含内边距和边框)✅ 避免动态计算宽高(如表单元素)

CSS选择器及优先级#

Q: 概念:CSS选择器有哪些类型?优先级规则是什么? A: 选择器类型#id > .class/[attr]/:pseudo-class > div/::pseudo-element > */>/+

优先级规则(从高到低)

  1. !important(强制最高)
  2. 内联样式(权重1000)
  3. ID选择器(权重0100)
  4. 类/属性/伪类(权重0010)
  5. 元素/伪元素(权重0001)
  6. 通配符/关系选择器(权重0000)

比较规则:高位权重优先(如0100 > 0020),同权重时后定义生效。

CSS选择器优先级计算#

Q: 概念:CSS选择器的优先级是如何计算的? A: 层级权重(从高到低):

  • 内联样式(a)
  • ID选择器(b)
  • 类/伪类(c)
  • 元素/伪元素(d)

计算规则

  • 高位优先:逐级比较权重,高位不同时低位无效(如 0,1,0,0 > 0,0,10,10)
  • 同权覆盖:权重相同时,后定义的样式生效
  • 避免陷阱:组件开发用低优先级类选择器,禁用 !important

核心:权重分层比较,非总分累加。

Flexbox布局和Grid布局#

Q: 概念:Flexbox布局和Grid布局有什么区别? A: 特性对比

特性FlexboxGrid
维度一维布局(行或列)二维布局(行列同时定义)
核心用途内容流控制/元素对齐整体页面栅格结构搭建
浏览器支持全面兼容(推荐方案)现代浏览器支持(IE部分兼容)
典型场景导航栏/垂直居中/弹性表单卡片布局/杂志式排版/复杂网格

最佳实践

  • 简单布局:优先Flexbox(移动端友好)
  • 复杂布局:Grid + Flexbox组合使用(Grid框架内嵌Flex元素)

避坑点

  • Flexbox避免过度使用flex-grow(Safari兼容问题)
  • Grid旧项目需加@supports特性检测

position属性值及区别#

Q: 概念:position属性值有哪些?有什么区别? A:

  • static:默认值,遵循正常文档流,忽略top/right/bottom/left/z-index
  • relative:相对自身原位置偏移,原位置保留空白(不脱离文档流)
  • absolute:脱离文档流,相对于最近的非static祖先定位
  • fixed:脱离文档流,相对于视口定位(滚动不移动)
  • sticky:混合定位(滚动到阈值前为relative,之后为fixed),相对于最近滚动容器定位

核心区别:是否脱离文档流 + 定位参照物不同

Float定位工作原理#

Q: 概念:Float定位的工作原理是什么? A: 脱离文档流

  • 浮动元素移出正常流,但保留部分流动性(文字环绕效果)
  • 与绝对定位不同:不脱离文档上下文

环绕特性

  • 后续内联内容自动环绕浮动元素
  • 块级元素无视浮动(需clear解除)

高度塌陷问题

  • 父容器仅含浮动元素时高度归零
  • 解决方案
    .clearfix::after {
    content: '';
    display: block;
    clear: both; /* 关键清除 */
    }

BFC替代方案

  • 父容器设置overflow: hidden/auto触发块格式化上下文
  • 自动包含浮动子元素

现代替代:Flexbox/Grid布局更稳定可控

z-index属性和层叠上下文#

Q: 概念:z-index属性是什么?如何形成层叠上下文? A: z-index属性

  • 作用:控制定位元素(position: relative/absolute/fixed)的垂直叠加顺序
  • 规则:值越大越靠上(可为负值)

层叠上下文形成条件

  • 根元素<html>
  • position: absolute/relativez-index非auto
  • position: fixed/sticky
  • opacity < 1
  • transform/filter非none
  • isolation: isolate

核心特性

  • 独立性:层叠上下文内部元素的z-index仅在该上下文内比较
  • 封闭性:子元素无法突破父层叠上下文的层级关系

示例:父元素设置opacity: 0.9会创建新层叠上下文,此时子元素的z-index: 999仅在该父元素内生效。

Flex布局#

Q: 概念:Flex布局是什么?如何使用? A: 核心优势

  • 一维布局模型:高效控制子元素排列、对齐与空间分配
  • 解决传统痛点:垂直居中、等高等复杂布局轻松实现

容器属性

.container {
display: flex; /* 开启Flex */
flex-direction: row|column; /* 主轴方向 */
justify-content: center|space-between; /* 主轴对齐 */
align-items: center|stretch; /* 交叉轴对齐 */
flex-wrap: wrap; /* 换行控制 */
}

子项属性

.item {
order: 2; /* 排序优先级 */
flex: 1; /* 自动填充剩余空间 */
align-self: flex-end; /* 独立对齐 */
}

经典场景

  • 圣杯布局(三栏自适应)
  • 垂直居中(align-items:center + justify-content:center
  • 等高分栏(父容器align-items:stretch

兼容性:现代浏览器全面支持,IE10+需前缀-ms-flex

Rem布局#

Q: 概念:Rem布局是什么?如何实现? A: 原理:1rem = 根元素(<html>)的font-size值

适配方案

document.documentElement.style.fontSize = (clientWidth / 设计稿宽度) * 基准值 + 'px'

优势

  • 等比缩放,多设备适配
  • 避免多层嵌套百分比计算

缺陷

  • 需手动处理图片/字体缩放
  • 调试复杂(需实时转换设计图px→rem)

适用场景:移动端H5页面(如Vant组件库默认采用)

浮动布局#

Q: 概念:浮动布局是什么?有什么优缺点? A: 脱离文档流

  • 浮动元素移出正常流,向左/右移动直至触碰到容器边缘或另一浮动元素

文字环绕效果

  • 内联内容自动环绕浮动元素(核心设计初衷)

优点

  • 实现图文混排(文字自然环绕图片)
  • 创建多栏布局(早期替代方案)

致命缺点

  • 高度塌陷:父容器无法自动包含浮动子元素 → 需手动清除浮动(.clearfix
  • 布局脆弱:需精确计算宽度,响应式适配困难

现代替代

  • Flexbox/Grid布局更稳定直观

应用场景:仅推荐用于文字环绕图片等传统需求,布局任务优先使用Flex/Grid

百分比布局#

Q: 概念:百分比布局是什么?有什么特点? A: 原理

  • 元素尺寸(宽/高/间距)基于父容器对应属性等比缩放
.child {
width: 50%; /* 父容器宽度的50% */
padding: 5%; /* 父容器宽度的5% */
}

参照规则

属性参照基准
width/height父元素宽/高
padding/margin父元素宽度
border-radius元素自身尺寸
transform元素自身尺寸

缺陷

  • 计算复杂:需手动计算百分比值(如33.33%)
  • 嵌套失效:多层嵌套时尺寸可能失控
  • 高度限制:父元素未显式设置高度时,height: 100%无效

应用场景:简单栅格系统(结合媒体查询),现代开发优先使用Flex/Grid替代

inline和inline-block的区别#

Q: 概念:inline和inline-block有什么区别? A: 宽高设置

  • inline:❌ 忽略宽高设置
  • inline-block:✅ 支持宽高设置

布局流

  • 两者均允许同行元素(不独占一行)

垂直边距/填充

  • inline:❌ 垂直方向无效
  • inline-block:✅ 支持垂直边距/填充

对齐方式

  • inline-block:✅ 支持vertical-align垂直对齐

浮动表现

  • inline浮动后 → 转为block特性
  • inline-block浮动后 → 保持原有特性

本质inline-block = 行内布局 + block模型特性

CSS和JS加载位置#

Q: 问题:为何 A: CSS <link> 位置

  • 原因
    • 避免页面无样式闪烁(FOUC)
    • 确保首屏渲染时样式已加载
    • 符合HTML规范要求

JS <script> 位置

  • 原因
    • 防止阻塞HTML/CSS解析渲染
    • 确保DOM完全加载后再执行脚本

例外情况

  • 使用async属性(异步下载,不阻塞)
  • 使用defer属性(延迟执行,不阻塞)
  • 需提前执行的监控/分析脚本

核心原则:CSS优先加载,JS最后执行

CSS translate()和绝对定位选择#

Q: 问题:何时应优先选用CSS translate()而非绝对定位?何时相反? A: 优先使用 translate() 的情况

  • 高性能动画:触发GPU加速(创建独立图层)
  • 只触发复合(composite),不触发重排重绘
  • 保留原始布局:元素移动后仍占据原空间(类似position

优先使用绝对定位的情况

  • 脱离文档流:需完全移出正常流(不占空间)
  • 静态定位需求:非动画场景(如固定侧边栏)
  • 复杂布局控制:需精确控制元素层叠关系(z-index)

性能结论:动画场景用translate(性能优),布局控制用绝对定位

CSS预处理的优缺点#

Q: 问题:使用CSS预处理的优缺点是什么? A: 优点

  • 增强可维护性
    • 嵌套选择器(清晰层级)
    • 变量管理(主题色/尺寸全局控制)
  • 代码复用
    • Mixins重用代码块
    • 函数计算能力(动态样式)
  • 工程化支持
    • 模块化拆分(多个文件编译为单一CSS)

缺点

  • 工具依赖:需预处理器(如Sass/Less)和编译环境
  • 编译开销:大项目编译耗时(需监听文件变动)
  • 调试复杂度:需Source Map映射原始代码

结论:适用于中大型项目,小型项目可能增加冗余复杂度。

响应式设计与自适应设计的区别#

Q: 问题:响应式设计与自适应设计有何不同? A: 响应式设计

  • 核心:流体布局(单代码适配所有设备)
  • 技术:CSS媒体查询 + 流式网格 + 弹性图片
  • 特点:布局连续变化(像气球适应不同篮筐)

自适应设计

  • 核心:预置布局(多套模板匹配设备)
  • 技术:设备特征检测 + 预设断点布局
  • 特点:阶梯式切换(为不同篮筐准备不同球)

本质区别

  • 响应式 = 流体连续变化
  • 自适应 = 阶梯式布局切换

现代趋势:响应式为主 + 自适应优化(关键断点)

rem和viewport移动端适配#

Q: 问题:如何使用rem或viewport进行移动端适配? A: rem 适配

  • 原理:动态设置html的font-size,页面元素尺寸使用rem单位(相对根字体)
  • 实现
    // JS 动态计算
    document.documentElement.style.fontSize =
    document.documentElement.clientWidth / 7.5 + 'px';
  • 特点
    • ✅ 保持完美视口(1 CSS像素 = 1 设备独立像素)
    • ⚠️ 需转换设计稿尺寸(推荐Less/Sass计算函数)

viewport 适配

  • 原理:通过<meta name="viewport">缩放页面
    <meta name="viewport" content="width=750, initial-scale=0.5, maximum-scale=0.5">
  • 特点
    • ✅ 所量即所设(设计稿750px直接写750px)
    • ❌ 破坏完美视口(缩放导致像素非1:1)

现代方案:优先使用rem + vw结合方案(无需JS):

html { font-size: calc(100vw / 7.5); } /* 750px设计稿 */
.box { width: 2rem; } /* 相当于100px */

浏览器样式兼容性解决方案#

Q: 问题:如何解决不同浏览器的样式兼容性问题? A: CSS 重置库

  • Normalize.css:统一默认样式
  • Reset CSS:清除默认样式

前缀自动化

  • Autoprefixer:自动添加-webkit-/-moz-前缀

渐进增强

  • Modernizr:检测特性支持,降级处理

隔离兼容方案

  • 条件注释:<!--[if IE]>...<![endif]-->
  • 媒体查询:@supports特性检测

框架方案

  • Bootstrap:内置跨浏览器兼容

核心原则

  • 先保证基础功能兼容
  • 现代浏览器追加增强效果
  • 避免使用实验性CSS特性

渐进增强和优雅降级#

Q: 问题:如何通过特定技术与流程为功能受限的浏览器提供渐进增强的页面体验? A: 核心策略

  • 渐进增强
    • 基础功能兼容所有浏览器
    • 现代浏览器追加增强功能
  • 优雅降级
    • 先构建完整功能
    • 旧浏览器降级体验

技术流程

  • 特性检测:使用Modernizr检测浏览器支持
  • 前缀自动化:Autoprefixer自动生成CSS兼容代码
  • 兼容性验证:caniuse.com检查特性支持率

核心工具链:Modernizr(检测) + Autoprefixer(编译) + caniuse(验证)

CSS预处理器的使用体验#

Q: 问题:对于你使用过的CSS预处理,说说喜欢和不喜欢的地方? A: 喜欢的地方

  • Less
    • 基于JavaScript,与Node.js生态无缝集成
    • 学习曲线平缓(类似CSS语法)
  • Sass/SCSS
    • 功能全面(混合/继承/函数等)
    • 社区资源丰富(Bootstrap等主流框架采用)

不喜欢的地方

  • Less
    • @前缀变量易与CSS原生语法混淆(如@media
  • Sass (node-sass)
    • C++编译绑定,切换Node版本需重新编译
    • 大型项目编译速度慢(需Ruby/LibSass依赖)

总结:Sass功能更强大,Less更轻量易集成。现代项目推荐Dart Sass(纯JS实现,无编译依赖)。

伪元素及其用途#

Q: 概念:描述伪元素及其用途? A: 核心概念

  • 伪元素是CSS选择器的扩展,用于选择元素的特定虚拟部分而非元素本身
  • 语法为双冒号::(兼容单冒号)

常用伪元素及用途

  • 内容生成型
    • ::before/::after:添加图标/三角箭头(配合content和边框)、实现清除浮动(.clearfix方案)、创建工具提示框
  • 文本修饰型
    • ::first-letter:首字母下沉/特殊样式
    • ::first-line:段落首行特殊样式
    • ::selection:文本选中样式
  • 结构标记型
    • ::marker:自定义列表项标记样式
    • ::placeholder:输入框占位符样式

核心优势

  • 无侵入式设计:不修改HTML结构即可添加视觉元素
  • 样式与内容分离:将装饰性内容交给CSS管理
  • 性能优化:减少DOM节点数量

示例

.tooltip::after {
content: "";
border: 10px solid transparent;
border-top-color: red; /* 生成三角箭头 */
}

编写高效CSS的注意事项#

Q: 问题:编写高效的CSS应该注意什么? A: 1. 选择器优化

  • 关键选择器(最右侧)要具体,避免div a → 改用.list .link
  • 减少嵌套层级(最长不超过3级)
  • 避免通用选择器*

2. BEM命名规范

  • Block__Element--Modifier结构,如.header__button--active
  • 避免依赖HTML结构,提高可复用性

3. 性能敏感属性

  • ✅ 优先使用合成属性:transform/opacity(只触发合成)
  • ❌ 避免触发重排的属性:width/top/margin

4. 渲染优化

  • 减少重绘区域(will-change隔离动画元素)
  • contain: layout限制布局影响范围

核心原则

  • 选择器右重左轻
  • 避免深度嵌套
  • 慎用重排属性
  • 善用GPU加速

参考:CSS触发器查看属性渲染影响

浏览器CSS选择器匹配机制#

Q: 问题:解释浏览器如何确定哪些元素与CSS选择器匹配? A: 匹配流程(从右向左)

  • 关键选择器筛选:先定位最右侧选择器匹配的所有元素(如p span先找所有<span>
  • 向上遍历验证:沿DOM树向上检查父元素是否满足左侧选择器(验证<span>的父链是否有<p>
  • 短路匹配:只要找到一个符合条件的父元素即停止匹配

性能优化关键

  • 关键选择器要高效
    • 避免通配符*或标签选择器(初始筛选集合过大)
    • 优先使用类选择器(缩小初始匹配范围)
  • 减少选择器层级
    • 短链选择器(.nav > .item)比长链(div ul li a)快10倍

示例对比

  • 高效:.header__link.active
  • 低效:div nav ul li a.active

核心原理:从右向左匹配可利用初始小规模元素集快速过滤,避免无效遍历。

重置CSS与标准化CSS的对比#

Q: 问题:请对比重置CSS(Resetting)与标准化CSS(Normalizing)的核心差异,并说明优先选用场景及依据? A: 核心区别

方式特点
重置CSS彻底清除所有浏览器默认样式(如margin/padding=0),需完全重新定义样式
标准化CSS保留有用的默认样式,仅修复跨浏览器不一致(如统一标题字号/列表缩进)

选择建议

  • 选重置
    • 需完全自定义视觉设计
    • 项目有独立设计系统(如企业级应用)
    /* 重置示例 */
    * { margin:0; padding:0; box-sizing:border-box; }
  • 选标准化
    • 内容型网站(博客/新闻)
    • 希望保留合理默认样式(如表单元素)
    <!-- 标准化方案 -->
    <link href="https://necolas.github.io/normalize.css/latest/normalize.css" rel="stylesheet">

现代趋势:优先标准化(如Normalize.css),局部重置特定元素。保留可访问性默认样式,减少重复劳动。

CSS盒模型的核心概念及切换方法#

Q: 问题:请解释CSS盒模型的核心概念及切换不同渲染模式(如content-box/border-box)的CSS方法? A: 两类盒模型

  • 标准盒模型(box-sizing: content-box)
    • 总宽度 = width + padding + border
    • 设置width仅影响内容区
  • 替代盒模型(box-sizing: border-box)
    • 总宽度 = width(包含padding和border)
    • 更直观(设置width即实际占用宽度)

控制盒模型

/* 使用标准盒模型(默认) */
div { box-sizing: content-box; }
/* 使用替代盒模型(推荐) */
div { box-sizing: border-box; }
/* 全局重置 */
* { box-sizing: border-box; }

布局规则

  • 未指定width → 宽度撑满父容器(减父级padding)
  • 未指定height → 高度由内容决定
  • margin重叠:相邻垂直外边距会合并

最佳实践:全局设置box-sizing: border-box,布局更可控。

CSS精灵图(CSS Sprites)#

Q: 问题:请解释什么是精灵图(css sprites),以及如何实现? A: 概念

  • 将多个小图标/图片合并为单张大图,通过CSS背景定位显示特定区域

实现步骤

  • 生成精灵图:使用工具(如Gulp/Sprity)合并多张小图
  • CSS定位
    .icon {
    background: url(sprites.png) no-repeat;
    }
    .home {
    width: 32px;
    height: 32px;
    background-position: 0 0; /* 显示左上角图标 */
    }
    .cart {
    width: 32px;
    height: 32px;
    background-position: -40px 0; /* 向右偏移40px */
    }

核心优势

  • 减少HTTP请求:多图合并为单次请求(HTTP/1优化利器)
  • 预加载防闪烁:提前加载等交互状态图标
  • 体积优化:合并后图片小于各图总和(共享调色板)

现代替代:HTTP/2多路复用 + SVG图标 + 图标字体

响应式与移动优先设计的区别#

Q: 问题:请解释在编写网站时,响应式与移动优先的区别? A: 响应式设计

  • 核心:通过媒体查询适配不同屏幕尺寸
    /* 桌面样式 */
    @media (min-width: 1024px) { ... }
    /* 平板样式 */
    @media (max-width: 1023px) { ... }
  • 特点:元素尺寸/布局随视口动态变化

移动优先设计

  • 核心策略
    • 默认样式针对移动设备(无媒体查询)
    • 逐级增强大屏样式
    /* 移动端基础样式 */
    .title { font-size: 14px; }
    /* 平板/桌面增强 */
    @media (min-width: 600px) {
    .title { font-size: 20px; }
    }

关键区别

维度响应式移动优先
起点桌面设计向下兼容移动设计向上扩展
性能可能加载冗余代码移动端加载最少CSS
代码结构可能分散强制模块化渐进增强

本质

  • 响应式 = 布局弹性变化
  • 移动优先 = 开发策略(先移动后增强)

最佳实践:移动优先作为响应式设计的实现策略


🚀 如何使用#

导入Anki#

  1. 下载Anki软件(https://apps.ankiweb.net/)
  2. 方式一:直接下载Anki包
  3. 方式二:手动创建
    • 将上述卡片内容复制到Anki中
    • 设置合适的复习间隔和难度

学习建议#

  • 初学者:先学习概念类卡片,建立基础认知
  • 进阶者:重点练习问题类卡片,提升解决能力
  • 实战者:深入实战类卡片,掌握具体实现

复习策略#

  • 每天复习10-15张卡片
  • 重点标记不熟悉的内容
  • 结合实际项目练习代码实现

🔗 相关链接#


前端CSS核心知识点 - Anki记忆卡片集
https://website-truelovings-projects.vercel.app/posts/frontend/web/css-interview/
作者
欢迎来到StarSky的网站!
发布于
2025-09-05
许可协议
CC BY-NC-SA 4.0