前端高频面试题之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篇(二)》 是转载文章,点击查看原文


相关推荐


还在为组件通信头疼?defineExpose让你彻底告别传值烦恼
良山有风来2025/11/28

最近在写Vue 3项目的时候,你是不是经常遇到这样的场景:父组件想要调用子组件里的方法,但在<script setup>里却不知道该怎么暴露出去? 每次都要翻文档查半天,最后可能还是用了不太优雅的解决方案。 别担心,今天我要给你介绍的defineExpose,就是专门解决这个痛点的神器。它能让你在<script setup>中轻松暴露组件方法,让组件通信变得前所未有的简单。 读完这篇文章,你不仅能掌握defineExpose的核心用法,还能学到几个实际项目中的最佳实践,从此再也不怕复杂的组件通信


你真的懂递归吗?没那么复杂,但也没那么简单
刘大华2025/11/25

大家好,我是大华。 很多初学者都觉得简单的递归还可以看得懂,稍微复杂些的复杂就觉得很难,甚至有些工作几年的同事也对其避而远之。 其实,只要掌握了正确的方法,递归并没有那么可怕! 一、什么是递归? 打个比方:想象一下,你站在一排长长的队伍里,你想知道你前面有几个人。 但你只能看到你前面那个人,看不到更前面的人。怎么办? 你问前面那个人:“兄弟,你前面有几个人?” 他也不知道,于是他又问更前面的人:“兄弟,你前面有几个人?” 就这样一直往前问…… 直到问到排在最前面的那个人,他说:“我前面没人,是0


Android模拟器检测全面指南:从基础到高级策略
陆业聪2025/11/23

一、核心检测维度与方法 检测Android模拟器的核心思路是识别其与真实设备在硬件、系统属性和行为特征上的差异。以下是经过实践验证的有效方法。 1.1 检查系统构建属性 模拟器的android.os.Build类中的属性值通常包含特定标识符,这是最基础的检测方式。 public static boolean isProbablyEmulator() { String model = Build.MODEL.toLowerCase(); String manufacturer =


Redis(138) Redis的模块如何开发?
Victor3562025/11/22

Redis 模块开发是一种扩展 Redis 功能的强大方式。通过模块,开发者可以向 Redis 添加新的命令、数据类型、事件处理器等。以下是开发 Redis 模块的详细步骤,包括必要的代码示例。 1. 包含必要的头文件 首先,需要包含 Redis 模块 API 的头文件 redismodule.h。该头文件定义了开发模块所需的所有函数和宏。 #include "redismodule.h" 2. 实现模块命令 每个模块命令对应一个处理函数。这些函数需要遵循特定的签名,即返回 int 类型,并接


C++对象模型_第五章_C++函数语义学
Mr_WangAndy2025/11/20

本文介绍C++对象模型之函数语义学,揭露C++成员函数的神秘面纱,探究C++多态的底层原理,虚继承,类型转换原理。 文章目录 第5章 函数语义学5.1 普通成员函数调用方式5.2虚成员函数、静态成员函数调用方式5.2.1 虚成员函数调用方式5.2.2 静态成员函数调用方式 5.3虚函数地址转换---vcall引入5.4 静动态类型、绑定,多态实现5.4.1 静态类型和动态类型5.4.2 静态绑定和动态绑定5.4.3 继承的非虚函数坑5.4.4 虚函数的动态绑定5.4.5 重


Android多SDK合并为单个JAR包的完整指南
安卓蓝牙Vincent2025/11/19

痛点 多 SDK 分散:每个功能模块单独提供 JAR,用户需要逐一集成和管理 调用复杂:不同模块间存在依赖和包名冲突,用户在项目中使用不方便 升级维护困难:每次更新都要同步多个 JAR,容易出错 一、核心原理 1.1 最推荐的方案:源码合并 + 下层库作为“源码目录”加入 多 SDK 合并时,最终有效的构建环境只有顶层 SDK,因此最稳定的方式是: 源码合并(sourceSets) + 移除模块依赖 + 将下层 SDK 作为源码目录引入(而不是 module) Android St


Python 的内置函数 super
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 super Python 的内置函数 super() 是一个非常重要的内置函数,主要用于在子类中调用父类(超类)的方法。这个函数在面向对象编程中扮演着关键角色,特别是在处理继承关系时。 基本用法 super() 最常见的用法是在子类的初始化方法中调用父类的初始化方法: class Parent: def __init__(self, name): self.name = name class Child(


Python 的内置函数 pow
IMPYLH2025/11/16

Python 内建函数列表 > Python 的内置函数 pow Python 的内置函数 pow() 是一个用于计算幂运算的强大工具。它有两种基本用法,可以计算数值的幂次方,也支持进行模运算。 基本语法 pow(base, exp) 参数说明 base:底数,可以是整数或浮点数exp:指数,可以是整数或浮点数 使用示例 基本幂运算: pow(2, 3) # 返回8 (2的3次方) pow(2.5, 2) # 返回6.25 (2.5的平方) 带模运算: pow(2,


🔥 “Solo Coding”的近期热度解析(截至 2025 年末)
LeonGao2025/11/15

🧠 一、概念回顾 Solo Coding 并不是新词,但在过去一年随着 AIGC 编程辅助工具(如 Copilot、Cursor、TabNine、ChatGPT Code Interpreter) 的普及,它被重新定义为: 一个人独立开发完整系统,但具备团队级效率。 这与传统意义的“独立开发者(Indie Developer)”不同,核心在于借助 AI 的合作力量,实现准团队式的个人生产力爆发。 📈 二、热度增长趋势 时间区间关键词趋势


Python 的内置函数 iter
IMPYLH2025/11/14

Python 内建函数列表 > Python 的内置函数 iter Python 的内置函数 iter() 用于创建一个迭代器对象,它可以将可迭代对象(如列表、元组、字典、集合等)转换为迭代器,从而支持逐个访问元素的操作。 基本语法 iter(iterable, sentinel) iterable:必需参数,表示要转换为迭代器的可迭代对象(如列表、字符串等)。sentinel:可选参数,用于指定迭代停止的条件值(主要用于自定义迭代行为)。 示例说明 基本用法(无 sentinel

首页编辑器站点地图

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

Copyright © 2025 聚合阅读