前端高频面试题之CSS篇(二)

作者:程序员小寒日期:2025/11/30

1、如何实现两栏布局?

两栏布局指的是左边宽度固定,右边宽度自适应

DOM 结构如下:

1<body>
2  <div class="box">
3    <div class="left"></div>
4    <div class="right"></div>
5  </div>
6</body>
7

1.1 利用 flex 布局实现

实现思路:将父元素设为 flex 布局,左边元素宽度固定,右边元素设为 flex: 1,即自适应。

1.box {
2  display: flex;
3  width: 500px;
4  height: 100px;
5}
6.left {
7  width: 200px;
8  background: yellow;
9}
10.right {
11  flex: 1;
12  background: green;
13}
14

优点:布局灵活、响应式布局。

缺点:IE9 及以下不支持。

1.2 利用 float 布局实现

实现思路:将左边元素设置为浮动元素 float: left,右边元素用 margin-left,这样能让右边元素占据父元素剩余宽度。

1.box {
2  width: 500px;
3  height: 100px;
4}
5
6.left {
7  float: left;
8  width: 200px;
9  height: 100%;
10  background: yellow;
11}
12
13.right {
14  margin-left: 200px;
15  height: 100%;
16  background: green;
17}
18

优点:简单、支持 IE。

缺点:浮动易导致问题(如高度塌陷),不适合复杂布局。

1.3 利用 Grid 布局实现

实现思路:将父元素设为 grid 布局,并设置 grid-template-columns: 200px 1fr 即可。

1.box {
2  display: grid;
3  grid-template-columns: 200px 1fr;
4  width: 500px;
5  height: 100px;
6}
7
8.left {
9  background: yellow;
10}
11
12.right {
13  background: green;
14}
15

优点:二维布局强大,实现多栏布局十分方便。

缺点:IE9 及以下不支持,不适合一维布局。

1.4 利用 position 绝对定位实现

实现思路:父级为相对定位,右边子元素为绝对定位,并同时设置 left、right、top、bottom 值,以实现宽高的自动拉伸。

1.box {
2  position: relative;
3  width: 500px;
4  height: 100px;
5}
6
7.left {
8  width: 200px;
9  height: 100px;
10  background: yellow;
11}
12
13.right {
14  position: absolute;
15  left: 200px;
16  right: 0;
17  top: 0;
18  bottom: 0;
19  background: green;
20}
21

优点:可以精确控制位置。

缺点:脱离文档流,响应式差。

2、如何实现三栏布局?

三栏布局指的是页面分为三栏,左侧和右侧固定宽度,中间自适应。

DOM 结构如下:

1<body>
2  <div class="box">
3    <div class="left"></div>
4    <div class="center"></div>
5    <div class="right"></div>
6  </div>
7</body>
8

2.1 利用 flex 布局实现

1.box {
2  display: flex;
3  width: 500px;
4  height: 100px;
5}
6
7.left {
8  width: 100px;
9  background: yellow;
10}
11
12.center {
13  flex: 1;
14  background: pink;
15}
16
17.right {
18  width: 100px;
19  background: green;
20}
21

2.2 利用 float 布局实现

1.box {
2  width: 500px;
3  height: 100px;
4}
5
6.left {
7  float: left;
8  width: 100px;
9  height: 100px;
10  background: yellow;
11}
12
13.center {
14  height: 100px;
15  margin: 0 100px;
16  background: pink;
17}
18
19.right {
20  float: right;
21  width: 100px;
22  height: 100px;
23  background: green;
24}
25

这里需要注意,中间栏的 DOM 需要放在最后,以避免浮动元素影响,所以其 DOM 结构如下:

1<div class="box">
2  <div class="left"></div>
3  <div class="right"></div>
4  <div class="center"></div>
5</div>
6

2.3 利用 grid 布局实现

1.box {
2  display: grid;
3  grid-template-columns: 100px 1fr 100px;
4  width: 500px;
5  height: 100px;
6}
7
8.left {
9  background: yellow;
10}
11
12.center {
13  background: pink;
14}
15
16.right {
17  background: green;
18}
19

2.4 利用 position 绝对定位实现

