当前位置: 首页 > news >正文

【前端面试】CSS篇

布局与定位

父元素高度塌陷

什么是父元素高度塌陷?为什么会发生?

  • 当父元素内部只有浮动(float)的子元素时,子元素脱离文档流。
  • 父元素无法感知子元素高度,所以高度表现为 0。

如何解决父元素高度塌陷?

  1. 父元素设置固定高度(不推荐)
  2. 父元素触发 BFC(推荐,简单)
  3. 额外添加空标签清除浮动(不推荐)
  4. 伪元素清除浮动(推荐,无冗余标签)
  5. 双伪元素清除浮动(推荐,兼容性更好)

BFC

什么是 BFC?

BFC 是块级格式上下文,触发后父元素会包含浮动子元素,同时避免相邻块元素 margin 重叠,内部布局相对独立。

BFC 的触发条件有哪些?

  • float 不为 none(浮动元素会触发 BFC)
  • overflow 不为 visiblehiddenautoscroll
  • display: flow-rootflexgridinline-block
  • position: absolutefixed
  • contain: layout(CSS 新特性)

BFC 的特性和作用是什么?

特性解决的问题常用触发方式
包裹浮动子元素父元素高度塌陷overflow: hidden / display: flow-root
内部垂直 margin 不重叠元素间距不符合预期display: flow-root
不与浮动元素重叠自适应布局(如左侧固定,右侧自适应)overflow: hidden

Flex 布局

属性及子属性有哪些?作用是什么?

