CSS面试题

1. 什么是语义化标签?

答:

HTML 语义化标签是指标签本身具有明确的意义 ,能够清晰表达结构和内容,使代码更具可读性和可维护性,同时有利于 SEO。

常见的语义化标签:

  • 结构标签:<header><nav><article><section><aside><footer>
  • 其他语义化标签:<figure><figcaption><time><mark>

优点:

  • 提高代码可读性,便于团队开发
  • 增强 SEO,搜索引擎更容易理解页面结构
  • 有助于无障碍访问(如屏幕阅读器更易解析)

2. ::before::after 中双冒号 :: 和单冒号 : 有什么区别?这两个伪元素的作用是什么?

答:

  • : 单冒号用于 CSS 伪类(如 :hover)。
  • :: 双冒号用于 CSS3 伪元素(如 ::before::after)。

::before::after 作用:

  • 伪元素用于在指定元素的内容前后插入内容,但不属于 DOM 结构(不会影响 JavaScript 事件)。
  • 常用于装饰性内容,如图标、背景、引号等。

示例:

css 复制代码
.box::before {
  content: "★ ";
  color: red;
}
.box::after {
  content: " ✔";
  color: green;
}

3. 如何关闭 iOS 键盘首字母自动大写?

答:

<input><textarea> 中添加 autocapitalize="off"

html 复制代码
<input type="text" autocapitalize="off">

或者:

html 复制代码
<textarea autocapitalize="none"></textarea>

此外,也可以使用 autocomplete="off" 来避免 iOS 设备自动填充历史记录。


4. 怎么让 Chrome 支持小于 12px 的文字?

答:

Chrome 默认不允许 小于 12px 的字体,但可以通过 transform: scale() 绕过限制:

css 复制代码
.small-text {
  font-size: 12px; /* 设定一个基础值 */
  transform: scale(0.8); /* 等效于 9.6px */
}

或者,使用 SVG

html 复制代码
<svg width="50" height="20">
  <text x="0" y="15" font-size="8px">小字体</text>
</svg>

特殊情况:

  • -webkit-text-size-adjust: none; 可以防止 iOS 浏览器放大小字体。
  • canvas 绘制的文本不受 12px 限制。

5. remem 的区别?

答:

单位 参考对象 继承性 适用场景
rem 相对 html 根元素 (font-size) 不会继承 适用于全局字号统一管理
em 相对父元素 font-size 会继承 适用于局部组件缩放

示例:

css 复制代码
html { font-size: 16px; } /* 1rem = 16px */
p { font-size: 1.5rem; }  /* 24px */

.parent { font-size: 20px; }
.child { font-size: 1.5em; } /* 1.5 * 20px = 30px */

使用建议:

  • rem 适合用于全局字体、间距(响应式设计)。
  • em 适合局部组件 ,可以继承缩放

6. iOS 系统中元素被触摸时产生的半透明灰色遮罩怎么去掉?

答:

iOS 设备在点击按钮或链接时,默认会有灰色半透明背景,可以使用 -webkit-tap-highlight-color 取消:

css 复制代码
button, a {
  -webkit-tap-highlight-color: transparent;
}

额外优化:

如果需要防止点击延迟,可以添加:

css 复制代码
html {
  touch-action: manipulation; /* 取消 300ms 延迟 */
}

7. WebKit 表单输入框 placeholder 颜色能改变吗?

答:

可以通过 ::placeholder 伪元素修改:

css 复制代码
input::placeholder {
  color: gray;
  opacity: 1; /* 默认 placeholder 透明度较低,需手动调整 */
}

针对 WebKit(Chrome, Safari)兼容性写法:

css 复制代码
input::-webkit-input-placeholder { color: red; }
input:-moz-placeholder { color: red; }
input::-moz-placeholder { color: red; }
input:-ms-input-placeholder { color: red; }

这样在不同浏览器下都能生效。


8. 说一下CSS的盒模型

CSS 盒模型(Box Model)决定了元素在网页中的排布方式,主要包含以下几部分:

  • 内容(content):元素的实际内容区域
  • 内边距(padding):内容与边框之间的距离
  • 边框(border):包裹内容和内边距的边框
  • 外边距(margin):元素与其他元素之间的距离

盒模型有两种:

  • 标准盒模型(content-box)width 只包含内容,不包含 paddingborder
  • IE 盒模型(border-box)width 包含 paddingborder,实际内容区域变小。

9. CSS选择器的优先级?

优先级计算规则:

  • 内联样式style=""):1000
  • ID 选择器#id):100
  • 类、伪类、属性选择器.class[attr]:hover):10
  • 元素、伪元素divp::before):1
  • 通配符、继承、!important
    • * 通配符和继承的样式优先级最低
    • !important 最高优先级,会覆盖所有规则

10. 隐藏元素的方法有哪些?

  • display: none;(元素消失,且不占空间)
  • visibility: hidden;(元素隐藏,但仍占空间)
  • opacity: 0;(透明,但仍占空间且可交互)
  • position: absolute; left: -9999px;(移动到屏幕外)
  • clip-path: inset(50%);(裁剪)
  • transform: scale(0);(缩放至 0)
  • z-index: -1;(可能被其他内容覆盖)
  • height: 0; overflow: hidden;(用于折叠效果)

11. 重绘重排有什么区别?

重绘(Repaint) vs 重排(Reflow)

重绘(Repaint)重排(Reflow) 都是浏览器渲染机制中的重要部分,但它们的影响和性能开销不同:

1. 重排(Reflow)

定义

  • 当元素的尺寸、位置、布局、结构发生变化时,浏览器需要重新计算元素的位置和大小,触发页面的重新布局。

触发重排的操作

  • 改变元素的 widthheight

  • 修改 marginpaddingborder-width

  • 改变 positionabsoluterelative)、topleftrightbottom

  • 修改 display(如 noneblock,影响整个 DOM 结构)

  • 修改 font-size

  • 添加或删除 DOM 元素

  • 读取某些属性时(浏览器需要计算最新的布局数据):

    js 复制代码
    element.offsetWidth;
    element.offsetHeight;
    element.clientWidth;
    element.clientHeight;
    element.getBoundingClientRect();

2. 重绘(Repaint)

定义

  • 当元素的样式发生变化但不影响布局时,浏览器只会重新绘制元素,而不会重新计算布局。

触发重绘的操作

  • colorbackgroundvisibility
  • border-color
  • box-shadow
  • opacity
  • outline
  • text-shadow

3. 哪个开销更大?

  • 重排(Reflow) 开销比 重绘(Repaint) 更大,因为它会重新计算布局,并可能影响整个页面的渲染树,导致更多的计算和绘制。
  • 重绘(Repaint) 仅涉及像素绘制,不会影响布局,因此相对开销较小。

4. 如何优化?

减少重排(Reflow):

  • 避免逐个修改样式 ,使用 class 统一修改:

    js 复制代码
    element.style.cssText = "width: 100px; height: 100px; margin: 10px;";

    js 复制代码
    element.classList.add("new-style");
  • 使用 documentFragment 批量操作 DOM ,避免频繁回流:

    js 复制代码
    const fragment = document.createDocumentFragment();
    for (let i = 0; i < 100; i++) {
        let div = document.createElement("div");
        div.innerText = i;
        fragment.appendChild(div);
    }
    document.body.appendChild(fragment);
  • 避免直接获取并修改布局属性 ,先缓存:

    js 复制代码
    const width = element.offsetWidth; // 读取
    element.style.width = width + 10 + "px"; // 修改

    优化方式:

    js 复制代码
    const width = element.offsetWidth;
    element.style.cssText = `width: ${width + 10}px;`;
  • 使用 transform 替代 top/left 移动元素

    css 复制代码
    /* 推荐 */
    transform: translateX(50px);
    
    /* 不推荐 */
    left: 50px;

减少重绘(Repaint):

  • 尽量减少使用 box-shadowopacity: 0.5 之类的复杂视觉效果

  • 避免大面积的颜色变化

  • 使用 will-change 让浏览器提前优化:

    css 复制代码
    will-change: transform, opacity;

总结