1.box {
2  position: relative;
3  width: 500px;
4  height: 100px;
5}
6
7.left {
8  position: absolute;
9  left: 0;
10  width: 100px;
11  height: 100px;
12  background: yellow;
13}
14
15.center {
16  margin: 0 100px;
17  height: 100px;
18  background: pink;
19}
20
21.right {
22  position: absolute;
23  right: 0;
24  top: 0;
25  width: 100px;
26  height: 100px;
27  background: green;
28}
29

2.5 经典三栏布局之圣杯布局

圣杯布局实现三列布局左右列固定宽度、中间列自适应,其原理是通过相对定位和负边距来实现侧边栏的定位。

1<style>
2  .box {
3    padding: 0 150px 0 200px;
4  }
5
6  .wrapper::after {
7    display: table;
8    content: '';
9    clear: both;
10  }
11
12  .column {
13    float: left;
14    height: 200px;
15  }
16
17  .left {
18    width: 200px;
19    position: relative;
20    margin-left: -100%;
21    right: 200px;
22    background-color: aqua;
23  }
24
25  .center {
26    width: 100%;
27    background-color: red;
28  }
29
30  .right {
31    width: 150px;
32    margin-right: -150px;
33    background-color: green;
34  }
35</style>
36<body>
37  <div class="box">
38    <!-- 中间列 center 放第一个是为了在文档流中优先渲染,因为 DOM 是从上往下依次渲染的-->
39    <div class="center column">center</div>
40    <div class="left column">left</div>
41    <div class="right column">right</div>
42  </div>
43</body>
44

2.6 经典三栏布局之双飞翼布局

双飞翼布局实现三列布局左右列固定宽度、中间列自适应,其原理是通过使用嵌套的 div 元素来实现侧边栏的定位,以及使用负外边距将主内容区域撑开。

1<style>
2  .box {
3    background-color: red;
4    width: 100%;
5  }
6
7  .column {
8    float: left;
9    height: 200px;
10  }
11
12  .center {
13    margin: 0 150px 0 200px;
14  }
15
16  .left {
17    width: 200px;
18    background-color: aqua;
19    margin-left: -100%;
20  }
21
22  .right {
23    width: 150px;
24    background-color: green;
25    margin-left: -150px;
26  }
27</style>
28<body>
29  <div class="box column">
30    <div class="center">center</div>
31  </div>
32  <div class="left column">left</div>
33  <div class="right column">right</div>
34</body>
35

3、如何实现水平垂直居中?

3.1 文本类可以使用 line-heighttext-align

1.box {
2  width: 100px;
3  height: 100px;
4  line-height: 100px;
5  text-align: center;
6}
7

3.2 使用 flex 布局

1.box {
2  display: flex;
3  justify-content: center;
4  align-items: center;
5}
6

3.3 使用绝对定位 postion + transform/负 margin

1.parent {
2  position: relative;
3}
4.child {
5  position: absolute;
6  left: 50%;
7  top: 50%;
8  transform: translate(-50%, -50%);
9}
10

当元素固定宽度时,也可以用 负 margin 替代 transform

1.parent {
2  position: relative;
3  width: 200px;
4  height: 200px;
5  background-color: red;
6}
7
8.child {
9  width: 50px;
10  height: 50px;
11  position: absolute;
12  left: 50%;
13  top: 50%;
14  margin-top: -25px; /* 自身容器高度的一半 */
15  margin-left: -25px; /* 自身容器宽度的一半 */
16  background-color: green;
17}
18

3.4 使用 absolute + margin: auto

1.box {
2  position: absolute; 
3  inset: 0; 
4  margin: auto
5}
6
7

3.5 使用 Grid 布局

1.box {
2 display: grid; 
3 place-items: center;
4}
5
6

3.6 使用 table 布局

1.box {
2 display: table-cell;
3 vertical-align: middle;
4}
5
6

4、实现一个三角形

4.1 利用 border

在 CSS 中,实现三角形最常见的方法是利用元素的**边框(border)**属性。通过设置元素的宽度和高度为 0,然后调整边框的宽度和颜色,可以形成各种方向的三角形。

1.triangle {
2  width: 0;
3  height: 0;
4  border-left: 10px solid transparent;  /* 左透明 */
5  border-right: 10px solid transparent; /* 右透明 */
6  border-bottom: 30px solid red;       /* 底有颜色,形成向上三角 */
7}
8
9

