网站首页 > 知识剖析 正文
CSS 是前端面试的核心模块之一,考察重点覆盖基础概念、布局原理、样式优先级、兼容性处理、动画实现等。以下按高频考点分类整理,包含面试题及深度解析,帮助理解底层逻辑而非死记硬背。
一、CSS 基础概念与选择器
1. CSS 有哪些引入方式?各自的优缺点是什么?
CSS 引入方式主要有 4 种,核心区别在于加载时机、作用范围、维护成本:
引入方式 | 语法示例 | 优点 | 缺点 | 适用场景 |
内联样式 | <div style="color: red;">内容</div> | 优先级最高,可精准控制单个元素 | 样式与结构耦合,维护性差,无法复用 | 临时调试或单个元素特殊样式 |
内部样式表 | <style>div { color: red; }</style> | 样式与结构分离,作用于当前页面 | 无法跨页面复用,页面体积变大 | 单页面项目或小型组件 |
外部样式表 | <link rel="stylesheet" href="style.css"> | 样式可跨页面复用,维护性好,缓存友好 | 多一个 HTTP 请求(可通过打包优化) | 大型项目、多页面应用 |
@import 导入 | <style>@import url("style.css");</style> | 可在 CSS 内部导入其他 CSS,灵活拆分 | 依赖父 CSS 加载,可能导致样式延迟;不支持媒体查询条件导入 | 样式模块拆分(较少用,推荐外部样式表) |
2. CSS 选择器有哪些分类?请举例说明
选择器是 “找到页面元素并应用样式” 的规则,按功能可分为 6 大类:
分类 | 示例 | 说明 |
基础选择器 | 元素选择器(div)、类选择器(.box)、ID 选择器(#header)、通配符(*) | 最常用,直接匹配元素的标签、类名、ID 或所有元素 |
组合选择器 | 后代选择器(div .box)、子代选择器(div > .box)、相邻兄弟(div + p)、通用兄弟(div ~ p) | 基于元素间的关系匹配(父子、兄弟) |
伪类选择器 | 状态伪类(:hover/:active)、结构伪类(:nth-child(2)/:first-child)、否定伪类(:not(.box)) | 匹配元素的 “状态” 或 “位置”,而非元素本身 |
伪元素选择器 | ::before/::after、::first-letter、::selection | 创建 “虚拟元素”(如给元素加前缀 / 后缀),需配合 content 属性 |
属性选择器 | [type="text"]、[class^="box"](以 box 开头)、[class$="box"](以 box 结尾) | 基于元素的属性值匹配 |
嵌套选择器 | (Sass/LESS 中).box { .inner { color: red; } } | 嵌套写法,简化后代选择器(需预编译) |
3. 选择器的优先级如何计算?!important有什么作用?
选择器优先级决定了 “多个样式规则冲突时,哪条规则生效”,核心是权重计算,遵循 “specificity 规则”:
(1)优先级权重计算
权重按 “等级” 划分,等级越高,优先级越高,公式可简化为:
优先级 = 内联样式(1000) > ID 选择器(100) > 类/伪类/属性选择器(10) > 元素/伪元素选择器(1)
- 示例 1:#header .nav li → 权重 = 100(ID) + 10(类) + 1(元素) = 111
- 示例 2:div.nav::after → 权重 = 1(元素) + 10(类) + 1(伪元素) = 12
- 内联样式(style="")权重最高(1000),直接覆盖外部样式(除非外部样式加 !important)。
(2)!important的作用与注意事项
- 作用:强制提升单个样式规则的优先级,使其高于所有未加 !important 的规则(即使权重更低)。
例:.box { color: red !important; } 会覆盖 #header .box { color: blue; }。 - 注意事项:!important 只作用于 “单个样式规则”,而非整个选择器;内联样式加 !important 无法被外部样式覆盖;避免滥用:会破坏优先级逻辑,导致样式难以维护(仅在 “修复第三方样式” 等特殊场景使用)。
4. CSS3 新增了哪些核心特性?
CSS3 是 CSS 的升级标准,核心新增特性按功能分类:
- 选择器:结构伪类(:nth-child()/:last-child)、否定伪类(:not())、属性选择器([attr*="value"]);
- 盒模型与布局:box-sizing(控制盒模型计算方式)、Flex 布局、Grid 布局;
- 视觉效果:圆角(border-radius)、阴影(box-shadow/text-shadow)、渐变(linear-gradient/radial-gradient)、半透明(rgba/opacity);
- 动画与过渡:transition(平滑过渡)、animation(关键帧动画)、transform(2D/3D 变换);
- 其他:媒体查询(@media)、弹性盒(Flex)、多列布局(column-count)、自定义属性(--var)。
二、CSS 盒模型
盒模型是 CSS 布局的核心,描述 “元素在页面中占据空间的方式”,是面试必考点。
1. 标准盒模型与怪异盒模型(IE 盒模型)的区别是什么?
两者的核心差异是 **width/height 的计算范围不同 **:
盒模型类型 | width/height 包含范围 | 浏览器默认情况 |
标准盒模型 | 仅包含 “内容区(content)” | Chrome、Firefox、Edge 等现代浏览器默认 |
怪异盒模型 | 包含 “内容区(content)+ 内边距(padding)+ 边框(border)” | IE6/7/8(未加 DOCTYPE 时)默认 |
- 示例:一个元素设置 width: 200px; padding: 10px; border: 5px;标准盒模型:元素总宽度 = 200(content) + 102(padding) + 52(border) = 230px;怪异盒模型:元素总宽度 = 200px(已包含 content+padding+border),content 宽度 = 200 - 102 -52 = 170px。
2.box-sizing属性的作用是什么?常用值有哪些?
box-sizing 用于控制盒模型的计算方式,解决 “标准 / 怪异盒模型切换” 问题,是布局中必用属性:
- content-box(默认值):遵循标准盒模型,width/height 仅包含 content;
- border-box:遵循怪异盒模型,width/height 包含 content + padding + border;
- (较少用)padding-box:width/height 包含 content + padding(多数浏览器不支持)。
- 实践建议:开发中通常全局设置 * { box-sizing: border-box; },避免计算总宽度时频繁叠加 padding 和 border,减少布局 bug。
3. 什么是margin重叠?如何解决?
(1)定义
当两个或多个元素的垂直 margin(margin-top/margin-bottom)相邻时,会合并为一个 “最大 margin”,而非叠加,这就是 margin 重叠(水平 margin 不会重叠)。
(2)常见场景
- 相邻兄弟元素:上方元素的 margin-bottom 与下方元素的 margin-top 重叠,取两者最大值;
例:div1 { margin-bottom: 20px; } div2 { margin-top: 10px; } → 实际间距为 20px。 - 父元素与第一个 / 最后一个子元素:父元素的 margin-top 与子元素的 margin-top 重叠(或父元素 margin-bottom 与子元素 margin-bottom 重叠);
例:父元素无 padding/border,子元素 margin-top: 10px → 父元素会被 “带着” 向下移动 10px,而非子元素在父元素内下移。 - 空元素:当元素无内容、无 padding/border 时,margin-top 与 margin-bottom 重叠,取最大值。
(3)解决方法
核心思路:破坏 “margin 相邻” 的条件,常用方法:
- 给父元素添加 padding 或 border(分隔父子元素的 margin);
- 给父元素触发 BFC(见下文 “BFC” 考点);
- 相邻兄弟元素:用 padding 替代其中一个 margin,或用 Flex/Grid 布局(Flex 容器内的子元素不会发生 margin 重叠);
- 空元素:添加内容(如 )或设置 min-height: 1px。
三、CSS 布局(高频考点)
布局是 CSS 面试的重中之重,需掌握 Flex、Grid(现代布局) 和 浮动、定位(传统布局) 的核心原理与应用场景。
1. Flex 布局(弹性盒)的核心概念与常用属性
Flex 是 “弹性盒布局”,用于快速实现元素的水平 / 垂直居中、均匀分布、自适应排列,是目前最常用的布局方案之一。
(1)核心概念
- Flex 容器:给父元素设置 display: flex 后,父元素成为 Flex 容器;
- Flex 项目:Flex 容器的直接子元素,自动成为 Flex 项目;
- 主轴(main axis):Flex 项目排列的主要方向(默认水平向右,可通过 flex-direction 修改);
- 交叉轴(cross axis):与主轴垂直的方向(默认垂直向下);
- 主轴起点 / 终点:项目排列的开始 / 结束位置;
- 交叉轴起点 / 终点:项目在交叉轴上的开始 / 结束位置。
(2)Flex 容器的常用属性
属性 | 作用 | 常用值及说明 |
flex-direction | 控制主轴方向 | row(默认,水平向右)、row-reverse(水平向左)、column(垂直向下)、column-reverse(垂直向上) |
justify-content | 控制项目在主轴上的对齐方式 | flex-start(默认,左对齐)、center(居中)、flex-end(右对齐)、space-between(两端对齐,中间均匀)、space-around(均匀分布,两端留一半间距) |
align-items | 控制项目在交叉轴上的对齐方式 | stretch(默认,拉伸填满交叉轴)、center(居中)、flex-start(上对齐)、flex-end(下对齐)、baseline(按文字基线对齐) |
flex-wrap | 控制项目是否换行 | nowrap(默认,不换行,项目压缩)、wrap(换行,向下折行)、wrap-reverse(换行,向上折行) |
align-content | 控制多行项目在交叉轴上的对齐方式 | 类似 justify-content,值包括 |
(3)Flex 项目的常用属性
属性 | 作用 | 常用值及说明 |
flex-grow | 项目的 “放大比例”(空间多余时) | 默认为 0(不放大);值为 1 则项目平分多余空间,值为 2 则占比是 1 的 2 倍 |
flex-shrink | 项目的 “缩小比例”(空间不足时) | 默认为 1(自动缩小);值为 0 则项目不缩小(避免内容被压缩) |
flex-basis | 项目在主轴上的 “初始尺寸” | 默认为 auto(按内容尺寸);可设具体值(如 200px),优先级高于 width/height |
flex | 缩写属性(flex-grow/shrink/basis) | 常用值:flex: 1(= 1 1 auto,自适应拉伸 / 缩小)、flex: none(= 0 0 auto,不拉伸不缩小) |
align-self | 单独控制某个项目在交叉轴上的对齐方式 | 覆盖容器的 align-items,值包括 center/flex-start/stretch 等 |
(4)经典场景:用 Flex 实现水平垂直居中
.parent {
display: flex;
justify-content: center; /* 主轴(水平)居中 */
align-items: center; /* 交叉轴(垂直)居中 */
height: 500px; /* 必须有高度,否则容器会随内容收缩 */
}
.child {
width: 200px;
height: 200px;
}
2. Grid 布局(网格布局)的核心概念与应用场景
Grid 是 “网格布局”,用于实现二维布局(同时控制行和列),比 Flex 更灵活,适合复杂布局(如仪表盘、卡片网格)。
(1)核心概念
- Grid 容器:父元素设置 display: grid 后成为 Grid 容器;
- Grid 项目:容器的直接子元素;
- 网格线(Grid Lines):分隔行 / 列的线(如 3 列有 4 条垂直网格线);
- 网格轨道(Grid Tracks):行或列的 “轨道”(即行高 / 列宽);
- 网格单元格(Grid Cell):行与列交叉形成的最小单位(如 2 行 2 列有 4 个单元格);
- 网格区域(Grid Area):多个单元格合并形成的区域。
(2)Grid 容器的核心属性
属性 | 作用 | 示例 |
grid-template-columns | 定义 “列轨道” 的宽度 | grid-template-columns: 200px 1fr 1fr → 3 列,第一列 200px,后两列平分剩余空间 |
grid-template-rows | 定义 “行轨道” 的高度 | grid-template-rows: 100px auto 100px → 3 行,高度分别为 100px、自适应、100px |
gap(缩写) | 定义网格单元格之间的间距(行间距 + 列间距) | gap: 10px 20px → 行间距 10px,列间距 20px;gap: 10px → 行 / 列间距均为 10px |
justify-items | 控制项目在 “单元格水平方向” 的对齐方式 | center(居中)、stretch(默认,拉伸填满)、start(左对齐) |
align-items | 控制项目在 “单元格垂直方向” 的对齐方式 | center(居中)、stretch(默认)、start(上对齐) |
(3)经典场景:用 Grid 实现 2 行 3 列的卡片网格
.card-container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3 列,每列平分空间(repeat 表示重复) */
grid-template-rows: 200px 200px; /* 2 行,每行高 200px */
gap: 15px; /* 单元格间距 15px */
padding: 20px;
}
.card {
background: #f5f5f5;
border-radius: 8px;
}
3. 浮动(Float)布局的原理与清除浮动的方法
浮动是早期布局方案(用于实现 “文字环绕图片” 或 “多列布局”),但会导致 “父元素高度塌陷”,需手动清除。
(1)浮动的原理
给元素设置 float: left/right 后,元素会:
- 脱离 “文档流”(不再占据原来的位置,后续元素会向上移动);
- 向指定方向(左 / 右)移动,直到碰到父元素边界或其他浮动元素;
- 浮动元素的父元素会 “塌陷”(无法感知浮动元素的高度,导致父元素高度为 0)。
(2)清除浮动的 4 种常用方法
清除浮动的核心是 “让父元素感知到浮动元素的高度”,常用方法:
- 额外标签法:在浮动元素的最后添加一个空标签,设置 clear: both;
缺点:增加无意义标签,语义化差。
<div class="parent">
<div class="float-left">浮动元素</div>
<div style="clear: both;"></div> <!-- 额外空标签 -->
</div>
- 父元素触发 BFC:给父元素添加 overflow: hidden(或 auto/scroll),触发 BFC 后父元素会包裹浮动元素;
优点:代码简洁;缺点:若父元素内有超出内容,会被截断(需谨慎使用)。
.parent { overflow: hidden; } /* 触发 BFC,清除浮动 */
.float-left { float: left; }
- 伪元素清除法(推荐):给父元素添加 ::after 伪元素,模拟 “额外标签”,不影响语义;
优点:无额外标签,兼容性好(支持 IE8+)。
.parent::after {
content: ""; /* 伪元素必须有 content */
display: block; /* 转为块级元素 */
clear: both; /* 清除左右浮动 */
visibility: hidden;/* 隐藏伪元素(可选,不影响功能) */
height: 0; /* 减少空间占用(可选) */
}
.parent { zoom: 1; } /* 兼容 IE6/7(触发 hasLayout) */
- 父元素也浮动:给父元素设置 float: left/right,父元素会包裹浮动子元素;
缺点:父元素也脱离文档流,可能影响后续布局,不推荐。
4. 定位(Position)的 5 个值及其区别
position 用于控制元素的 “定位方式”,决定元素在页面中的位置,5 个值的核心区别是定位基准不同:
定位值 | 定位基准 | 是否脱离文档流 | 应用场景 |
static | 无(默认值,按文档流排列) | 否 | 正常布局,不用于定位 |
relative | 相对于元素自身的初始位置 | 否(仍占据原位置) | 作为 absolute 元素的定位容器;微调元素位置 |
absolute | 相对于最近的已定位祖先元素( | 是(不占据原位置) | 弹窗、下拉菜单、绝对定位的组件 |
fixed | 相对于浏览器窗口(视口) | 是 | 导航栏、回到顶部按钮(滚动时位置固定) |
sticky | 初始按文档流排列,滚动到 “阈值” 时转为 fixed(相对于视口或父元素) | 否(滚动前占据原位置) | 列表标题、表格头部(滚动时固定在顶部) |
- 关键注意点:absolute 元素必须有 “已定位的祖先元素”(通常给父元素设 position: relative),否则会相对于 html 定位,导致布局混乱。
四、BFC 与层叠上下文
BFC 和层叠上下文是 CSS 中较难理解的概念,但对解决 “布局 bug”(如 margin 重叠、浮动塌陷)至关重要。
1. 什么是 BFC?如何触发 BFC?BFC 有哪些应用场景?
(1)定义
BFC(Block Formatting Context,块级格式化上下文)是一个 “独立的渲染区域”,区域内的元素布局不受外部影响,外部元素也不受区域内影响。
(2)触发 BFC 的条件(满足其一即可)
- 根元素(html);
- 浮动元素(float: left/right,且不为 none);
- 定位元素(" data-track="269">行内块元素(display: inline-block);
- 弹性盒容器(display: flex/inline-flex);
- 网格容器(display: grid/inline-grid);
- overflow 值为 hidden/auto/scroll(且不为 visible);
- 表格单元格(display: table-cell)。
(3)BFC 的应用场景
- 清除浮动:父元素触发 BFC 后,会包裹浮动子元素,解决 “父元素高度塌陷”;
- 防止 margin 重叠:将两个相邻元素分别放入不同的 BFC 容器中,垂直 margin 不会重叠;
- 实现自适应两列布局:左侧固定宽度(浮动),右侧触发 BFC(overflow: hidden),右侧会自动适应剩余宽度,且不会被左侧浮动元素覆盖。
2. 什么是层叠上下文?与 BFC 有什么区别?
(1)定义
层叠上下文(Stacking Context)是 “元素在页面 z 轴方向的渲染顺序规则”,决定了 “哪个元素在上方,哪个在下方”(类似 Photoshop 的图层)。
- 层叠顺序(从下到上):
背景 / 边框(层叠上下文容器) → 负 z-index 元素 → 文档流非定位元素 → 浮动元素 → 正 z-index 元素。
(2)层叠上下文与 BFC 的区别
对比维度 | BFC(块级格式化上下文) | 层叠上下文(Stacking Context) |
核心作用 | 控制 “块级元素的布局”(水平 / 垂直排列、margin 等) | 控制 “元素的 z 轴渲染顺序”(上下层叠关系) |
影响范围 | 仅在 “水平 / 垂直方向”(二维布局) | 仅在 “z 轴方向”(三维层叠) |
触发条件 | 如 overflow: hidden、display: flex 等 | 如 position: relative(z-index≠auto)、opacity<1、transform≠none 等 |
五、CSS 动画与过渡
1.transition与animation的区别是什么?
两者均用于实现 “动态效果”,但核心差异在于 “是否需要关键帧” 和 “控制灵活性”:
对比维度 | transition(过渡) | animation(动画) |
核心逻辑 | 从 “初始状态” 到 “结束状态” 的平滑过渡 | 基于 “关键帧(@keyframes)” 定义多个状态,可循环、暂停等 |
是否需要关键帧 | 不需要(仅需定义初始 / 结束状态) | 需要(必须用 @keyframes 定义关键帧) |
触发方式 | 需通过 “状态变化” 触发(如 hover、click) | 可自动触发(页面加载后),也可通过类名控制 |
循环性 | 默认执行一次,无法循环(需手动重置状态) | 可通过 animation-iteration-count 设置循环次数(如 infinite 无限循环) |
控制灵活性 | 低(仅支持简单过渡) | 高(支持暂停、反向、进度控制等) |
- 示例 1:transition 实现 hover 变色
.box {
width: 100px;
height: 100px;
background: red;
transition: background 0.3s ease; /* 过渡:背景色,0.3秒,缓动效果 */
}
.box:hover { background: blue; } /* 触发过渡的状态变化 */
- 示例 2:animation 实现循环旋转
.box {
width: 100px;
height: 100px;
background: red;
animation: rotate 2s linear infinite; /* 动画:rotate,2秒,匀速,无限循环 */
}
/* 定义关键帧 */
@keyframes rotate {
0% { transform: rotate(0deg); } /* 初始状态:0度 */
100% { transform: rotate(360deg); }/* 结束状态:360度 */
}
2.transform的常用属性有哪些?transform-origin有什么作用?
transform 用于实现元素的 “2D/3D 变换”(如平移、缩放、旋转),不会影响其他元素的布局(元素仍占据原位置)。
(1)常用transform属性值
类型 | 属性值 | 说明 |
2D 平移 | translate(x, y) / translateX(x) / translateY(y) | 沿 x/y 轴平移,单位可设 px 或百分比(百分比相对于元素自身尺寸) |
2D 缩放 | scale(x, y) / scaleX(x) / scaleY(y) | 沿 x/y 轴缩放,值为 1 是原尺寸,>1 放大,<1 缩小 |
2D 旋转 | rotate(deg) | 按顺时针旋转,单位为角度(deg),负值为逆时针 |
2D 倾斜 | skew(x, y) / skewX(x) / skewY(y) | 沿 x/y 轴倾斜,单位为角度(deg) |
3D 变换 | translate3d(x, y, z) / rotate3d(x, y, z, deg) / perspective(n) | 3D 平移、旋转、透视(模拟 3D 空间) |
(2)transform-origin的作用
- 定义 “transform 变换的中心点”(默认是元素的中心,即 50% 50%);
- 可设值:关键字:center(中心)、left/right(左右)、top/bottom(上下);具体值:px 或百分比(如 transform-origin: 0 0 表示左上角为中心点)。
- 示例:transform-origin: top center; rotate(30deg) → 以元素顶部中心为轴旋转 30 度。
六、CSS 兼容性与响应式
1. 如何处理 CSS 浏览器兼容性问题?
浏览器兼容性问题源于 “不同浏览器对 CSS 标准的支持程度不同”(如 IE 不支持 CSS3 特性),常用解决方案:
- 浏览器前缀(Vendor Prefixes):
给非标准 CSS 属性添加浏览器前缀,确保在特定浏览器中生效:Chrome/Safari:-webkit-(如 -webkit-border-radius);Firefox:-moz-(如 -moz-box-shadow);IE:-ms-(如 -ms-transform);Opera:-o-(如 -o-animation)。
实践建议:使用 Autoprefixer 工具自动添加前缀,无需手动编写。 - 条件注释(针对 IE):
为不同版本的 IE 加载专属 CSS(仅 IE 支持条件注释):
<!--[if IE 8]>
<link rel="stylesheet" href="ie8.css"> <!-- 仅 IE8 加载 -->
<![endif]-->
- 特性检测(Feature Detection):
使用 Modernizr 等工具检测浏览器是否支持某个 CSS 特性,再针对性处理:
if (Modernizr.borderradius) {
// 支持 border-radius 的浏览器
element.style.borderRadius = '8px';
} else {
// 不支持的浏览器(如 IE8),用背景图模拟圆角
element.style.background = 'url(rounded-bg.png)';
}
- 降级方案:
为不支持的特性提供 “替代方案”,确保功能可用(如用 float 替代 Flex 布局兼容 IE8)。
2. 什么是响应式设计?如何实现响应式布局?
(1)定义
响应式设计(Responsive Web Design)是 “让页面在不同设备(手机、平板、电脑)上自动适配屏幕尺寸” 的设计方案,核心是 “一次开发,多端适配”。
(2)实现响应式布局的 3 个核心要素
- 设置 viewport 元标签:
告诉浏览器 “如何解析页面尺寸”,避免移动端页面缩放异常(必须添加):
<meta name="viewport" content="width=device-width, initial-scale=1.0">
- width=device-width:页面宽度等于设备屏幕宽度;
- initial-scale=1.0:初始缩放比例为 1(无缩放)。
- 媒体查询(@media):
根据 “屏幕宽度、设备类型” 等条件,加载不同的 CSS 样式:
/* 默认样式(电脑端) */
.box { width: 25%; }
/* 平板端(屏幕宽度 ≤ 1024px) */
@media (max-width: 1024px) {
.box { width: 50%; }
}
/* 手机端(屏幕宽度 ≤ 768px) */
@media (max-width: 768px) {
.box { width: 100%; }
}
- 弹性单位:
使用相对单位替代固定单位(如 px),确保元素尺寸随屏幕变化:%:相对于父元素的百分比(如 width: 50%);rem:相对于根元素(html)的 font-size(如 html { font-size: 16px; },则 1rem = 16px);vw/vh:相对于视口宽度 / 高度的百分比(1vw = 视口宽度的 1%,1vh = 视口高度的 1%)。
七、常见易错问题
1.display: none、visibility: hidden、opacity: 0的区别是什么?
对比维度 | display: none | visibility: hidden | opacity: 0 |
是否占据空间 | 否(元素从文档流中移除) | 是(元素仍占据原位置) | 是(元素仍占据原位置) |
是否响应事件 | 否(元素不可见,也无法点击) | 否(元素不可见,无法点击) | 是(元素透明,但仍可点击) |
过渡动画支持 | 不支持(无法平滑显示 / 隐藏) | 支持(可通过 transition 平滑切换) | 支持(可通过 transition 平滑切换透明度) |
子元素继承 | 子元素也会被隐藏(无法单独显示) | 子元素可通过 visibility: visible 单独显示 | 子元素会继承透明度,但可通过 opacity: 1 覆盖 |
2.inline、block、inline-block元素的区别是什么?
对比维度 | inline(行内元素) | block(块级元素) | inline-block(行内块元素) |
排列方式 | 同行排列(不换行) | 独占一行(自动换行) | 同行排列(不换行) |
宽高设置 | 不可设置 width/height(由内容决定) | 可设置 width/height | 可设置 width/height |
margin/padding | 水平方向生效,垂直方向不生效 | 水平 / 垂直方向均生效 | 水平 / 垂直方向均生效 |
常见元素 | span、a、img、strong | div、p、h1-h6、ul、li | 自定义按钮、图标(如 button) |
3. 如何实现元素的水平垂直居中?(至少 3 种方法)
这是面试高频实践题,需结合不同布局方案回答:
- Flex 布局(推荐,简单高效):
.parent {
display: flex;
justify-content: center;
align-items: center;
height: 500px;
}
- Grid 布局(适合复杂布局):
.parent {
display: grid;
place-items: center; /* 等同于 justify-items: center + align-items: center */
height: 500px;
}
- 定位 + 负 margin(需知道子元素尺寸):
.parent {
position: relative;
height: 500px;
}
.child {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
height: 200px;
margin-top: -100px; /* 子元素高度的一半(负) */
margin-left: -100px;/* 子元素宽度的一半(负) */
}
- 定位 + transform(无需知道子元素尺寸):
.parent {
position: relative;
height: 500px;
}
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%); /* 自身尺寸的 50% 平移 */
}
- 定位 + transform(无需知道子元素尺寸):
.parent {
display: table-cell;
vertical-align: middle; /* 垂直居中 */
text-align: center; /* 水平居中(子元素需为 inline/inline-block) */
height: 500px;
width: 500px;
}
.child {
display: inline-block; /* 让子元素受 text-align 控制 */
}
总结
CSS 面试题的核心是 “理解底层原理 + 结合实践场景”,需重点掌握:
- 盒模型、选择器优先级、BFC 等基础概念;
- Flex/Grid 等现代布局的应用(高频考点);
- 浮动清除、水平垂直居中、响应式设计等实践问题;
- 兼容性处理、动画过渡等进阶知识。
建议结合实际项目练习,将理论转化为解决问题的能力,避免死记硬背。
猜你喜欢
- 2025-09-12 在 JAVASCRIPT 中创建 HTML 元素...
- 2025-09-12 不来看看这些 VUE 的生命周期钩子函数?| 原力计划
- 2025-09-12 模仿 youtube 迷你顶部进度条NProgress
- 2025-09-12 国外越来越多的“自拍死”:为一张美照几个赞丢命,值得么?
- 2025-09-12 CSS视觉格式化模型,你真的了解么?
- 2025-09-12 VR×GBA | From Mazu to the World: The Man Who Carved the City
- 2025-09-12 Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
- 2025-09-12 CSS :has()伪类:2025年最值得掌握的前端黑科技
- 2025-09-12 css权重及优先级规则_css权重顺序
- 2025-09-12 CSS隐藏空元素的神技::empty伪类让你的代码更优雅!
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)