操作 影响 触发条件 开销
重排(Reflow) 影响布局 影响 widthheightdisplayposition
重绘(Repaint) 仅影响视觉 影响 colorbackgroundopacity

优化建议 :尽量减少 重排 ,适当优化 重绘,以提高页面性能! 🚀

12.让一个元素水平垂直居中的方式有哪些?

1. flexbox(推荐)
css 复制代码
.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
2. grid
css 复制代码
.parent {
  display: grid;
  place-items: center;
}
3. position + transform
css 复制代码
.child {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
4. margin: auto(适用于固定宽高元素)
css 复制代码
.child {
  width: 100px;
  height: 100px;
  position: absolute;
  top: 0; bottom: 0; left: 0; right: 0;
  margin: auto;
}
5. table-cell
css 复制代码
.parent {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}

13. SS的哪些属性哪些可以继承?哪些不可以继承?

可继承的属性(主要是文本相关)

  • color
  • font
  • font-size
  • font-family
  • letter-spacing
  • line-height
  • visibility
  • cursor

不可继承的属性(主要是盒模型、布局、定位)

  • width / height
  • margin / padding
  • border
  • display
  • position
  • top / left / right / bottom
  • z-index
  • overflow
  • box-shadow

强制继承方法

css 复制代码
all: inherit;

强制不继承

css 复制代码
all: initial;

14 . 有没有用过预处理器?

是的,我使用过 CSS 预处理器,比如:

  • Sass / SCSS
    • 变量($color-primary: #3498db;
    • 嵌套(.parent { .child { color: red; } }
    • Mixin(@mixin flex { display: flex; }
    • 继承(@extend .base;
  • Less
    • 变量(@color: red;
    • 嵌套(类似 SCSS)
    • Mixin(.mixin() {}

预处理器的优势:

  • 代码复用,提高可维护性
  • 解决 CSS 变量问题(CSS 变量 var() 现在也支持)
  • 复杂项目中更易管理样式

15.** line-heightheight 的区别**

  • height:元素的总高度(包含内容和 padding)
  • line-height:行高,控制文本的垂直间距,影响文本在行内的居中效果

示例

css 复制代码
p {
  height: 100px;
  line-height: 50px;
}
  • height: 100px; 代表 p 这个盒子的高度
  • line-height: 50px; 影响文本的行间距,但不会改变盒子的实际高度

4. CSS 优先级算法

计算规则:

  • 内联样式style=""):1000
  • ID 选择器#id):100
  • 类、伪类、属性选择器.class[attr]:hover):10
  • 元素、伪元素divp::before):1
  • !important 最高优先级(会覆盖所有规则)

16. 用 CSS 画一个三角形

css 复制代码
.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 50px solid red;
}

17. 一个盒子不给 widthheight 如何水平垂直居中?

css 复制代码
.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
.child {
  background: red;
}

flex 方式能自动适配内容大小,无需 widthheight


18. display有哪些值?说明他们的作用。

  • none:隐藏元素,不占空间
  • block:块级元素,占满一行
  • inline:行内元素,内容决定宽度
  • inline-block:行内块元素,可设置宽高
  • flex:弹性布局
  • grid:网格布局
  • table / table-cell:表格布局

**19. 对BFC规范(块级格式化上下文:block formatting context)的理解?

**

BFC(块级格式化上下文)的详细理解

1. 什么是 BFC(Block Formatting Context,块级格式化上下文)?

BFC 是 CSS 中的一个布局概念 ,它决定了元素如何进行块级布局 ,以及元素之间如何相互影响 。简单来说,BFC 就像是一个独立的容器 ,里面的元素不会影响外部元素的布局,并且有一些特殊的排版规则。


2. BFC 的特性

BFC 具备以下几个关键特性:

  1. BFC 内部的元素不会影响外部元素

    • BFC 是一个独立的布局区域,内部元素的浮动、边距折叠等行为不会影响外部元素。
  2. BFC 内部的子元素不会和外部的浮动元素重叠

    • BFC 具有包裹浮动元素的能力,可以清除浮动。
  3. BFC 可以防止 margin 重叠(外边距折叠)

    • 同一个 BFC 内部的相邻块元素会发生外边距折叠
    • 不同 BFC 之间的块元素,不会发生外边距折叠
  4. BFC 计算高度时会包含浮动元素

    • 如果一个 div 里面的内容全是浮动元素,默认情况下 div 的高度会塌陷,而 BFC 可以避免这个问题。

3. 触发 BFC 的方式

想让一个元素变成 BFC(即开启 BFC),可以通过以下几种方式:

css 复制代码
.bfc {
  float: left; /* 方式1 */
  overflow: hidden; /* 方式2 */
  display: flex; /* 方式3 */
  display: inline-block; /* 方式4 */
  position: absolute; /* 方式5 */
  position: fixed; /* 方式6 */
}
方式 说明
float: left/right; 触发 BFC,元素变成浮动块
overflow: hidden/auto/scroll; 触发 BFC,常用于清除浮动
display: flex; 触发 BFC,开启弹性布局
display: inline-block; 触发 BFC,但不会独占一行
position: absolute/fixed; 触发 BFC,但脱离文档流

4. BFC 的应用场景
(1)清除浮动

浮动元素不会撑开父元素的高度,导致父元素塌陷:

css 复制代码
.parent {
  background: lightblue;
}

.child {
  float: left;
  width: 100px;
  height: 100px;
  background: red;
}

解决方案

css 复制代码
.parent {
  overflow: hidden; /* 触发 BFC */
}
(2)防止 margin 发生重叠

默认情况下,相邻块级元素的 margin 会发生合并:

css 复制代码
.div1, .div2 {
  margin: 20px;
  background: lightcoral;
}

解决方案

css 复制代码
.div1 {
  overflow: hidden; /* 触发 BFC,阻止 margin 合并 */
}
(3)避免浮动元素影响外部布局

当页面有多个浮动元素时,可能会影响后续元素的布局:

css 复制代码
.float-box {
  float: left;
  width: 100px;
  height: 100px;
  background: lightgreen;
}

.normal-box {
  width: 200px;
  height: 100px;
  background: orange;
}

解决方案

css 复制代码
.container {
  overflow: hidden; /* 触发 BFC */
}

5. 总结
BFC 特性 作用
独立布局 BFC 内的元素不会影响外部布局
清除浮动 解决父元素高度塌陷问题
防止 margin 重叠 让相邻元素的 margin 不会合并
阻止浮动影响其他元素 避免浮动导致的布局异常

BFC 是 CSS 中非常重要的概念,合理利用它可以解决很多常见的布局问题!


20. 清除浮动有哪些方式?

清除浮动的方式

在 CSS 中,浮动(float)会导致父元素高度塌陷 ,从而影响布局。因此,我们需要清除浮动来恢复父元素对浮动元素的包裹能力。以下是几种常见的清除浮动的方法:


方式 1:使用 overflow 触发 BFC(推荐)

原理: overflow: hidden; 触发 BFC,BFC 内部会包裹所有浮动元素,从而解决高度塌陷问题。

css 复制代码
.clearfix {
  overflow: hidden;
}

适用于: 简单清除浮动,不需要滚动条时。

⚠️ 注意overflow: hidden; 可能会隐藏超出容器的内容,使用时要注意。


方式 2:使用 clearfix 伪元素(推荐)

原理: 通过 ::after 伪元素生成一个块级元素,并使用 clear: both; 清除浮动。

css 复制代码
.clearfix::after {
  content: "";
  display: block;
  clear: both;
  visibility: hidden;
  height: 0;
}

适用于: 适用于任何情况,是一种比较通用的解决方案。


方式 3:使用 clear: both; 在额外的标签上

原理: 在浮动元素后面增加一个 div,并设置 clear: both;,让其占据一整行,迫使浮动元素结束。

html 复制代码
<div class="container">
  <div class="float-box"></div>
  <div class="clear"></div> <!-- 清除浮动 -->
</div>
css 复制代码
.clear {
  clear: both;
}

适用于: 需要兼容老旧浏览器,但会增加额外的 DOM 结构。


方式 4:使用 display: flow-root;

原理: display: flow-root; 触发 BFC,从而包裹浮动元素。

css 复制代码
.clearfix {
  display: flow-root;
}

适用于: 现代浏览器(IE 不支持),代码简洁。


方式 5:给父元素 float(不推荐)

原理: 让父元素也浮动,这样它就能包裹住内部的浮动元素。

css 复制代码
.parent {
  float: left;
  width: 100%;
}

缺点: 父元素本身变成浮动,可能会影响后续布局。


总结

方法 适用场景 优势 缺点
overflow: hidden; 适合大部分情况 简单易用 可能隐藏超出部分
clearfix::after 通用,推荐 兼容性好 需要额外 CSS
clear: both; 结构允许时 兼容性好 需要额外 div
display: flow-root; 现代浏览器 简洁 IE 不支持
float: left; 旧方案,不推荐 兼容性强 影响布局

推荐做法:

  1. overflow: hidden;(最简单)
  2. clearfix::after(通用、无副作用)
  3. display: flow-root;(现代浏览器)

这样可以根据项目需求选择最佳方案! 🚀


21. 在网页中应该使用奇数还是偶数的字体?为什么?

建议使用偶数字体(如 12px、14px),因为:

  • 偶数字体在屏幕渲染时更加均匀,减少模糊感
  • 现代屏幕对偶数像素的字体优化更好

22.position的值有哪些?分别是根据什么定位的?

  • static(默认,按文档流)
  • relative(相对自身原始位置)
  • absolute(相对最近的 position: relative 祖先)
  • fixed(相对视口)
  • sticky(介于 relativefixed 之间)

23.双飞翼布局

双飞翼布局(Double Wing Layout)

双飞翼布局 是一种经典的三栏布局方式 ,适用于两侧固定宽度,中间自适应的页面结构。它的核心特点是:

  • 中间内容优先渲染,保证主内容的优先加载。
  • 两侧宽度固定,中间区域自适应宽度,适配不同屏幕。

📌 实现方式

1️⃣ HTML 结构

html 复制代码
<div class="container">
  <div class="main">主内容</div>
  <div class="left">左侧栏</div>
  <div class="right">右侧栏</div>
</div>

2️⃣ CSS 样式

css 复制代码
* {
  margin: 0;
  padding: 0;
}

.container {
  width: 100%;
}

.main {
  float: left;
  width: 100%; /* 先让主内容占满整个屏幕 */
  background: lightblue;
}

.left,
.right {
  width: 200px; /* 两侧固定宽度 */
  height: 100px;
  position: relative;
}

.left {
  float: left;
  background: lightcoral;
  margin-left: -100%; /* 让左侧栏移动到最左边 */
}

.right {
  float: left;
  background: lightgreen;
  margin-left: -200px; /* 让右侧栏移动到正确位置 */
}

/* 让 main 内容有足够的 padding,避免被侧边栏遮挡 */
.main-content {
  margin: 0 200px;
  height: 100px;
  background: white;
}

📌 解析

  1. main 先设置 width: 100% 让其占满整个父容器,确保主内容优先渲染。
  2. leftright 通过 float: left 排列 ,并使用 position: relative 确保其可以正确偏移。
  3. left 通过 margin-left: -100% 向左移动,确保它占据父容器的最左侧。
  4. right 通过 margin-left: -200px 移动到正确的位置 ,避免 left 影响其布局。
  5. main 内部的 .main-content 设置 margin 让出 leftright 的宽度,避免被遮挡。

📌 双飞翼布局 vs 圣杯布局

布局 关键点 实现方式
双飞翼布局 main 先占满全屏,两侧使用 margin-left 调整位置 需要 margin 解决内容遮挡
圣杯布局 main 先占满全屏,然后用 relative 调整 leftrightposition 依赖 position: relative

📌 适用场景

  • 电商网站(左侧分类栏,右侧广告栏,中间产品列表)
  • 博客页面(左侧导航,右侧推荐文章,中间文章内容)
  • 后台管理系统(左侧菜单栏,右侧辅助功能栏,中间主要内容)

📌 结论

双飞翼布局是一种经典的三栏布局 ,它利用 floatmargin 来实现 两侧固定,中间自适应 的结构,确保主内容优先渲染,并且适配各种屏幕尺寸。如果要兼容现代布局,可以使用 flexgrid 来实现更灵活的三栏布局。


🚀 现代写法(Flex 版本推荐)

css 复制代码
.container {
  display: flex;
}

.left,
.right {
  width: 200px;
  background: lightcoral;
}

.main {
  flex: 1;
  background: lightblue;
}

24.什么是 CSS Reset?

CSS Reset(CSS 重置)是指清除浏览器默认样式,使不同浏览器中的页面样式保持一致,避免默认样式干扰。

常见的 CSS Reset
css 复制代码
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

或者使用 normalize.css,它比 reset.css 更注重保留有用的默认样式。


25. CSS Sprite(雪碧图)

概念

CSS Sprite(CSS 精灵图)将多个小图标合并成一张大图片 ,然后通过 background-position 来显示不同部分的图像。

优点
  • 减少 HTTP 请求(多个图标变成一个)
  • 提升页面性能
  • 避免闪烁
缺点
  • 不易维护 (每次更改图标都需要重新修改 background-position
  • 适用于小图标,不适合大背景图
使用示例
css 复制代码
.icon {
  width: 50px;
  height: 50px;
  background: url("sprite.png") no-repeat;
}

.icon-home { background-position: 0 0; }
.icon-user { background-position: -50px 0; }

26 display: none; vs visibility: hidden;

属性 影响 占据空间 交互
display: none; 隐藏元素,且不占据空间 不占空间 无法交互
visibility: hidden; 隐藏元素,但仍占据空间 占空间 无法交互
示例
css 复制代码
.hidden-display {
  display: none; /* 元素完全从文档流中移除 */
}

.hidden-visibility {
  visibility: hidden; /* 仅隐藏,仍占据空间 */
}

27 opacity vs rgba

属性 作用 影响子元素 交互
opacity: 0; 设置元素透明度(0 = 完全透明,1 = 不透明) 会影响子元素透明度 无法交互
rgba(r, g, b, a); 设置颜色的透明度(a = 0~1) 不会影响子元素 仍可交互
示例
css 复制代码
.opacity-box {
  opacity: 0.5; /* 整个盒子透明,子元素也会受影响 */
}

.rgba-box {
  background: rgba(255, 0, 0, 0.5); /* 仅背景色半透明,子元素不受影响 */
}

🚀 推荐使用 rgba 处理背景透明度,使用 opacity 处理整体透明效果!

28.如何让浮动元素和周围的内容等高

如何让浮动元素和周围的内容等高?

浮动元素(float)不会自动撑开父元素的高度,因此如果旁边有非浮动内容,它们可能会出现高度不一致的情况。以下是几种常见的 让浮动元素和周围内容等高 的方法:


✅ 方法 1:使用 display: flex;(推荐)

原理 :使用 flexbox 让子元素等高,兼容性好,代码简洁。

css 复制代码
.container {
  display: flex;
}

.left, .right {
  width: 200px;
  background: lightcoral;
}

.main {
  flex: 1;
  background: lightblue;
}
html 复制代码
<div class="container">
  <div class="left">左侧</div>
  <div class="main">中间内容</div>
  <div class="right">右侧</div>
</div>

优点:简单高效,适用于现代浏览器。


✅ 方法 2:使用 display: table;

原理 :模拟表格的 table-cell 让各列等高。

css 复制代码
.container {
  display: table;
  width: 100%;
}

.column {
  display: table-cell;
  vertical-align: top;
}

.left, .right {
  width: 200px;
  background: lightcoral;
}

.main {
  background: lightblue;
}
html 复制代码
<div class="container">
  <div class="column left">左侧</div>
  <div class="column main">中间内容</div>
  <div class="column right">右侧</div>
</div>

优点 :兼容 IE8+,适用于不支持 flex 的情况。


✅ 方法 3:使用 position: absolute; + 100% height

原理 :让浮动元素的高度等于 container 的高度。

css 复制代码
.container {
  position: relative;
}

.left, .right {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 200px;
  background: lightcoral;
}

.left {
  left: 0;
}

.right {
  right: 0;
}

.main {
  margin: 0 200px;
  background: lightblue;
}
html 复制代码
<div class="container">
  <div class="left">左侧</div>
  <div class="main">中间内容</div>
  <div class="right">右侧</div>
</div>

优点:适用于需要固定侧边栏高度的场景。


✅ 方法 4:使用背景色模拟(适用于装饰需求)

原理 :利用 background 让父元素的背景色延伸到底部,而不是真正让内容等高。

css 复制代码
.container {
  background: linear-gradient(to right, lightcoral 200px, lightblue 200px, lightblue calc(100% - 200px), lightcoral calc(100% - 200px));
}
html 复制代码
<div class="container">
  <div class="left">左侧</div>
  <div class="main">中间内容</div>
  <div class="right">右侧</div>
</div>

优点:适用于仅需视觉上等高的情况。


总结

方法 适用场景 兼容性 复杂度
flexbox(推荐) 现代布局,兼容性较好 IE10+
display: table 兼容 IE8+ IE8+ ⭐⭐
position: absolute 固定布局时 IE7+ ⭐⭐
背景色模拟 仅视觉等高,不影响布局 全浏览器

🚀 推荐使用 flexbox,如果需要兼容老旧浏览器,可以考虑 display: table

29.如何解决 CSS 塌陷问题(清除浮动)

CSS 塌陷(Collapse) 是指:

当父元素内的子元素全部使用 float 浮动时,父元素无法自动撑开高度,导致父元素高度塌陷,影响后续布局。


🎯 为什么会出现塌陷?

浮动元素脱离了文档流,父元素不会自动计算其高度:

css 复制代码
.container {
  background: lightblue;
}

.box {
  float: left;
  width: 100px;
  height: 100px;
  background: red;
}
html 复制代码
<div class="container">
  <div class="box"></div>
</div>

问题 :父 .container 没有高度,背景色无法撑开!


✅ 解决 CSS 塌陷的方法

1️⃣ 使用 clearfix 伪元素(推荐)

原理

  • ::after 伪元素中添加 clear: both;,让父元素自动包裹浮动子元素。

🚀 代码

css 复制代码
.clearfix::after {
  content: "";
  display: block;
  clear: both;
  visibility: hidden;
}
html 复制代码
<div class="container clearfix">
  <div class="box"></div>
</div>

优点:简单高效,推荐使用。


2️⃣ 让父元素 overflow: hidden;

原理

  • overflow: hidden; 让父元素自动识别浮动的子元素。

🚀 代码

css 复制代码
.container {
  background: lightblue;
  overflow: hidden;
}
html 复制代码
<div class="container">
  <div class="box"></div>
</div>

适用于大多数情况,但可能隐藏超出部分的内容!


3️⃣ 让父元素 display: flow-root;(现代方案)

原理

  • display: flow-root; 让父元素变成 BFC(块级格式化上下文),自动包含浮动内容。

🚀 代码

css 复制代码
.container {
  display: flow-root;
  background: lightblue;
}
html 复制代码
<div class="container">
  <div class="box"></div>
</div>

现代浏览器支持,推荐使用!


4️⃣ 让父元素 float: left;

原理

  • 让父元素本身浮动,从而包裹子元素。

🚀 代码

css 复制代码
.container {
  float: left;
  background: lightblue;
}

缺点:影响父元素的文档流,不推荐。


5️⃣ 使用 clear: both; 清除浮动

原理

  • 在浮动元素之后添加一个 clear: both; 的空 div,让浮动元素的影响终止。

🚀 代码

css 复制代码
.clear {
  clear: both;
}
html 复制代码
<div class="container">
  <div class="box"></div>
  <div class="clear"></div>
</div>

缺点:需要额外的 HTML 结构,不推荐。


🔹 总结

方法 适用场景 兼容性 推荐指数
clearfix 伪元素 通用 IE6+ ⭐⭐⭐⭐⭐
overflow: hidden; 内容不会溢出 IE6+ ⭐⭐⭐⭐
display: flow-root; 现代浏览器 IE 不支持 ⭐⭐⭐⭐
float: left; 影响布局 IE6+ ⭐⭐
clear: both; 需要额外标签 IE6+ ⭐⭐

🚀 最佳实践 :推荐使用 clearfix 伪元素display: flow-root; 解决 CSS 塌陷问题!

30. CSS 相邻 margin 重叠(外边距塌陷)问题及解决方案

📌 什么是 margin 重叠?

当两个垂直方向的 margin 相邻时,它们不会相加,而是取较大值,这称为 外边距塌陷(Margin Collapse)

📍 发生情况
  1. 相邻块元素之间
  2. 父子元素之间
  3. 空元素内的 margin

✅ 解决 margin 重叠的方法

1️⃣ 让其中一个 margin 变为 padding(推荐)

✔ 原理padding 不会与 margin 发生塌陷。

css 复制代码
.parent {
  background: lightblue;
  padding-bottom: 10px; /* 用 padding 代替 margin */
}

.child {
  margin-top: 20px;
  background: lightcoral;
}
html 复制代码
<div class="parent">
  <div class="child">子元素</div>
</div>

优点 :不会改变布局,仅调整 padding


2️⃣ 用 overflow: hidden; 触发 BFC

✔ 原理BFC(块级格式化上下文)可以隔离 margin 重叠。

css 复制代码
.parent {
  background: lightblue;
  overflow: hidden;
}

.child {
  margin-top: 20px;
  background: lightcoral;
}

优点:不会影响外部布局,兼容性好。


3️⃣ 使用 display: flex; 触发 BFC

css 复制代码
.parent {
  background: lightblue;
  display: flex;
  flex-direction: column;
}

.child {
  margin-top: 20px;
  background: lightcoral;
}

优点flex 容器不会出现 margin 重叠。


4️⃣ 使用 borderpadding 触发 BFC

✔ 原理border 会阻止 margin 重叠。

css 复制代码
.parent {
  background: lightblue;
  border: 1px solid transparent;
}

.child {
  margin-top: 20px;
  background: lightcoral;
}

优点:简单易用,不影响布局。


📌 总结

解决方案 适用场景 兼容性 推荐指数
padding 替代 margin(推荐) 适用于父子关系 全部支持 ⭐⭐⭐⭐⭐
使用 overflow: hidden; 触发 BFC 适用于兄弟元素 全部支持 ⭐⭐⭐⭐
使用 display: flex; 适用于 flex 布局 现代浏览器 ⭐⭐⭐⭐
使用 border 触发 BFC 适用于需要保留 margin 全部支持 ⭐⭐⭐

🚀 最佳实践 :优先使用 padding 代替 marginoverflow: hidden; 触发 BFC 来解决 margin 重叠问题!

31. 📌 什么是 IFC(Inline Formatting Context,内联格式化上下文)?

IFC(内联格式化上下文) 是 CSS 中的一种布局模式,专门用于内联元素(inline-level elements) 的排列与计算。它主要用于处理 文本流行内盒子(inline box) 的布局。


🎯 IFC 的特点

  1. 水平方向排列

    • 内联元素(如 spanastrong)会 从左到右(或从右到左,取决于 direction 依次排列。
    • 遇到 换行符行宽不足 时会自动换行。
  2. 高度由内容决定

    • IFC 不会 影响块级元素的布局,它的高度由 行高(line-height 决定。
  3. 不会影响外部布局

    • 只影响自身内部的行内元素,不会影响外部的块级元素。
  4. marginpadding

    • 水平方向marginpadding 生效。
    • 垂直方向margin-topmargin-bottom 不会影响 IFC ,但是 line-height 会影响行间距。
  5. 不能包含块级元素

    • IFC 内部 不能 存在 divp 等块级元素,否则会破坏 IFC,变成 BFC(块级格式化上下文)。

📍 IFC 的使用场景

1️⃣ 让文本内容水平居中

display: inline-block;text-align: center; 的环境下,文本或行内元素可以轻松居中:

css 复制代码
.container {
  text-align: center;
}
html 复制代码
<div class="container">
  <span>我是居中的文本</span>
</div>

2️⃣ 避免 margin 影响行内元素的垂直方向

css 复制代码
.container {
  background: lightblue;
}

span {
  margin: 20px;  /* 只有水平方向的 margin 生效 */
  background: lightcoral;
}
html 复制代码
<div class="container">
  <span>行内元素</span>
  <span>行内元素</span>
</div>

适用场景 :适用于文本排版,避免 margin 影响块级元素。


3️⃣ 让多个 inline-block 元素等高

问题 :多个 inline-block 元素的对齐可能受 line-height 影响。
解决方案 :统一 vertical-align: top; 或者 middle;

css 复制代码
.container {
  font-size: 0; /* 避免空格影响 */
}

.box {
  display: inline-block;
  width: 100px;
  height: 100px;
  background: lightcoral;
  vertical-align: top;
}
html 复制代码
<div class="container">
  <div class="box"></div>
  <div class="box"></div>
</div>

适用场景:用于水平排列的按钮、图标布局等。


4️⃣ text-overflow: ellipsis; 省略长文本

css 复制代码
.ellipsis {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  width: 200px;
  display: inline-block;
}
html 复制代码
<span class="ellipsis">这是一段超长的文本,会被省略...</span>

适用场景:超长文本处理。


📝 IFC 与 BFC 的区别

特性 IFC(内联格式化上下文) BFC(块级格式化上下文)
元素类型 处理 行内级元素 处理 块级元素
布局方向 水平方向(从左到右排列) 垂直方向(独立容器)
影响 margin 上下 margin 无效line-height 控制间距 上下 margin 叠加
是否换行 自动换行 (遇到 line-break 不会自动换行
常见属性 text-alignline-heighttext-overflow overflow: hidden;display: flow-root;
应用场景 文本排版、按钮、导航 布局、清除浮动、避免 margin 叠加

📌 结论

🚀 IFC(内联格式化上下文) 主要用于 行内文本、内联元素的排列 ,适用于 文本对齐、按钮布局、长文本省略 等场景。

如果要控制块级布局 ,推荐使用 BFC(块级格式化上下文) 解决 margin 叠加、清除浮动等问题。

32.圣杯布局是什么如何实现

🎯 什么是圣杯布局?

圣杯布局(Holy Grail Layout) 是一种 经典的三栏布局,结构如下:

  • 中间内容区域宽度自适应
  • 左右侧边栏固定宽度 (例如 200px
  • 要求
    1. 三列等高
    2. 中间列优先加载
    3. 左右列可自由调整宽度

🔨 圣杯布局的实现方式

✅ 方法 1:使用 float 实现(经典)

css 复制代码
.container {
  padding: 0 200px; /* 预留左右空间 */
  overflow: hidden; /* 触发 BFC,清除浮动 */
}

.main {
  float: left;
  width: 100%;
  background: lightblue;
}

.left {
  float: left;
  width: 200px;
  margin-left: -100%;
  background: lightcoral;
  position: relative;
  left: -200px;
}

.right {
  float: left;
  width: 200px;
  margin-left: -200px;
  background: lightgreen;
  position: relative;
  right: -200px;
}
html 复制代码
<div class="container">
  <div class="main">中间内容</div>
  <div class="left">左侧栏</div>
  <div class="right">右侧栏</div>
</div>

📌 解释

  1. main 先加载width: 100% 让它占满父容器。
  2. leftright 通过 margin-left: -100% 让其移动到正确位置
  3. position: relative; left/right 解决 margin-left 覆盖的问题
  4. 父容器 padding: 0 200px; 预留两侧空间,避免内容遮挡。

优点 :经典、兼容性好(支持 IE)。

缺点float 已被 flexgrid 替代。


✅ 方法 2:使用 flex 实现(推荐)

css 复制代码
.container {
  display: flex;
}

.main {
  flex: 1;
  background: lightblue;
}

.left, .right {
  width: 200px;
  background: lightcoral;
}
html 复制代码
<div class="container">
  <div class="left">左侧栏</div>
  <div class="main">中间内容</div>
  <div class="right">右侧栏</div>
</div>

优点

  • 代码简洁,flex: 1 让中间自适应
  • 无需负 marginposition 调整
  • 兼容性 现代浏览器支持(IE10+)

✅ 方法 3:使用 grid 实现

css 复制代码
.container {
  display: grid;
  grid-template-columns: 200px auto 200px;
}

.left {
  background: lightcoral;
}

.main {
  background: lightblue;
}

.right {
  background: lightgreen;
}
html 复制代码
<div class="container">
  <div class="left">左侧栏</div>
  <div class="main">中间内容</div>
  <div class="right">右侧栏</div>
</div>

优点

  • 最现代化的方式
  • grid-template-columns: 200px auto 200px; 让中间自适应
  • 代码最简洁

缺点

  • 需要 现代浏览器支持(IE 不支持)

🎯 总结

方法 适用场景 兼容性 难度 推荐指数
float 版 旧项目、兼容 IE IE6+ 较难 ⭐⭐⭐
flex 版 现代布局、响应式 IE10+ 简单 ⭐⭐⭐⭐⭐
grid 版 现代布局 IE 不支持 最简单 ⭐⭐⭐⭐⭐

🚀 推荐使用 flexgrid 实现圣杯布局,float 仅用于旧项目!

33.nth-child和nth-of-type区别

🎯 nth-childnth-of-type 的区别

两者都是 CSS 伪类选择器 ,用于选择 特定序号 的元素,但它们的工作方式不同。


nth-child(n)

  • 匹配父元素中的第 n 个子元素(不论类型)
  • 不会忽略 其他不同类型的兄弟元素

示例

html 复制代码
<ul>
  <li>Item 1</li>
  <p>Paragraph 1</p>
  <li>Item 2</li>
  <li>Item 3</li>
  <p>Paragraph 2</p>
</ul>
css 复制代码
li:nth-child(2) {
  color: red;
}

🔹 效果 :给 第二个子元素<p>Paragraph 1</p>)加样式,但它不是 <li>,所以不会匹配任何元素。


nth-of-type(n)

  • 匹配父元素中 n 个相同类型(tag name)的元素
  • 忽略不同类型的兄弟元素

示例

css 复制代码
li:nth-of-type(2) {
  color: blue;
}

🔹 效果 :只匹配 第二个 <li> ,即 Item 2忽略 <p> 标签


📌 主要区别

选择器 计算方式 忽略不同类型元素? 适用场景
nth-child(n) 按所有子元素的顺序计算 不忽略(计算所有元素) 适用于严格按顺序定位
nth-of-type(n) 按相同类型的元素顺序计算 忽略(仅计算相同类型) 适用于特定类型元素定位

🎯 什么时候用 nth-child,什么时候用 nth-of-type

nth-child(n)

  • 你需要按照 DOM 结构中的顺序选中某个元素,无论它是什么标签
  • 示例 :选中某个固定顺序 的元素(比如第 3 个子元素

nth-of-type(n)

  • 你需要选中特定类型的第 N 个元素
  • 示例 :选中某种标签的第 N 个 (比如第二个 <li>

🚀 结论

  • nth-child 适合严格按 DOM 结构匹配
  • nth-of-type 更适合同类型元素的匹配

34. 什么是弹性布局(Flexbox)?

弹性布局(Flexbox,Flexible Box Layout) 是一种 CSS 布局模式 ,专门用于 一维布局 (单行或单列排列的元素),可以方便地控制元素的对齐、间距和大小 ,而无需依赖 floatposition


📌 弹性布局的核心概念

弹性布局由 父容器(flex 容器)子项(flex 项目) 组成。

✅ 1. 让容器变成弹性布局

css 复制代码
.container {
  display: flex;
}

📌 display: flex; 会让子元素变成弹性项目(flex items),并默认排列在 水平方向row)。


✅ 2. 主要属性

📍(1)父容器(flex 容器)的属性
属性 作用 常见值
display 定义弹性布局 flex / inline-flex
flex-direction 子元素排列方向 row(默认), row-reverse, column, column-reverse
justify-content 水平方向对齐 flex-start, flex-end, center, space-between, space-around, space-evenly
align-items 垂直方向对齐 stretch(默认), flex-start, flex-end, center, baseline
align-content 多行时的对齐 stretch, flex-start, flex-end, center, space-between, space-around
flex-wrap 是否换行 nowrap(默认), wrap, wrap-reverse

📍(2)子元素(flex 项目)的属性
属性 作用 说明
flex-grow 放大比例 1 表示可以增长,占满剩余空间
flex-shrink 缩小比例 1 表示可以缩小
flex-basis 初始宽度/高度 auto(默认),也可以指定像素值
flex 组合属性 flex: 1; = flex: 1 1 0%;
align-self 单个元素对齐 auto, flex-start, flex-end, center, baseline, stretch

📌 示例:常见的弹性布局

✅ 水平居中 & 垂直居中

css 复制代码
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 300px;
  background: lightgray;
}
.box {
  width: 100px;
  height: 100px;
  background: lightblue;
}
html 复制代码
<div class="container">
  <div class="box">居中</div>
</div>

📌 原理

  • justify-content: center;水平居中
  • align-items: center;垂直居中

✅ 圣杯/双飞翼布局(左右固定,中间自适应)

css 复制代码
.container {
  display: flex;
}
.left, .right {
  width: 200px;
  background: lightcoral;
}
.main {
  flex: 1; /* 占满剩余空间 */
  background: lightblue;
}
html 复制代码
<div class="container">
  <div class="left">左侧栏</div>
  <div class="main">中间内容</div>
  <div class="right">右侧栏</div>
</div>

📌 原理

  • flex: 1; 让中间区域自适应填充剩余空间。

✅ 多行换行

css 复制代码
.container {
  display: flex;
  flex-wrap: wrap;
}
.box {
  width: 100px;
  height: 100px;
  margin: 5px;
  background: lightgreen;
}
html 复制代码
<div class="container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

📌 原理

  • flex-wrap: wrap; 让子项自动换行。

🎯 总结

🚀 Flexbox 是 CSS 处理 一维布局(横向/纵向排列) 最灵活的方式,适用于:

  1. 居中对齐(水平/垂直居中)
  2. 自适应布局(圣杯布局、响应式导航栏)
  3. 等高布局(多列布局)
  4. 网格排布 (结合 flex-wrap

🌟 推荐用 flex 代替 floatposition,更现代、简洁!

35.🎯 什么是 Grid 布局?

Grid 布局(CSS Grid Layout) 是一种 二维布局 方式,允许开发者 同时控制行(row)和列(column),适用于复杂的页面布局。

💡 区别

  • Flexbox 主要用于 一维布局 排列)。
  • Grid 适用于 二维布局 (既控制 ,又控制)。

📌 基本概念

✅ 1. 让容器成为 Grid

css 复制代码
.container {
  display: grid;
}

🚀 display: grid; 让子元素变成网格项,受 grid 规则控制。


✅ 2. 定义网格

css 复制代码
.container {
  display: grid;
  grid-template-columns: 100px 200px auto;
  grid-template-rows: 50px 100px auto;
}

🔹 含义

  • grid-template-columns :定义列的宽度
    • 100px → 第 1 列宽 100px
    • 200px → 第 2 列宽 200px
    • auto → 第 3 列宽 自动填充剩余空间
  • grid-template-rows :定义行的高度
    • 50px → 第 1 行高 50px
    • 100px → 第 2 行高 100px
    • auto → 第 3 行高 自适应

✅ 3. fr 单位(推荐使用)

css 复制代码
.container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;
}

📌 fr 表示 可用空间的比例

  • 1fr2fr1fr 表示:
    • 第一列占 1 份
    • 第二列占 2 份
    • 第三列占 1 份

✅ 4. gap(网格间距)

css 复制代码
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 10px; /* 行列间距 */
}

🔹 简化了 margin 处理,不会影响子元素的尺寸!


📌 子元素控制

✅ 1. grid-column(跨列)

css 复制代码
.item {
  grid-column: 1 / 3; /* 让元素从第 1 列 跨到 第 3 列 */
}

🔹 作用 :让元素跨 两列 (从 1 → 3)。


✅ 2. grid-row(跨行)

css 复制代码
.item {
  grid-row: 2 / 4; /* 让元素从第 2 行 跨到 第 4 行 */
}

🔹 作用 :让元素跨 两行 (从 2 → 4)。


✅ 3. grid-area(指定具体区域)

css 复制代码
.item {
  grid-area: 2 / 1 / 4 / 3; /* 行起始 / 列起始 / 行结束 / 列结束 */
}

🔹 作用 :让元素 精准定位到网格的某个区域


📌 示例:经典三栏布局

💡 左右固定,中间自适应

css 复制代码
.container {
  display: grid;
  grid-template-columns: 200px auto 200px;
  grid-gap: 10px;
}
.left {
  background: lightcoral;
}
.middle {
  background: lightblue;
}
.right {
  background: lightgreen;
}
html 复制代码
<div class="container">
  <div class="left">左侧</div>
  <div class="middle">中间内容</div>
  <div class="right">右侧</div>
</div>

📌 实现原理

  • grid-template-columns: 200px auto 200px; 让左右 200px 固定 ,中间 自适应
  • grid-gap: 10px; 控制间距

🎯 Grid vs Flexbox(什么时候用?)

布局方式 特点 适用场景
Flexbox 一维布局(横排或竖排) 导航栏、按钮组
Grid 二维布局(同时控制行和列) 整体页面布局、复杂网格

🚀 推荐:

  • 简单排版flex
  • 复杂布局grid

💡 Grid 强大但稍复杂,Flex 适合日常用!

36. 📌 pt、px、em、rem、%、vw、vh、rpx 的区别

在 CSS 中,单位决定了元素的大小,以下是常见的单位及其特点:


📌 1. px(像素)

  • 固定单位 ,表示屏幕上的像素点
  • 不会随屏幕大小或字体大小变化
  • 适用场景 :适用于需要精确控制尺寸的元素,如边框、固定宽高的元素等。

🔹 示例

css 复制代码
.box {
  width: 100px;
  font-size: 16px;
}

📌 特点

  • 在高清屏幕(Retina 屏幕)下,px 可能会出现模糊,需要用 @media 适配。

📌 2. pt(点)

  • 印刷单位 ,1pt = 1/72 英寸(≈ 1.33px)。
  • 主要用于 打印排版网页开发不常用

🔹 示例

css 复制代码
p {
  font-size: 12pt; /* 适用于打印 */
}

📌 特点

  • 在屏幕上 ptpx 几乎无差别 ,但在 打印设备 (如 PDF、打印机)中 pt 更精准。

📌 3. em(相对单位,相对于父元素的 font-size

  • 相对于父元素的 font-size
  • 可继承 ,适用于局部缩放

🔹 示例

css 复制代码
.parent {
  font-size: 20px;
}
.child {
  font-size: 1.5em; /* 1.5 × 20px = 30px */
}

📌 特点

  • 适用于层级嵌套的元素。
  • 多个 em 嵌套可能会导致尺寸累积(放大或缩小过多)

📌 4. rem(相对单位,相对于根元素 htmlfont-size

  • 相对于 htmlfont-size(默认 16px
  • 不会受父级影响 ,适合全局适配

🔹 示例

css 复制代码
html {
  font-size: 16px;
}
.box {
  font-size: 2rem; /* 2 × 16px = 32px */
}

📌 特点

  • 适用于响应式布局
  • 不受父元素影响 ,避免了 em 可能导致的累积放大问题。

📌 5. %(相对单位,相对于父元素的尺寸)

  • 用于 宽高(widthheight ,相对于父元素的尺寸。
  • 适用于流式布局 (如 flexbox)。

🔹 示例

css 复制代码
.parent {
  width: 500px;
}
.child {
  width: 50%; /* 50% × 500px = 250px */
}

📌 特点

  • 相对父元素,若父元素尺寸改变,子元素会自动调整。
  • 不能用于 font-size ,但可以用于 line-height

📌 6. vw(视口宽度,Viewport Width)

  • 相对于视口宽度1vw = 视口宽度的 1%
  • 适用于全屏适配,如 banner、全屏背景

🔹 示例

css 复制代码
.box {
  width: 50vw; /* 视口宽度的一半 */
}

📌 特点

  • 适用于全屏自适应布局
  • 窗口大小变化时,元素尺寸也会变化

📌 7. vh(视口高度,Viewport Height)

  • 相对于视口高度1vh = 视口高度的 1%
  • 适用于满屏元素(如 height: 100vh

🔹 示例

css 复制代码
.fullscreen {
  height: 100vh; /* 占满整个视口高度 */
}

📌 特点

  • 适用于全屏背景、弹窗、满屏页面布局
  • 移动端键盘弹出可能会影响 vh 计算100vh 可能不等于实际可视高度)。

📌 8. rpx(微信小程序单位)

  • 相对于屏幕宽度自适应750rpx = 设备宽度(无论 iPhone 还是安卓)。
  • 主要用于 微信小程序 适配。

🔹 示例

css 复制代码
.box {
  width: 200rpx; /* 在不同设备上自动缩放 */
}

📌 特点

  • 适用于微信小程序 ,无需 media query 适配不同设备。
  • 开发时可以用 750rpx 设计稿直接换算

🎯 总结对比

单位 说明 适用场景 是否随屏幕变化
px 绝对单位,像素点 精确尺寸控制
pt 印刷单位,1pt ≈ 1.33px 打印设计
em 相对于父元素的 font-size 局部缩放 ✅(随父级变化)
rem 相对于根元素 html 响应式布局,全局适配 ✅(随 html 变化)
% 相对于父元素 流式布局 ✅(随父级变化)
vw 视口宽度的 1% 自适应宽度 ✅(随窗口变化)
vh 视口高度的 1% 全屏元素 ✅(随窗口变化)
rpx 微信小程序自适应单位 小程序开发

🎯 什么时候用?

适用于固定大小 (按钮、边框、图标):px

适用于全局字体适配rem(结合 html { font-size: 62.5%; } 方案)

适用于流式布局 (相对父元素):%

适用于视口适配 (全屏背景、弹窗):vw / vh

适用于小程序开发rpx


🌟 结论

  • 固定大小px
  • 全局字体适配rem
  • 父级相对尺寸%
  • 全屏自适应vw / vh
  • 小程序开发rpx

🚀 推荐:rem + vw 结合使用,适配效果最佳!

37. meta viewport 标签及含义

<meta name="viewport">移动端页面适配 的关键标签,它用于控制视口(viewport)大小和缩放比例,保证网页在不同设备上的显示效果。


📌 1. 语法

html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0">

📌 2. viewport 主要参数

参数 作用 常见值
width 设置视口宽度 device-width(设备屏幕宽度)、数值(如 600
height 设置视口高度(较少用) device-height(设备屏幕高度)、数值
initial-scale 初始缩放比例 1.0(默认 100% 缩放)
minimum-scale 允许的最小缩放比例 0.5(可缩小到 50%)
maximum-scale 允许的最大缩放比例 2.0(可放大到 200%)
user-scalable 是否允许用户缩放 yes(允许)、no(禁止缩放)

📌 3. 常见 meta viewport 配置

✅ (1)移动端标准适配
html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0">

📌 作用

  • width=device-width:宽度等于设备宽度
  • initial-scale=1.0:初始缩放 100%

✅ (2)禁用缩放(防止用户缩放界面)
html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">

📌 作用

  • 不允许用户缩放 ,常用于微信小程序、H5 页面,防止误触放大。

✅ (3)适配 iOS 设备
html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

📌 作用

  • maximum-scale=1.0防止 iOS 设备双击放大
  • user-scalable=no禁止手势缩放
  • 适用于 微信 H5、iOS App 内嵌网页

📌 4. viewport 适配原理

在 PC 端,网页默认宽度是 980px ,如果不设置 meta viewport,手机端会缩小网页,使用户手动缩放:

  • 例如,iPhone 13 的 屏幕宽度 ≈ 390px
  • 默认网页 980px缩放到 390px 宽度
  • 这会导致字体变小,页面不适配

💡 解决方案

html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0">
  • 这样网页宽度=设备宽度,适配移动端。

📌 5. viewport 常见问题

❌ 问题 1:页面变形

情况 :部分 Android 设备的 device-width 计算不精准,导致页面变形。

解决方案

html 复制代码
<meta name="viewport" content="width=375, initial-scale=1.0">

手动设置 width,如 375px(iPhone 6/7/8 宽度)。


❌ 问题 2:iOS 下 input 聚焦导致页面放大

情况 :iOS 设备 点击输入框后,页面放大,导致用户体验不好。

解决方案

html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  • maximum-scale=1.0:防止 iOS 自动放大
  • user-scalable=no禁止手动缩放

📌 6. 总结

场景 meta viewport 代码
标准移动端适配 <meta name="viewport" content="width=device-width, initial-scale=1.0">
禁用缩放(H5、App 内嵌) <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
防止 iOS 设备自动放大 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

🚀 建议 :一般移动端 H5 页面,推荐 标准适配iOS 防放大版本

38.移动端适配方案有哪些?

📌 移动端适配方案总结

移动端适配是指让网页在不同尺寸的移动设备上显示良好 ,保证良好的用户体验 。以下是常见的移动端适配方案


🎯 1. meta viewport 适配

📌 核心作用:控制移动端视口宽度,使网页适应屏幕尺寸。

html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0">

推荐方案

html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

💡 适用于

  • 所有移动端 H5 页面
  • 解决 iOS 输入框聚焦放大问题
  • 防止用户误缩放页面

🎯 2. rem + flexible.js 方案(淘宝适配方案)

📌 核心原理

  • 通过 rem 设置相对单位,基于 html 字体大小
  • flexible.js 动态计算 htmlfont-size,不同设备等比缩放。

✅ 代码示例

(1)HTML 设置 rem
html 复制代码
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/gh/amfe/lib-flexible@2.0.0/flexible.js"></script>
(2)CSS 使用 rem
css 复制代码
html {
  font-size: 16px;
}

.box {
  width: 10rem; /* 10 × 16px = 160px */
}

📌 适用于

  • 淘宝、京东、小米等移动端 H5
  • 适用于设计稿 750px 方案 (基于 1rem = 100px

🎯 3. vw / vh 适配(视口单位)

📌 核心原理

  • vw:1vw = 视口宽度的 1%
  • vh:1vh = 视口高度的 1%

✅ 代码示例

css 复制代码
.box {
  width: 50vw; /* 屏幕宽度 50% */
  height: 20vh; /* 屏幕高度 20% */
}

📌 适用于

  • 全屏背景、横幅、弹窗
  • 不同屏幕宽高比的自适应布局

🎯 4. 百分比 % 适配

📌 核心原理

  • width: % 表示相对父元素大小
  • 适合流式布局

✅ 代码示例

css 复制代码
.container {
  width: 100%;
}

.box {
  width: 50%; /* 父元素宽度的 50% */
}

📌 适用于

  • 简单布局 (如 divimg
  • 响应式布局

🎯 5. 媒体查询 @media 适配

📌 核心原理

  • 通过 @media 针对不同屏幕尺寸设置样式
  • 常用于 PC + 移动端的响应式开发

✅ 代码示例

css 复制代码
/* 手机端适配 */
@media screen and (max-width: 768px) {
  .box {
    width: 100px;
  }
}

/* 平板端适配 */
@media screen and (min-width: 768px) and (max-width: 1024px) {
  .box {
    width: 200px;
  }
}

📌 适用于

  • PC / iPad / 手机不同布局
  • 渐进式增强(Progressive Enhancement)

🎯 6. rpx 适配(微信小程序)

📌 核心原理

  • 750rpx = 设备宽度
  • 微信小程序专用

✅ 代码示例

css 复制代码
.box {
  width: 300rpx; /* 自动适配不同屏幕 */
}

📌 适用于

  • 微信小程序、支付宝小程序
  • 小程序原生开发

🎯 7. CSS Grid / Flexbox 响应式布局

📌 核心原理

  • Flexbox 适用于等比例自适应
  • CSS Grid 适用于复杂网格布局

✅ Flex 代码示例

css 复制代码
.container {
  display: flex;
  justify-content: space-between;
}

.box {
  flex: 1; /* 自适应宽度 */
}

📌 适用于

  • 移动端网格布局
  • 等比例自适应

📌 🚀 推荐方案总结

方案 适用场景 优点 缺点
meta viewport 所有移动端网页 适配移动端屏幕 需结合其他方案
rem + flexible.js 淘宝、京东、小米 适用于 750px 设计稿 需引入 js
vw / vh 全屏适配 无需 js,更流畅 兼容性较新
% 简单自适应 适用于流式布局 依赖父元素
@media PC + 移动端 灵活控制不同设备样式 代码较多
rpx 微信小程序 自动适配 仅限小程序
Flex/Grid 复杂布局 现代布局方式 需熟悉语法

🎯 结论

  1. 普通移动端 H5meta viewport + rem + vw
  2. H5 App / 微信小程序rpx
  3. 响应式网页(PC + 手机)@media + Flexbox/Grid
  4. 全屏适配(横幅、背景)vw/vh

🚀 推荐

rem + vw 组合,适配性最好!

**关于 Tailwind CSS **

Tailwind CSS 作为热门的实用工具优先(Utility-First)CSS 框架 ,因其高效、可定制、响应式强 等优点,深受前端开发者青睐。在前端面试中,Tailwind CSS 相关的知识也成为考察点之一 。下面是高频面试题总结及详细解答!


39... 什么是 Tailwind CSS?它的优缺点是什么?

Tailwind CSS 是一个 实用优先(Utility-First) 的 CSS 框架,使用类名来快速构建 UI,而不是传统的 CSS 规则。

✅ 优点

  1. 开发效率高:直接使用预定义类,无需写额外的 CSS。
  2. 无全局命名冲突:避免了 CSS 选择器的层叠和命名问题。
  3. 极易定制 :通过 tailwind.config.js 文件可定制主题、颜色、间距等。
  4. 内置响应式设计 :使用 sm:md:lg: 等类快速适配不同设备。
  5. 支持 JIT(Just-in-Time)编译:只生成实际使用的 CSS,减少文件大小。

❌ 缺点

  1. 类名较长 :如 bg-blue-500 text-white font-bold p-4 rounded-lg,但 VSCode 插件可减少输入成本。
  2. 学习成本:需要熟悉类名及其规则。
  3. HTML 代码可能较冗长:由于所有样式都通过类名定义,HTML 可能会变得复杂。

40. 如何安装和使用 Tailwind CSS?

安装方式(选择其中一种):

方式 1:使用 npm 安装(推荐)

bash 复制代码
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init

然后,在 tailwind.config.js 文件中启用 JIT:

js 复制代码
module.exports = {
  mode: 'jit',
  purge: ['./src/**/*.{html,js,ts,jsx,tsx}'], // 仅生成使用的 CSS
  theme: {
    extend: {},
  },
  plugins: [],
}

index.css 中引入 Tailwind:

css 复制代码
@tailwind base;
@tailwind components;
@tailwind utilities;

方式 2:CDN 引入(仅适用于简单项目)

html 复制代码
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">

41. Tailwind CSS 的核心概念有哪些?

核心概念

  1. Utility-First (实用类优先):使用类名来定义样式,如 text-red-500 代替 CSS color: red;

  2. JIT(Just-In-Time 编译):只生成实际用到的 CSS,减少 CSS 体积。

  3. Responsive Design (响应式设计):使用 sm:md:lg:xl:2xl: 轻松适配不同屏幕。

  4. State Variants (状态变体):支持 hover:, focus:, active: 等伪类,如:

    html 复制代码
    <button class="bg-blue-500 hover:bg-blue-700 text-white px-4 py-2">
      Hover Me
    </button>
  5. Dark Mode (深色模式):通过 dark: 适配深色主题:

    html 复制代码
    <div class="bg-white dark:bg-gray-900 text-black dark:text-white"></div>

42. 如何自定义 Tailwind CSS 的配置?

Tailwind CSS 允许通过 tailwind.config.js 进行高度自定义

js 复制代码
module.exports = {
  theme: {
    extend: {
      colors: {
        brand: '#3490dc', // 自定义品牌颜色
      },
      spacing: {
        '128': '32rem', // 自定义间距
      },
    },
  },
  plugins: [],
}

💡 使用方式

html 复制代码
<div class="bg-brand p-128">Hello Tailwind</div>

43. Tailwind CSS 如何实现响应式布局?

使用 sm: md: lg: xl: 2xl: 进行响应式适配

html 复制代码
<div class="p-4 sm:p-6 md:p-8 lg:p-10 xl:p-12">响应式间距</div>

解释

  • sm:p-6 代表小屏幕(≥640px)时padding 变为 6
  • md:p-8 代表中等屏幕(≥768px)时padding 变为 8
  • 依此类推。

44. 如何使用 Flexbox 和 Grid 布局?

Flexbox 示例

html 复制代码
<div class="flex justify-between items-center">
  <div class="w-1/3 bg-red-500">左</div>
  <div class="w-1/3 bg-green-500">中</div>
  <div class="w-1/3 bg-blue-500">右</div>
</div>

Grid 布局示例

html 复制代码
<div class="grid grid-cols-3 gap-4">
  <div class="bg-red-500">1</div>
  <div class="bg-green-500">2</div>
  <div class="bg-blue-500">3</div>
</div>

45. Tailwind CSS 如何优化性能?

优化性能的方式

  1. 使用 JIT 模式

    • mode: 'jit' 只生成实际使用的 CSS,减少体积。
  2. PurgeCSS(去除无用 CSS)

    • tailwind.config.js 中配置 purge

      js 复制代码
      module.exports = {
        purge: ['./src/**/*.{html,js,jsx,ts,tsx,vue}'], // 清理未使用的 CSS
      }
  3. 减少不必要的插件

    • 仅使用必要的插件,不加载额外功能。

46. 如何使用 Tailwind CSS 处理深色模式(Dark Mode)?

方式 1:基于 class 触发

js 复制代码
module.exports = {
  darkMode: 'class', // 手动添加 dark 类
}

HTML 结构:

html 复制代码
<body class="dark">
  <div class="bg-white dark:bg-gray-900 text-black dark:text-white">深色模式</div>
</body>

JS 代码:

js 复制代码
document.body.classList.toggle('dark');

方式 2:基于系统设置

js 复制代码
module.exports = {
  darkMode: 'media', // 自动匹配用户系统
}

47. 如何在 Tailwind CSS 中创建复用的组件?

使用 @apply 合并类

css 复制代码
@layer components {
  .btn {
    @apply px-4 py-2 rounded bg-blue-500 text-white font-bold;
  }
}

使用

html 复制代码
<button class="btn">Click Me</button>

48 如何在 Vue/React 中使用 Tailwind CSS?

Vue + Tailwind

bash 复制代码
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init

main.css 引入:

css 复制代码
@tailwind base;
@tailwind components;
@tailwind utilities;

React + Tailwind

bash 复制代码
npx create-react-app my-app
cd my-app
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init

index.css 引入 Tailwind:

css 复制代码
@tailwind base;
@tailwind components;
@tailwind utilities;

相关推荐
亦良Cool16 分钟前
将Exce中工作簿的多个工作表拆分为单独的Excel文件
前端·html·excel
Moment2 小时前
从方案到原理,带你从零到一实现一个 前端白屏 检测的 SDK ☺️☺️☺️
前端·javascript·面试
鱼樱前端2 小时前
Vue3 + TypeScript 整合 MeScroll.js 组件
前端·vue.js
拉不动的猪2 小时前
刷刷题29
前端·vue.js·面试
野生的程序媛2 小时前
重生之我在学Vue--第5天 Vue 3 路由管理(Vue Router)
前端·javascript·vue.js
codingandsleeping3 小时前
前端工程化之模块化
前端·javascript
CodeCraft Studio3 小时前
报表控件stimulsoft操作:使用 Angular 应用程序的报告查看器组件
前端·javascript·angular.js
阿丽塔~3 小时前
面试题之vue和react的异同
前端·vue.js·react.js·面试
烛阴4 小时前
JavaScript 性能提升秘籍:WeakMap 和 WeakSet 你用对了吗?
前端·javascript
yuren_xia5 小时前
eclipse创建maven web项目
前端·eclipse·maven