4.2 使用 clip-path

1.triangle {
2  width: 100px;
3  height: 100px;
4  background: purple;
5  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);  /* 向上三角 */
6}
7

5、实现一个扇形

在上面画三角形的基础上,再增加样式 border-radius: 100%;即可实现一个扇形。

1.sector {
2  width: 0;
3  height: 0;
4  border-left: 10px solid transparent;
5  border-right: 10px solid transparent;
6  border-bottom: 30px solid red;
7  border-radius: 100%; /* 增加 border-radius */
8}
9

6、实现一个梯形

1.box {
2  width: 200px;
3  height: 60px;
4  position: relative;
5  margin: 32px auto;
6  font-size: 60px;
7  text-align: center;
8}
9
10.box::before {
11  content: '';
12  position: absolute;
13  top: 0;
14  right: 0;
15  bottom: 0;
16  left: 0;
17  background: red;
18  transform: perspective(.5em) rotateX(5deg);
19}
20

7、画一条 0.5px 的线

对于大部分普通屏幕来说,像素是最小的显示单位,因此定义 0.5px 是没有意义的,浏览器遇到小于 1px 时会向上取整渲染 1px,这个是浏览器渲染的局限性。

但是在一些高分辨率屏幕(如 Retina 屏幕)上,1 物理像素点可以被分成多个虚拟像素(比如 2x 屏幕将每个物理像素分为 4 个虚拟像素)。这样的话,1px 的物流像素就等于 2 个虚拟像素,所以 0.5px 也能被渲染出来。

所以对于普通屏幕来说,我们需要做一些兼容方案来渲染出 0.5px 的效果。

我们可以使用 CSS transform 缩放法 来实现 0.5px 的线,代码如下:

1.line {
2  height: 1px;
3  background-color: red;
4  transform: scaleY(0.5); /* 对高度进行垂直方向的缩放 */
5}
6
7

小结

上面是整理的前端面试关于 CSS 高频考察的布局和图形,如有错误或者可以优化的地方欢迎评论区指正。


前端高频面试题之CSS篇(二)》 是转载文章,点击查看原文


相关推荐


【Perfetto从入门到精通】2. 使用 Perfetto 追踪/分析 APP 的 Native/Java 内存
Lei_official2025/12/10

这个世界就是这样,你从失败中学到的东西可能比成功中学到的东西更多——《Android 传奇》 说起 Android APP 内存分析,我们第一时间想到的,往往是 Android Studio Profiler、MAT 这样的老牌工具,而 Perfetto 的出现,又为其提供了一种更加贴近底层的视角。而且相比于现有的工具,Perfetto 更加擅长于分析 Native 内存占用,可以说是补齐了工程师在这方面的短板。 在内存方向,我计划用2~3篇文章来介绍 Perfetto 的功能、特点、使用方


设计模式——责任链模式实战,优雅处理Kafka消息
KD2025/12/18