属性作用
display: flex开启 Flex 布局
flex-direction主轴方向(row / row-reverse / column / column-reverse
justify-content主轴对齐(flex-start / flex-end / center / space-between / space-around / space-evenly
align-items交叉轴对齐(flex-start / flex-end / center / baseline / stretch
align-content多行容器的交叉轴对齐
flex-wrap是否换行(nowrap / wrap / wrap-reverse
子属性作用
flex-grow剩余空间的放大比例
flex-shrink缩小比例
flex-basis元素初始占据空间
flexshorthand = flex-grow flex-shrink flex-basis
align-self单独设置子项在交叉轴的对齐方式(覆盖父容器 align-items
order控制子项的排列顺序(默认 0,数值越小越靠前,支持负数)

flex:1 与 flex:1 0 auto 的区别

flex:1 相当于 1 1 0%flex:1 0 auto 表示可放大但不缩小,初始宽度为 auto

flex: 1 是哪些属性组成的?

flex 实际上是 flex-growflex-shrinkflex-basis 三个属性的缩写。

flex:1 相当于 1 1 0%

  • flex-grow:定义项目的的放大比例;
  • flex-shrink:定义项目的缩小比例;
  • flex-basis: 定义在分配多余空间之前,项目占据的主轴空间,浏览器根据此属性计算主轴是否有多余空间。

Grid 布局

Grid 布局常用属性及作用

属性作用
display: grid / inline-grid开启 Grid 布局
grid-template-columns / grid-template-rows定义行列大小
gap / row-gap / column-gap行列间距
grid-auto-rows / grid-auto-columns自动生成行/列的大小
justify-items / align-items单元格内容对齐
justify-content / align-content整个 grid 容器对齐
grid-auto-flow元素自动排列方向(row / column / dense

Grid 子元素常用属性

属性作用
grid-column / grid-row指定元素跨几列或几行
grid-column-start / grid-column-end起始列 / 结束列
grid-row-start / grid-row-end起始行 / 结束行
grid-area指定子元素所在区域
justify-self / align-self单个元素对齐

grid-column: 1 / span 2 表示什么?

从第 1 列开始,占据 2 列宽度。

Grid 和 Flex 的区别?

  • Flex 是一维布局,Grid 是二维布局
  • 如果只处理一行一列,Flex 更简单
  • 复杂布局推荐 Grid

两栏 / 三栏布局

如何实现两栏布局

  • 浮动(float) :早期常用方案,需清除浮动防止高度塌陷
  • Flexbox:主流做法,父容器设为 display: flex,两个子项即可并排。
  • Grid:定义两列网格(如 grid-template-columns: 1fr 1fr),布局更灵活。

如何实现三栏布局?

  • 浮动(float) :左右两栏浮动,中间栏设置自适应宽度,需清除浮动。
  • Flexbox:父容器设为 display: flex,通过 flex: 1 实现中间栏自适应。
  • Grid:定义三列网格(如 grid-template-columns: 200px 1fr 200px),结构清晰、控制精确。

百分比 / Rem 布局

百分比布局与 Rem 布局有什么区别?

特性百分比Rem
参考对象父元素根元素(html
适用场景容器自适应宽度字体大小和全局统一布局
响应性随父元素变化可通过改变 html font-size 响应式缩放

父元素字体改变对 rem 的影响?

不受父元素影响,只受根元素 font-size 控制。

百分比单位的嵌套问题

多层百分比计算是相对父元素的大小,可能导致累计误差。

元素水平垂直居中

如何水平垂直居中一个元素?

  • FLex 布局(推荐)
  • Absolute + Transform
  • Grid 布局

多行文本或动态内容的居中怎么办?

  • Flex 或 Grid 都可以自动适应高度。
  • Absolute + transform 对内容高度变化敏感,需要容器固定高度。

浮动布局

浮动布局原理

  • 脱离文档流,不占父元素高度(可能导致父元素高度塌陷)
  • 同一容器内,浮动元素按顺序排列,左右对齐
  • 相邻非浮动元素会环绕浮动元素(文字环绕、inline-block 元素环绕)

浮动布局优缺点

  • 优点
    • 兼容性好,适用于旧版浏览器
    • 实现简单的左右排列布局
    • 可用于文字环绕效果(如图片与文字排版)
  • 缺点
    • 容易导致 父元素高度塌陷
    • 响应式布局不够灵活,需要计算百分比或清除浮动
    • 对复杂布局维护成本高(嵌套多层浮动容易错乱)
    • 水平居中、垂直居中不方便

float 左右同时设置会怎样?

元素按顺序排列,左浮动靠左,右浮动靠右,中间内容可能被压缩。

float 与 BFC 有什么关系?

BFC 可以包含浮动元素,从而避免父元素高度塌陷。

什么现代开发很少用浮动布局做主要布局?

因为 Flex / Grid 更灵活,可读性高,响应式适配简单,避免了浮动的坑。

盒模型

box-sizing

  • 标准盒模型 (content-box):total width = width + padding + border
  • IE 传统怪异盒模型 (border-box):width 包含 padding + border

盒模型场景题

Q1:content 大小为 100px,border 为 100px,问此时怪异盒模型的宽高

怪异盒模型下,width 属性描述的是 总宽度,不是 content 宽度。

  • 总宽 = content + border*2 = 100 + 100*2 = 300px
  • 总高 = 同理 = 300px

margin 重叠

什么是 margin 重叠?

  • 垂直方向相邻块级元素的 margin 会合并
  • 合并规则:取最大值,而不是累加

什么时候会发生 margin 重叠?

  • 相邻兄弟元素
  • 父子上下边距
  • 空块元素(无内容、无 padding、无 border

如何避免 margin 重叠?

给父元素加 padding 或触发 BFC 都可以阻止 margin 重叠。

定位与 z-index

position属性及区别

属性定位方式特点
static默认正常文档流,top/right/bottom/left 无效
relative相对定位保留在文档流,占据原位置,可偏移
absolute绝对定位脱离文档流,相对最近定位父元素偏移
fixed固定定位脱离文档流,相对视口固定
sticky粘性定位relative,当滚动到指定位置时表现为 fixed

z-index是干什么的?

  • 控制定位元素的堆叠顺序
  • 只对定位元素有效(relative/absolute/fixed/sticky
  • 数值越大,越靠前

CSS 选择器与优先级

  • CSS 选择器
    标签选择器、类选择器、ID 选择器、后代选择器、子元素选择器、相邻兄弟选择器、通用选择器和属性选择器
  • 优先级
    !important > 行内样式 > ID 选择器 > 类选择器、属性选择器和伪类选择器 > 标签选择器和伪元素选择器

CSS 样式冲突怎么办?

  • 控制作用域:使用模块化方案(CSS Module、Scoped CSS、BEM 命名、命名空间前缀)避免全局污染。
  • 提高优先级:通过更具体的选择器或使用 !important(仅在必要时)。
  • 加载顺序管理:确保样式文件按依赖顺序导入,后加载的覆盖前加载的。
  • 使用工程化工具:CSS-in-JS、Tailwind、PostCSS 等可隔离作用域。
  • 样式复用统一:通过变量、主题、组件封装减少冲突来源。
  • 调试排查:借助浏览器 DevTools 查看最终样式来源(Computed / Rules),定位冲突点。

渲染

重绘与回流

  • 回流(Reflow / Layout):元素几何属性发生变化,需要重新计算布局
    • 影响width/height/margin/padding/position/font-size
    • 触发:改变尺寸、位置、内容、字体、添加/删除 DOM 元素
    • 减少方式:批量修改 DOM / 使用 documentFragment / requestAnimationFrame
  • 重绘(Repaint / Paint):样式变化,但不影响布局
    • 影响color/background

单行 / 多行省略

单行省略

/* 单行省略 */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;

多行省略

/* 主要 Webkit 内核支持,非 Webkit 可用 JS 或其他方案。 */
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;

隐藏元素的方法

  1. display: none:不占空间,子元素不可见
  2. visibility: hidden:占空间但不可见
  3. opacity: 0:透明但仍可响应事件(可结合 pointer-events:none

display:none与 visibility:hidden区别

display:none 会触发回流,visibility:hidden 仅重绘,不影响布局。

CSS3

CSS3 新特性

  • Flex / Grid 布局
  • 过渡 transition / 动画 animation
  • 伪类与伪元素增强(:nth-child, :not, ::before, ::after
  • box-sizing:border-box
  • 媒体查询 @media
  • transform / translate / rotate / scale

单位区别

单位说明使用场景
px绝对像素精确尺寸,像素级控制
em相对父元素字体字体和布局相对父元素
rem相对根元素字体统一响应式布局
%相对父元素容器自适应
vw/vh相对视口全屏宽高布局

CSS 预处理器

对比维度LessSass(SCSS)
变量声明符号@$
语法风格更接近原生 CSS有 SCSS 和 Sass 两种语法。SCSS 类似 CSS;Sass 原生语法无花括号和分号,更简洁
混入(Mixins)无需声明,通过类名调用(加()可选),如 .mixin() { ... },然后 .class { .mixin(); }需用 @mixin 声明,@include 调用,如 @mixin name($param:value){},调用 @include name(value);
逻辑控制有限支持,逻辑控制能力较弱,循环需递归实现支持完整逻辑控制,如 @if@for@each@while
模块化依赖 @import,功能相对简单支持 @use@forward,是更现代的模块化方案,能避免命名冲突
编译方式可通过 JS(less.js)、命令行、构建工具编译可通过 Dart Sass(官方推荐)、Node Sass(已弃用)、命令行、构建工具编译
社区生态较稳定,但发展趋缓更活跃,功能更强大,生态更广,被更多大型框架和工具链采用

如何解决 1px

  1. 使用 transform 缩放
  2. 使用 border-image / box-shadow

will-change 属性

will-change 告诉浏览器元素将要变化的属性,提前优化渲染,提高动画流畅度,但不能滥用,适合 短时间动画或频繁变化元素

CSS 渲染层/合成层

浏览器如何创建渲染层?

渲染层是浏览器的独立图层,GPU 负责合成,常通过 transformopacitywill-change、固定定位等触发,用于优化动画和滚动性能。

CSS 怎么开启硬件(GPU)加速?

  • transform(当 3D 变换的样式出现时会使用 GPU 加速)
  • opacity
  • filter
  • will-change

原子化 CSS

基础类问题

什么是原子化 CSS?

原子化 CSS 就是把样式拆成最小的单一功能类,比如 text-red-500 是红色文本、p-4 是内边距 4px,HTML 里直接组合这些类就能实现样式,不用写自定义 CSS,核心是复用和提效。

和传统 CSS、预处理器的区别?

传统 CSS 是“先写样式类再引用”,预处理器只是加了变量、嵌套,本质还是手动写样式;原子化是“预设好原子类,直接组合用”,不用自己写样式,复用性和效率更高。

工具类问题

主流工具和特点?

最常用的是 Tailwind CSS,生态全、能自定义配置;Windi CSS 是它的优化版,编译更快;UnoCSS 更轻量,支持多预设,按需选就行。

Tailwind 怎么自定义配置?

tailwind.config.js 文件,在 theme.extend 里加自定义颜色、间距、断点,比如加个主色 primary: '#165DFF',之后就能用 text-primary 这种类,贴合项目设计规范。

怎么解决类名冗长?

@apply 把常用类合并成自定义类,或者组件化封装,重复的样式组合写到组件里;再就是开 JIT 模式,支持动态类名,也能减少堆砌。

优缺点与场景

优缺点和规避方法?

  • 优点:开发快、少冗余、样式统一、打包体积小。
  • 缺点:类名长、要记规则、极端个性化支持不足。
  • 规避:用 @apply 封装、自定义配置降低记忆成本,特殊样式扩展原子类就行。

适合什么项目?不适合什么?

  • 适合:中小型项目、快速迭代的 MVP、组件库,还有需要统一设计规范的团队。
  • 不适合:对 HTML 纯净度要求极高的项目,或者极端个性化、样式频繁变的场景。

深度延伸类

实现原理是什么?

核心是“预设规则+编译优化”,工具先预设好原子类规则,编译时转成 CSS,再通过 JIT 或 PurgeCSS 剔除没用的类,保证体积最小。

和 CSS Modules、BEM 的区别?

CSS Modules 是加哈希隔离样式,BEM 是按“块-元素-修饰符”命名,两者都要手动写样式;原子化是预设类直接用,不用写样式,天然避免冲突。

怎么处理兼容性?

Tailwind 默认带 Autoprefixer,会自动加浏览器前缀;再配合 PostCSS 插件,配置目标浏览器,特殊属性扩展原子类时加前缀,兼容就没问题.

http://www.dtcms.com/a/602109.html

相关文章:

  • 第六章,主从服务器
  • 16.udp_socket(三)
  • 【Git Merge branch】Git 合并提交(Merge Commit)的成因与清理:从本地修复到安全重写历史
  • 视觉学习篇——理清机器学习:分类、流程与技术家族的关系
  • 个人 网站备案 幕布wordpress黑群
  • 机器学习日报17
  • 沛县网站建设wordpress 标签 标题
  • 数字孪生IOC:让数据中心运维从“被动响应”到“主动预警”的智能革命
  • 长春作网站建设的公司wordpress上传到服务器发布
  • 炭黑仪:高精度材料分析的关键工具
  • C++条件判断与循环(一)(算法竞赛)
  • 电商网站维护网络销售是什么样的工作
  • 怎么给网站添加图标网页浏览器cookie
  • 贵州安顺建设主管部门网站信息可视化网站
  • 【计算几何 | 那忘算 11】旋转卡壳(附详细证明)
  • 动作识别3——mmpose和mmaction2
  • 潍坊做网站优化网站设计项目
  • 2025企业可观测平台选型指南:聚焦核心能力,构建面向未来的观测体系
  • 郑州网站建设最低价鼓楼徐州网站开发
  • java开源Socket.io服务器端长链接通信解决方案
  • 牛客2025秋季算法编程训练联赛4-基础组
  • 视频类网站怎么做软件开发专业技能
  • 具身智能-一文详解视觉-语言-动作(VLA)大模型1.前言2.VLA的进化之路:从单兵作战到三位一体3.拆解VLA的大脑:核心组件全解析 预训练视觉表征
  • 空口协议栈的介绍及CA对其的影响
  • 网站建设制作优化推广类电商文案
  • 网站空间购买价格电子商务以后能干什么
  • C语言编译预处理 | 探索C语言编译过程中的预处理环节
  • kubernetes(k8s)-扩缩容(工作负载HPA、节点)
  • 广告设计网站官网北京小程序定制开发
  • 做网站怎样收费的怎样更换网站模板