一、业务背景 Kafka接收消息,需要A,B,C...多种策略做处理,再通过http请求发送给下游。多种策略混在一起很难维护,通过责任链模式把每种策略的代码收敛到自己的Handler中 二、具体设计 classDiagram Handler <|-- StrategyAHandler Handler <|-- StrategyBHandler Handler <|-- UploadHandler Handler: +void handleUserData(UserContext, Handler


卷积神经网络CNN
代码洲学长2025/12/26

CNN简介 卷积神经网络就是一个包括卷积层和池化层的神经网络,主要应用于计算机视觉方面,应用场景包括图像分类、目标检测、面部解锁、自动驾驶等。 整体架构流程 CNN的主要结构为 输入层,隐藏层 和输出层,主体架构主要体现在隐藏层中的网络,依次为卷积层 池化层 然后全连接层直接输出。CNN分别进行了两场卷积和池化 ,最终通过三个全连接层进行输出。 卷积层结构图 input(32, 32, 3) conv(3, 3, 6) relu(30, 30, 6) pool(2, 2, 6)


Elasticsearch 8.13.4 动态同义词实战全解析
detayun2026/1/4

在搜索引擎的江湖里,“词不达意"往往是阻碍用户找到心仪内容的最后一道鸿沟。当用户搜索"番茄"时,如果你的库里只有"西红柿"和"圣女果”,传统的精确匹配只能让用户空手而归。同义词库,便是那把填补语义裂痕的钥匙。然而,在 Elasticsearch 8.13.4 这个版本中,我们不再满足于重启服务来更新词库的"笨办法",我们要的是如丝般顺滑的动态热更新。 今天,我们就来一场技术突围,深度剖析在 ES 8.13.4 时代,如何玩转动态同义词,让你的搜索引擎拥有"自我进化"的灵魂。 一、 告别"文件搬运


HarmonyOS一杯冰美式的时间 -- UIUtils基础功能
猫猫头啊2026/1/13

一、前言 最近在写状态管理相关的代码,发现 HarmonyOS 的 UIUtils 这个工具类还挺实用的。它主要解决一些状态管理框架在使用过程中遇到的边界问题,比如代理对象、V1/V2 混用、数据绑定这些场景。 今天顺手整理一下它的几个核心功能,方便以后查。 该系列依旧会带着大家,了解,开阔一些不怎么热门的API,也可能是偷偷被更新的API,也可以是好玩的,藏在官方文档的边边角角~当然也会有一些API,之前是我们辛辛苦苦的手撸代码,现在有一个API能帮我们快速实现的,希望大家能找宝藏。 如果您有


LeetCode 377 组合总和 Ⅳ
展菲2026/1/21

文章目录 摘要描述题解答案题解代码分析1. 动态规划的基本思路2. 初始状态3. 状态转移方程4. 为什么这样能计算出排列个数?5. 与组合问题的区别6. 优化:避免不必要的计算 示例测试及结果示例 1:nums = [1,2,3], target = 4示例 2:nums = [9], target = 3示例 3:nums = [1,2], target = 3示例 4:nums = [1], target = 1 时间复杂度空间复杂度进阶问题:如果数组中含有负数问题分析解决方


type-challenges(ts类型体操): 10 - 元组转合集
fxss2026/1/30

10 - 元组转合集 by Anthony Fu (@antfu) #中等 #infer #tuple #union 题目 实现泛型TupleToUnion<T>,它返回元组所有值的合集。 例如 type Arr = ['1', '2', '3'] type Test = TupleToUnion<Arr> // expected to be '1' | '2' | '3' 在 Github 上查看:tsch.js.org/10/zh-CN 代码 /* _____________ 你的代


用 Python 30 分钟做出自己的记事本
忘忧记2026/2/8

🌟 《零基础手把手:用 Python 30 分钟做出自己的记事本》 —— 不是照抄代码,而是理解每行代码的「灵魂」 🧩 第一步:为什么我们需要「基础窗口」?(新手必懂!) ❌ 常见错误:直接写 window.show() 但窗口不显示? ✅ 正确逻辑:程序运行流程图 #mermaid-svg-OKGSEAHaVwdJVXr3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyf


丰田正在使用 Flutter 开发游戏引擎 Fluorite
恋猫de小郭2026/2/17

近日,丰田汽车旗下子公司丰田互联北美公司宣布,即将开源基于 Flutter 的自主研发的游戏引擎 Flourite ,而实际上在此之前,Flutter 已经是丰田车机的开发 SDK 之一。 Toyota Connected North America,TCNA,是丰田的北美子公司,专注于车载软件、AI 等。 Fluorite 是首款完全集成 Flutter 的主机级(console-grade)游戏引擎,主要针对车载数字座舱(digital cockpit)和嵌入式低端硬件设计,已在 202


【深度学习基础篇04】从回归到分类:图像分类与卷积神经网络入门
ppppppatrick2026/2/25

【深度学习基础篇】从回归到分类:图像分类与卷积神经网络入门 文章目录 【深度学习基础篇】从回归到分类:图像分类与卷积神经网络入门一、前情提要:从回归实战到分类任务的核心转变回归与分类的核心区别:输出逻辑的本质不同分类任务的输出解码:从“置信度”到“类别标签” 二、图像分类的前提:理解图像的张量表示1. 图像的核心维度:通道×高度×宽度(C×H×W)2. 批量图像的张量格式:N×C×H×W3. 全连接层处理图像的痛点:维度爆炸 三、卷积的核心概念:从“局部感知”到特征提取1

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客