CSS文字&排版&布局
关于文本不换行,你的直觉很准。CSS 之所以现在提供这么多属性,是因为“不换行”这个需求在现代布局中变得越来越…
文字换行相关
关于文本不换行,你的直觉很准。CSS 之所以现在提供这么多属性,是因为**“不换行”这个需求在现代布局中变得越来越精细:有的是为了强制文本一行走到底**,有的是为了防止内容撑破容器,还有的是为了逻辑上的整洁。
以下是针对这些属性的深度拆解和现代方案总结。
white-space vs text-wrap
这是你提到的两个最容易搞混的属性。
white-space: nowrap; (传统全能王)
这是最经典的做法。它其实是一个“复合属性”,它不仅控制不换行,还控制空格和换行符的处理。
副作用:它会把代码里的多个空格合并成一个。
地位:它是目前的工业标准,兼容性 100%。

变为:

text-wrap: nowrap; (现代逻辑派)
这是 CSS Text Module Level 4 引入的新属性。
- 逻辑:它只负责换行逻辑(不换行),不干扰空格的处理。
- 为什么出现它?:CSS 规范正在将“空格处理”和“换行控制”解耦。
- 现状:目前主流浏览器(Chrome 114+)已支持,它是
white-space内部逻辑拆分后的现代替代方案。
text-wrap 正在变成一个简写属性(Shorthand),而它背后的“打工人”就是你看到的这两个:
1.text-wrap-mode(决定“要不要”换行)
这个属性主要负责开关。它决定了当文本超出容器边界时,浏览器是否允许它换到下一行。
wrap(默认):允许在合适的断点换行。nowrap:强制不换行,内容会直接溢出容器
2. text-wrap-style(决定“怎么换行”才好看)
这是现代 CSS 最有灵性的地方。它不决定要不要换行,而是决定换行时的视觉美感。
auto:浏览器默认,哪到头了在哪断。

balance(神技):文本平衡。
- 痛点:比如标题只有两行,第一行很长,第二行只有一个字(孤行),很难看。
- 效果:浏览器会自动计算,让两行文字的长度尽可能接近,看起来更像精心排版过的报纸。

pretty(慢工出细活):
- 效果:它会执行更复杂的算法,专门为了防止最后一行出现“孤词(Orphan)”,即使这会导致排版速度稍微变慢。常用于正文排版。
只保证不出现孤词

stable:
- 场景:在内容编辑时,防止因为光标输入导致文字在行间疯狂跳动,保持布局稳定。
如果你写 text-wrap: nowrap;
- 它相当于:
text-wrap-mode: nowrap;+text-wrap-style: auto;
如果你写 text-wrap: balance;
- 它相当于:
text-wrap-mode: wrap;+text-wrap-style: balance;
2. 宽度控制:max-content 的降维打击
你提到的 width: max-content; 其实是换行控制的**“终极外挂”**。
- 原理:普通元素不换行是因为父盒子宽度不够。但如果你设置了
width: max-content;,这个盒子会告诉浏览器:“别管父级,我有多少字,我的宽度就设为多少。” - 效果:它会强制内容在一行显示,除非遇到显式的
<br>标签。 - 场景:非常适合做那种“横向滚动的卡片标题”或“不希望被压缩的表格单元格”。
上面的情况直接变为

3. 现代方案的“全家桶”:为什么需要这么多?
除了简单的“不换行”,我们通常还需要处理**“不换行后的后续工作”**。
A. 经典的“单行文本截断”
光有不换行是不够的,通常我们要配合这三剑客:
.truncate {
white-space: nowrap; /* 1. 别换行 */
overflow: hidden; /* 2. 藏起来 */
text-overflow: ellipsis;/* 3. 给个省略号 (...) */
}B. flex-shrink: 0; (Flex 布局中的必杀技)
很多时候你设置了 nowrap,但在 Flex 布局下,子元素依然会被挤压变窄。
方案:给文字容器加 flex-shrink: 0;。它强制告诉 Flex 引擎:“不要压缩我,哪怕我溢出父容器。”
C. overflow-wrap: anywhere; (反向思维)
有时候我们不是想“不换行”,而是想控制在“哪里换行”。anywhere 可以让长单词或超长链接在任何地方断开。
换行断开字符
如果说 white-space 是决定“要不要换行”,那么 word-break 就是决定“在哪个字符处断开换行”。它主要解决的是当一个单词(或一串字符)太长,超出了容器宽度时,浏览器该如何“肢解”这些文字。
这个属性在处理**中文(CJK)和英文(Non-CJK)**时表现完全不同,这是理解它的关键。
| 属性值 | 行为描述 | 形象比喻 |
|---|---|---|
normal (默认) | 使用浏览器默认换行规则。英文按单词换行,中文按字符换行。 | 尊重语言习惯 |
break-all | 冷酷拆分。无论是英文单词还是中文,只要到边界就强制断开,不顾单词完整性。 | 暴力切断(打破上方语言习惯) |
keep-all | 严禁断开。中文也不允许在字符间断开,只能在标点或空格处换行。 | 整体优先(打破上方语言习惯) |
word-break是决定断口在哪里,那么overflow-wrap就是决定“什么时候”开始断!
这个属性更像是一个“备选方案”,以前叫 word-wrap。它主要有两个值:
normal:如果单词太长,就让它溢出。
break-word (现已推荐用 anywhere):温柔截断。它会先尝试把整个单词放到下一行,如果下一行还是放不下(单词比容器还宽),才会在单词内部断开。
为了让你一眼看清它们的“性格”,我做了一个对比表:
| 属性值组合 | 核心逻辑 | 适用场景 |
|---|---|---|
word-break: break-all | 空间优先。不留任何空白,能填满就填满。 | 极窄的侧边栏、长链接展示。 |
overflow-wrap: break-word | 单词优先。尽量保全单词完整,实在不行再拆。 | 正常的文章阅读排版。 |
word-break: keep-all | 词组优先。中文也像英文一样按词或标点换行。 | 诗歌、标题、需要特定节奏感的排版。 |
word-break: auto-phrase | 语义优先。由浏览器 AI 智能判断哪里该断。 | 追求极致阅读体验的现代网页。 |
词间距
简单来说,它就是 “单词间的空格有多宽”。
在英文中:它调节的是两个单词(空格处)的间距。
在中文中:因为中文默认字与字之间没有空格,所以 word-spacing 对纯中文文本通常 无效。但如果你的中文句子里有空格,或者中英文混排,它就能起作用。
为了不搞混,你要把这三个放在一起看:
| 属性 | 作用对象 | 形象比喻 |
|---|---|---|
letter-spacing | 字符与字符之间 | 字母或汉字排排坐,手拉手的长度。 |
word-spacing | 单词与单词之间 | 单词之间“社交距离”的大小。 |
white-space | 空格/换行的处理 | 决定空格是合并、保留还是消失。 |
A. 负值压缩
你可以设置负值(如 -2px),让单词靠得更紧,常用于一些紧凑的艺术设计排版。
B. 配合 text-align: justify (两端对齐)
当你设置 text-align: justify 时,浏览器会自动拉伸单词间距来填满一行。如果你再设置 word-spacing,它会作为基础偏移量叠加上去。
如果你想调出一手漂亮的排版,这几个属性通常是成对出现的:
p {
/* 1. 断行逻辑 */
word-break: auto-phrase;
/* 2. 单词间距 */
word-spacing: 2px;
/* 3. 字符间距 (中文微调常用) */
letter-spacing: 0.5px;
/* 4. 行间距 */
line-height: 1.6;
}
前两者都是normal+number取值,下面是white-space的取值列表
| 取值 | 合并空格/制表符? | 自动换行? | 说明 |
|---|---|---|---|
normal | 是 | 是 | 默认。 连续空格合并为一,文字到边界自动折行。 |
nowrap | 是 | 否 | 文字溢出省略号特效的必备: 强制所有文字在一行显示。 |
pre | 否 | 否 | 代码风格。 保留所有空格和换行,像 <pre> 标签一样。 |
pre-wrap | 否 | 是 | 对话框必备: 既保留你打的空格和回车,到边界又会自动折行。 |
pre-line | 是 | 是 | 合并多余空格,但保留你手动打的换行(回车)。 |
break-spaces | 否 | 是 | 行为类似 pre-wrap,但会将行尾的空格也保留并占据空间。 |
水平对齐
text-align 不仅仅是简单的“左中右”,它涉及到了行内块级元素(inline-block)的分布规律、跨语言的逻辑方向,以及复杂的排版对齐逻辑。
以下是针对不同场景的 text-align 实战指南:
基础取值列表
这是最常用的水平对齐方式,作用于块级容器,控制其内部行内内容(文字、图片、inline-block 元素)的对齐。
| 取值 | 说明 | 视觉效果 |
|---|---|---|
left | 左对齐 | 默认值(从左往右书写的语言)。 |
right | 右对齐 | 内容向容器右侧靠拢。 |
center | 居中对齐 | 内容在容器水平方向正中心。 |
justify | 两端对齐 | 除了最后一行外,拉开字间距使左右边缘对齐。 |
现代逻辑属性:start 与 end
随着全球化网页(i18n)的普及,硬编码的 left 和 right 正在被逻辑属性取代。
text-align: start;:在从左往右(LTR)的语言(如中文)中是左对齐;在从右往左(RTL)的语言(如阿拉伯语)中自动变为右对齐。
text-align: end;:反之亦然。
两端对齐:text-align-last
这是你之前重点提到的“强制两端对齐”技巧。
- 痛点:
text-align: justify默认不会对最后一行(或只有一行的文本)生效。 - 现代解法:使用
text-align-last: justify;。 - 场景:做简历、发票、表单 Label 时的必备神器,能强制将“姓名”和“联系电话”拉伸到同样的宽度。
.label {
width: 100px;
text-align: justify;
/* 核心:即使这段文字只有一行(也是最后一行),
也要强制把文字拉开,填满 100px 的宽度。
*/
text-align-last: justify;
}底蕴价值: 这是 排版规则的暴力破解。它解决了中文排版中特有的“对齐强迫症”,让表单看起来极其规整。

在 CSS 渲染逻辑中,text-align: justify 是为了让段落中间的行变整齐,但规范规定:段落的最后一行(或只有一行时)永远不进行两端对齐,而是保持在书写方向的起始端(通常是左侧)。
text-align: justify:开启了两端对齐的“潜能”。
text-align-last: justify:打破了保护机制,强制要求哪怕只有这一行,也要把多余的空间平摊到每个字之间。文本省略
首字下沉
initial-letter 这是一个专门提升阅读体验的属性,让网页排版向纸媒(杂志、报纸)看齐。
文章第一段的第一个字特别大,占据三行高度(Drop Cap)。
p::first-letter {
/* 参数1: 占据几行高度 (3行) */
/* 参数2: 下沉几行 (默认就是占据的行数,也可以设置更少) */
initial-letter: 3;
color: gold;
font-weight: bold;
margin-right: 0.5em;
}
这里面还有报纸分栏,很多CSS值得学习
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS initial-letter 杂志排版演示</title>
<style>
/* 文章容器:双栏布局 */
article {
max-width: 700px;
column-count: 2; /* 报纸分栏 */
column-gap: 40px; /* 栏间距 */
column-rule: 1px solid #ddd; /* 分栏中间的竖线 */
text-align: justify; /* 两端对齐 */
}
h1 {
column-span: all; /* 标题跨越所有栏 */
font-family: 'Impact', sans-serif;
text-transform: uppercase;
font-size: 3rem;
text-align: center;
margin-bottom: 10px;
letter-spacing: 2px;
}
.meta {
column-span: all;
text-align: center;
font-style: italic;
color: #666;
border-bottom: 2px solid black;
border-top: 1px solid black;
padding: 10px 0;
margin-bottom: 30px;
font-family: sans-serif;
font-size: 0.9rem;
}
/* ================================
✨ 核心代码:首字下沉
================================
*/
/* 只对文章的第一段的第一个字生效 */
article p:first-of-type::first-letter {
/* Safari 需要前缀,Chrome 110+ 原生支持
语法:initial-letter: [占据高度] [下沉深度];
如果只写一个数字,默认占据高度=下沉深度。
*/
-webkit-initial-letter: var(--cap-lines);
initial-letter: var(--cap-lines);
/* 样式美化 */
color: var(--accent-color);
font-weight: bold;
margin-right: 10px; /* 文字和正文的间距 */
/* 让字稍微带点古风 */
font-family: 'Times New Roman', serif;
}
/* 移动端变成单栏,阅读体验更好 */
@media (max-width: 600px) {
article { column-count: 1; }
}
</style>控制打印
@page 与 break-inside
很多前端工程师会忽略网页的打印样式。但如果你在做 B 端系统(报表、发票),这非常重要。
打印网页时,一个表格经常被切成两半(一半在第一页,一半在第二页),非常难看,所以现在控制分页行为:
@media print {
/* 设置页边距,甚至可以隐藏页眉页脚 */
@page {
margin: 1cm;
size: A4 portrait; /* 强制 A4 纵向 */
}
.card, table, img {
/* 核心:禁止在元素内部强行分页 */
/* 浏览器会尽量把它整个移到下一页去 */
break-inside: avoid;
}
}底蕴价值: 这是对**多媒介(Media Types)**的掌控。Web 不仅仅是在屏幕上看的,也是可以被输出到纸张上的。掌握这个,能让你在处理企业级报表需求时游刃有余。
异形排版
shape-outside 这是 Web 排版中最具艺术感的属性之一。
痛点: 网页上所有的盒子默认都是矩形的。如果你放一张圆形的图片,文字还是会绕着它的矩形边界排布,导致四个角有很大的空白,非常难看。
现代解法: 让文字沿着图片的轮廓流动。
.circle-image {
width: 200px;
height: 200px;
border-radius: 50%;
float: left; /* 必须配合 float 使用 */
margin-right: 20px;
/* 核心:告诉浏览器,文字不要绕着我的矩形框,要绕着我的圆形边界 */
shape-outside: circle(50%);
/* 甚至可以根据图片的透明度自动计算形状! */
/* shape-outside: url(image.png); */
/* shape-image-threshold: 0.5; */
}底蕴价值: 这打破了 Web 设计千篇一律的“方块感”。配合 clip-path(裁剪路径),你可以做出杂志级别的创意排版,比如文字环绕着一个不规则的瓶子流动。

/* 视觉上切成六边形 */
clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
/* 逻辑上告诉文字"绕着六边形走" */
shape-outside: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);文字虽然绕着圆形排了,但是紧贴着图片边缘,密不透风,很难看。
你不能用 margin-right,因为那是矩形的边距。现代解法: 给“形状”加边距。
.circle-img {
float: left;
shape-outside: circle(50%);
/* 核心:
在那个看不见的圆形轮廓外面,再推开 20px。
文字会沿着这个扩大的圆形轮廓排布。
*/
shape-margin: 20px;
}
文本省略号
在 纯 CSS 里,实现“长文本显示省略号(…)”有几种常见方式,具体取决于是 单行 还是 多行:
✅ 单行文本省略号
最常见,也是兼容性最好:
.ellipsis-single {
overflow: hidden; /* 超出隐藏 */
white-space: nowrap; /* 不换行 */
text-overflow: ellipsis; /* 超出显示省略号 */
}要生效:必须和
width或者max-width一起使用,否则没法触发“超出”。
✅ 多行文本省略号(WebKit 内核)
CSS 本身没有完全标准化的多行省略方案,常用的是 -webkit-line-clamp:
.ellipsis-multi {
display: -webkit-box; /* 弹性伸缩盒 */
-webkit-box-orient: vertical; /* 垂直排列 */
-webkit-line-clamp: 3; /* 限制显示 3 行 */
overflow: hidden; /* 超出隐藏 */
}⚠️ 注意:
- 这是 WebKit 专属属性(Chrome、Safari、Edge 新版支持较好)。
- Firefox 直到比较新的版本才开始实验性支持。
✅ 其他方案
-
渐变遮罩(更优雅):
css.ellipsis-fade { position: relative; max-height: 4.5em; /* 按行高控制行数 */ overflow: hidden; } .ellipsis-fade::after { content: ''; position: absolute; bottom: 0; right: 0; width: 50%; height: 1.2em; background: linear-gradient(to right, transparent, white 50%); }→ 效果是“渐隐”,不是纯粹的
...。
真正的多行省略
line-clamp (标准版)
你肯定用过 -webkit-line-clamp,那个属性是非标准的“私有属性”,却因为太好用被大家用了 10 年。现在,标准版终于来了。
让一段文字“最多显示 3 行,多余的变…”。
display: -webkit-box; /* 必须变成弹性伸缩盒 */
-webkit-box-orient: vertical; /* 必须垂直排列 */
-webkit-line-clamp: 3; /* 必须用私有前缀 */
overflow: hidden;这堆代码非常脆弱,稍微改一下 display 就失效了。
现代解法: 它是 overflow 的一种属性。
.text {
/* 标准属性:当作为块级元素时,限制行数 */
line-clamp: 3;
/* 配合 content-visibility 甚至可以做长文本性能优化 */
}底蕴价值: 这代表了 CSS 标准化的胜利。我们将不再依赖浏览器的怪异模式,而是拥有了稳定、可预测的文本截断能力。
.card-text {
color: #636e72;
font-size: 0.95rem;
margin-bottom: 16px;
/* 目前的最佳实践:兼容写法 + 标准写法
浏览器会优先使用标准 line-clamp,如果不支持则回退到 -webkit
*/
/* 1. 必备的旧式弹性盒魔法 (兼容性目前必须写) */
display: -webkit-box;
-webkit-box-orient: vertical;
/* 2. 核心属性:限制为 3 行 */
-webkit-line-clamp: 3;
line-clamp: 3; /* 标准属性 (未来只需这一行) */
/* 3. 超出隐藏 */
overflow: hidden;
/* 这里的 transition 是没用的,因为 line-clamp 无法动画过渡 */
}等宽字体
font-variant-numeric: tabular-nums
这是做 数据大屏、金融报表、倒计时 必用的属性。
现在的字体大多是“比例字体”(Proportional)。意思是,数字 1 占的宽度比 8 窄。后果: 当你做一个快速跳动的倒计时(比如秒表),因为数字宽度一直在变,整个字符串就会左右抖动,看起来非常廉价。或者在财务报表里,上下两行的数字无法对齐小数点。现在可以强制开启字体的“等宽数字”特性。
.countdown, .finance-table {
/* 核心:告诉字体文件,我要用等宽的数字字形 */
/* 即使是 Arial 或 Helvetica,数字也会变得像代码一样整齐 */
font-variant-numeric: tabular-nums;
}底蕴价值: 这是字体排印学 (Typography) 的知识。你不需要换成丑丑的“等宽字体”(Monospace),就能拥有等宽字体的对齐优势,同时保留无衬线字体的美感。

强制把每个数字的占用宽度设置为等宽
下划线现代化
text-underline-offset
痛点: 默认的 text-decoration: underline 非常丑。那根线紧贴着文字底部,还会切断像 g, j, p, q, y 这种有下伸部(Descender)的字母。以前的 Hack: 用 border-bottom 模拟下划线,但很难控制粗细和颜色,而且换行时会断裂。现在可以调整下划线的偏移量。
a {
text-decoration: underline;
/* 1. 颜色可以和字色分开 */
text-decoration-color: rgba(0, 123, 255, 0.4);
/* 2. 粗细可以自定义 */
text-decoration-thickness: 2px;
/* 3. 核心:让下划线往下挪 4px,留出呼吸感 */
text-decoration-skip-ink: none(切断字母) / auto(不切断字母); /* 可选:强制切断或穿过字母 */
text-underline-offset: 4px;
}
a:hover {
/* 悬停时改个颜色,效果非常优雅 */
text-decoration-color: blue;
}底蕴价值: 这让网页的文字排版终于赶上了 平面设计软件 (InDesign) 的控制力。

优雅:

配合
text-decoration-style: wavy可以做拼写检查效果,offset 让波浪线不会挡住文字。
以前的下划线方案展示:
text-decoration相关属性添加下划线
.element {
display: inline-block;
border-radius: 10px 10px 0 10px;
padding: 30px;
/*下划线*/
text-decoration: underline;
/*下划线颜色*/
text-decoration-color: red;
/*下划线宽度*/
text-decoration-thickness: 5px;
/*下划线与文字距离*/
text-underline-offset: 10px;
}text-decoration-style
text-decoration-style 提供了和 border-style 一样的线条样式,但是也增加了 wavy 波浪线样式。
以下是你可以使用的不同属性值:dashed/dotted/double/solid/wavy
border添加下划线
需要设置文字的那部分为inline
.element {
display: inline-block;
/* 设置距离 */
padding-bottom: 9px;
/* 设置样式大小颜色 */
border-bottom: 2px solid red;
}shadow添加下划线

display: inline;
box-shadow: 0px 3px 0px 0px red;box-shadow 使用两个内阴影画一条下划线:一个用于创建长方形,另一个覆盖在上面。这意味着该属性必须在纯色背景上使用。
可以使用 text-shadow 覆盖下行字母附近的下划线,但必须使用与背景色一样的颜色。这意味着只在纯色背景上有效,而不能应用于渐变色或者图片上。(也就是文字其实有个白色边框,这样就会覆盖住下划线)
.text-shadow {
text-shadow: -2px -2px white, -2px 2px white, 2px -2px white, 2px 2px white;
}
把绿色换成白色就达到了,这种方式只针对纯色背景起效
最简单的下划线:
/*向内一条线*/
box-shadow: inset 0px -2px #000;
/*向外一条线*/
box-shadow: 0px 2px #000;
/*如果希望线更远,控制距离,只有一条线的话,线会变粗,所以需要第二条纯色背景线来覆盖住粗的那部分*/
box-shadow: inset 0 -0.175em #fff, inset 0 -0.2em #000;/*设置多条线来画出两条双下划线*/
.underline--double {
box-shadow:
inset 0 -0.075em white,
inset 0 -0.1em red,
inset 0 -0.15em white,
inset 0 -0.175em red;
}background-image
background-image 是最容易满足我们要求的属性并且问题较少。思路就是通过 linear-gradient 和 background-position 创建沿着文本水平复制的图像。
这个方法也要设置 display: inline;

以波浪线为例:
.underline--bacon {
background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/78779/bacon.svg);
background-position: 0 1.3em;
background-size: 28px 9px;
color: #9e4446;
}
最关键的一句:
background-position: 0 1.3em;
和
background-repeat: repeat-x;
改变排版方向
writing-mode这是国际化布局和创意排版的核心。1
| 取值 (Value) | 文字流向 (Inline Axis) | 换行/块流向 (Block Axis) | 视觉原点 (Start) | width 控制什么? | height 控制什么? | 典型应用场景 |
|---|---|---|---|---|---|---|
horizontal-tb (默认) | 左 → 右 (水平) | ↓ 下一行 (垂直) | 左上角 | 容器宽度 (水平尺寸) | 容器高度 (垂直尺寸) | 99% 的现代网页 中文/英文横排 |
vertical-rl | 上 ↓ 下 (垂直) | ← 左一列 (水平) | 右上角 | 列的总宽 (视觉上的横向距离) | 单行文字长度 (视觉上的纵向高度) | 古诗词展示 日文/繁体中文书籍 竖排菜单 |
vertical-lr | 上 ↓ 下 (垂直) | → 右一列 (水平) | 左上角 | 列的总宽 (视觉上的横向距离) | 单行文字长度 (视觉上的纵向高度) | 现代侧边栏标题 蒙古文排版 |
sideways-rl (实验性) | 下 ↑ 上 (垂直) | → 右一列 | 左下角 | (同上) | (同上) | 极少使用 (仅 Firefox 支持) |
场景:
- 你需要做中文的竖排古诗词展示。
- 或者,你想做一个侧边栏标题,文字是侧着竖起来的(不是旋转,是竖排)。
以前的做法: 给每个字包一个 span 然后换行,或者用 transform: rotate(90deg)(这样字的方向是歪的)。
现代解法: 改变书写模式。
.sidebar-title {
/* 垂直书写,从右向左读(古文模式) */
writing-mode: vertical-rl;
/* 或者是垂直书写,从左向右读(现代侧边栏模式) */
/* writing-mode: vertical-lr; */
/* 配合 flex 居中,简直完美 */
display: flex;
align-items: center;
justify-content: center;
}底蕴价值: 这不仅仅是“竖排”。它改变了 CSS 的逻辑坐标系。
- 当
writing-mode改变时,margin-top可能会变成物理上的“右边距”。 - 这就是为什么现代 CSS 提倡用
margin-block-start(逻辑属性) 而不是margin-top(物理属性) 的原因——为了适应这种书写模式的变化。

如果没有这个属性:

专业的断词:hyphens: auto
这是移动端排版的神器,尤其是英文内容。
- 痛点: 在手机窄屏上,如果有一个很长的单词(比如
congratulations),它放不下一行,就会被挤到下一行。- 结果:上一行留下了一个巨大的空白缺口。
- 以前的做法:
word-break: break-all。这会把单词暴力切断(比如congra-tulations断在奇怪的地方),阅读体验极差。 - 现代解法: 启用字典连字符。
article {
/* 必须配合 HTML 的 lang 属性使用,比如 <html lang="en"> */
/* 浏览器会查内置字典,在正确的音节处加连字符 "-" */
hyphens: auto;
/* 配合两端对齐,排版效果堪比印刷品 */
text-align: justify;
}底蕴价值: 这是排版学 (Typography) 的细节。浏览器不仅是渲染引擎,它还内置了语言学知识库。调用这个库,让你的网页看起来更像一本精致的书。
跨行样式修复
box-decoration-break: clone,它专门解决行内元素换行时的样式断裂问题。
- 痛点:
- 你给一段行内文本 (
<span>) 加了一个渐变背景和圆角。 - 当这段文字太长折行时,浏览器默认会把这它当成“一根被切断的火腿肠”——第一行的右边没有圆角,第二行的左边也没有圆角,渐变也是截断的。非常难看。
- 你给一段行内文本 (
- 现代解法: 告诉浏览器:“请把每一行都当做一个独立的盒子来渲染。”
span.highlight {
background: linear-gradient(to right, #ff7e5f, #feb47b);
border-radius: 50px;
padding: 0 10px;
line-height: 2;
/* 核心:克隆样式 */
/* 每一行文字都会拥有独立的圆角、独立的完整渐变、独立的内边距 */
-webkit-box-decoration-break: clone;
box-decoration-break: clone;
}底蕴价值: 这体现了你对 “片段化渲染 (Fragmentation)” 的理解。在做高亮标记、文章重点标注时,这个属性是决定精致度的关键。
当你开启
box-decoration-break: clone时,浏览器并不是简单地把背景复制一份。它会对以下 6 个属性 进行“克隆”:
background: 每一行都有完整的渐变(而不是渐变跨越两行)。border-radius: 每一行的四个角都是圆的(不再是左边直角、右边直角)。border: 每一行都有完整的四周边框(断口处会自动补上边框)。box-shadow: 每一行都有完整的阴影。padding: 每一行的左右都会有内边距(文字不会顶到边缘)。margin: 每一行的左右都会有外边距。


防止字体抖动
font-size-adjust
这是字体排印的高阶技巧,专门解决 Web 字体加载慢导致的问题。
痛点: 网页加载时,Web Font 还没下载好,浏览器先用 Arial 显示。
- 问题: 同样的
16px,Arial 看起来比你要用的“苹方”或者“Roboto”要小(因为不同字体的 x-height 不同)。 - 后果: 页面加载瞬间,文字会“崩”一下,布局会跳动 (CLS - Cumulative Layout Shift)。
现代解法: 强行统一字体的视觉大小。
body {
font-family: 'MyCustomFont', Arial, sans-serif;
/* 核心:无论用什么字体,都把它的小写字母 x 的高度调整为字号的 0.5 倍 */
/* 这样,Arial 和 MyCustomFont 在视觉上就一样大了,切换时不会跳动 */
font-size-adjust: 0.5;
}底蕴价值: 这是对 Web 核心指标 (Core Web Vitals) 的深度优化。你不仅在控制字号,你还在控制字体的几何结构,以保证极致的加载体验。
文字空白删除
text-box-trim (原 leading-trim)
这是 Web 排版最令人抓狂的问题的终极解法。
你给一个按钮写了 height: 40px,想让里面的文字垂直居中。但是!文字字体的 line-height 默认会在文字的上方和下方留出空白(Leading)。结果:文字看起来总是偏下一点点,或者按钮的高度比你预期的要高,导致你不得不写 padding-top: -2px 这种丑陋的代码来微调。
现在可以把文字上下多余的空白切掉。
h1 {
/* 核心:告诉浏览器,我只要文字本身的像素高度 */
/* 不要把 line-height 撑出来的空白算进布局里 */
text-box-trim: trim-both;
/* 配合 text-box-edge 决定切到哪里(比如切到大写字母的高度) */
text-box-edge: cap alphabetic;
}底蕴价值: 这让 Web 排版终于有了 平面设计软件 (Figma/Sketch) 的精度。你可以精确地控制文字与其他元素的距离,而不再受字体本身奇怪的空白影响。

对齐图标的单位:cap (大写字母高度)
我们知道 px, em, rem, vh,但你可能不知道 cap。
痛点: 你想在一个按钮里放一个 SVG 图标,让它和文字完美对齐。
- 如果你设
height: 1em,图标会偏大,因为1em包含了字体的上下留白(Ascender + Descender)。 - 你不得不写
height: 0.7em或者transform: scale(0.8)这种魔法数字。
现代解法: 使用 cap 单位。
.icon {
/* 1cap = 当前字体大写字母的高度 (比如 'H' 的高度) */
height: 1cap;
width: 1cap;
/* 这样图标的高度就绝对等于文字的视觉高度,不多不少 */
}
底蕴价值: 这是排版相对论。em 是相对于字号的,cap 是相对于字形的。掌握这些细微的单位区别,你的 UI 对齐精度会提升一个档次。
以前我们为了让图标和文字视觉对齐,通常会写
height: 0.75em。但这
0.75是个魔数 (Magic Number)。换个字体(比如从 Arial 换成 Times New Roman),这个比例就变了,因为不同字体的大写字母占比不同。
1cap是智能的。 当你换字体时,浏览器会读取新字体的 Cap Height 信息,图标会自动调整大小,始终保持与大写字母等高。这就是标准的力量。
悬挂标点(未支持)
hanging-punctuation
这是中文/英文专业排版中非常高级的一个特性。
当一段话以“双引号”开头时,第一行的左边缘会因为引号的存在,比下面的文字往右缩进了一点点。
这导致左边的视觉对齐线是不直的(被引号破坏了)。
现代解法: 把标点符号“挂”在文本框的外面。
p {
/* 核心:
first: 允许开头的标点挂在左边缘外面
last: 允许结尾的标点挂在右边缘外面
force-end: 强制行尾标点悬挂
*/
hanging-punctuation: first last;
/* 配合两端对齐,效果极佳 */
text-align: justify;
}底蕴价值: 这是印刷级排版 (Editorial Design) 的标准。如果你在做阅读类 App、博客或新闻网站,这个属性会让你的页面瞬间拥有纸质书般的质感。
着重号
text-emphasis
在中文里,我们想强调某几个字,通常是用加粗或者变色。
但其实中文文法里,正统的强调方式是在字下面打着重号(小圆点)。以前 Web 做不到,只能用 border-bottom 模拟,或者用背景图。
现代解法: 原生支持着重号。
em {
/* 不要把 em 变成斜体(中文斜体很难看) */
font-style: normal;
/* 核心:在文字下方(或右方,如果是竖排)加点 */
text-emphasis: dot; /* 实心点 */
/* text-emphasis: circle; 空心圈 */
/* text-emphasis: "★"; 甚至可以用自定义字符! */
/* 还可以控制点的颜色 */
text-emphasis-color: red;
/* 控制位置(默认在上面,中文习惯在下面) */
text-emphasis-position: under right;
}底蕴价值: 这是文化自信。Web 标准不仅仅是为英文设计的,CSS 现在非常尊重东亚文字(CJK)的排版习惯。

尺寸的哲学:min-content, max-content, fit-content
这是彻底理解 CSS 盒模型尺寸计算 的关键。忘掉 width: auto 吧。
- 场景: 你做了一个标签(Tag),希望它的宽度“刚好包住文字,但不要太宽”。
- 三个魔法值:
.box {
/* 1. min-content: 哪怕换行,我也要变得尽可能窄 */
/* 比如文字是 "Hello World",它会断行成 "Hello" 的宽度 */
width: min-content;
/* 2. max-content: 死都不换行,我要变得尽可能宽 */
/* 哪怕冲出屏幕,也要把 "Hello World" 显示在一行 */
width: max-content;
/* 3. fit-content: 最完美的选择 */
/* 内容少时,我包裹内容(像 max-content) */
/* 内容多时,我自适应容器换行(像 auto) */
width: fit-content;
}
底蕴价值: 这是内在尺寸 (Intrinsic Sizing) 的概念。以前我们在外部强制给元素定宽(外在尺寸),现在我们让元素根据自己的内容决定大小。这是构建弹性组件库的核心逻辑。
- min-content: 盒子缩到了最窄。它的宽度由句子里最长的单词(“jumps” 或 “quick”)决定。它就像水一样,只要有缝隙就往下流(换行)。
- max-content: 盒子无视了红色的父容器边框!它直接冲出去了。因为它说:“我不换行,我需要显示整句话。”
- fit-content: 它是最智能的。它首先尝试像
max-content一样宽,但是当它发现自己碰到了红线(父容器边界)时,它就会乖乖换行,变成像auto一样。它是构建弹性组件(如 Tooltips、模态框)的最佳选择。
字体合成控制
你引入了一个只有“常规体”的中文字体。但是你在代码里写了 font-weight: bold。
结果: 浏览器发现这个字体没有粗体文件,于是它自己动手把文字描粗了一圈(伪粗体)。这通常非常难看,笔画会糊在一起。
现代解法: 禁止浏览器乱动。
.title {
font-family: "MyCustomFont";
/* 核心:
none: 禁止浏览器合成粗体、斜体。
如果字体包里没有粗体,就显示普通体,绝不造假。
*/
font-synthesis: none;
/* 也可以精细控制:只允许合成粗体,不允许合成斜体 */
/* font-synthesis: weight; */
}margin-trim (未实现)
这是 gap 属性的完美搭档(目前 Safari 支持最好,Chrome 正在跟进)。
- 痛点:
- 你在一个盒子里放了一堆段落
<p>,每个<p>都有margin-bottom: 20px。 - 问题: 最后一个
<p>的margin-bottom会把父容器撑大,导致底部留白变多。 - 以前的 Hack:
p:last-child { margin-bottom: 0; }。
- 你在一个盒子里放了一堆段落
- 现代解法: 让父容器自己剪掉多余的边距。
CSS
.card {
padding: 20px;
background: white;
/* 核心:剪掉子元素在"块级方向末尾"的所有 margin */
/* 这里的 margin-bottom: 20px 会被物理切除 */
margin-trim: block-end;
}底蕴价值: 这是容器对内容的控制权。它让组件的封装更加彻底——组件内部不需要关心自己是不是“最后一个”,父容器会处理好一切脏活累活。
代码排版神器:tab-size
如果你在做技术博客、文档站或者在线代码编辑器,这个属性是必修课。
- 痛点:
- 在
<pre><code>标签里,浏览器默认的 Tab 缩进是 8 个空格!太宽了,代码经常换行,非常难看。 - 以前的做法: 用 JS 把所有
\t替换成 2 个或 4 个空格。破坏了源码。
- 在
- 现代解法: 控制制表符宽度。
code, pre, textarea {
/* 核心:设定 Tab 键等于 2 个字符宽 */
/* 或者直接写像素:tab-size: 20px; */
-moz-tab-size: 2; /* Firefox 还需要前缀 */
tab-size: 2;
}底蕴价值: 这是对 空白字符 (Whitespace) 的控制权。它保留了 HTML 源码的纯净(还是 Tab),但改变了视觉表现。
字体的高级感:font-optical-sizing
这是配合 可变字体 (Variable Fonts) 使用的高端属性。
痛点:
- 同一个字体文件,用在标题(72px)上时,你会觉得笔画太粗、太笨重。
- 用在正文(12px)上时,你又觉得笔画太细、看不清。
- 传统印刷业: 同样的字体,设计时会为不同字号做微调(大字细而优雅,小字粗而易读)。Web 上以前做不到。
现代解法: 自动光学调整
html {
/* 前提:你使用的字体必须是支持 optical sizing 轴的可变字体 */
/* 大多数现代系统字体(如 San Francisco, Roboto Flex)都支持 */
/* 核心:
浏览器会自动根据 font-size 调整字体的粗细细节。
大字号 -> 自动变优雅(High Contrast)
小字号 -> 自动变清晰(Low Contrast)
*/
font-optical-sizing: auto;
}底蕴价值: 这是 响应式排版 的极致。响应式不仅仅是布局变,连字体的 DNA 都在随尺寸变化。
裁剪路径
clip-path 这是 CSS 绘图能力 的巅峰。
裁剪帮助网站:https://bennettfeely.com/clippy/
clip-path: <形状函数> | <SVG路径> | none;场景: 你想做一个 五角星形状 的头像,或者一个 带斜角的 科技感按钮。
以前的做法:
- 切一张透明 PNG(不清晰,体积大)。
- 用 SVG(需要写一堆标签)。
现代解法: 直接用 CSS 把盒子“剪”成你想要的形状。
.star-avatar {
width: 200px;
height: 200px;
background: gold;
/* 核心:定义裁剪的多边形坐标 (X Y, X Y, ...) */
/* 盒子还是那个盒子,但显示出来的部分变了 */
clip-path: polygon(
50% 0%,
61% 35%,
98% 35%,
68% 57%,
79% 91%,
50% 70%,
21% 91%,
32% 57%,
2% 35%,
39% 35%
);
/* 甚至支持动画!变成圆形 */
transition: clip-path 0.5s;
}
.star-avatar:hover {
clip-path: circle(50%);
}拼写检查
::spelling-error & ::grammar-error
当你在 <textarea> 里打错字时,浏览器会显示一条红色的波浪线。
这个红色波浪线太丑了,而且如果你做的是暗色模式编辑器,红色可能看不清。
现代解法: 自定义纠错样式。
/* 拼写错误(通常是红色波浪线) */
::spelling-error {
/* 改成黄色虚线下划线 */
text-decoration: underline wavy yellow;
background-color: rgba(255, 255, 0, 0.2);
color: inherit;
}
/* 语法错误(通常是绿色或蓝色波浪线) */
::grammar-error {
text-decoration: underline dotted lime;
}底蕴价值: 这对于开发 在线文档 (如 Notion/Google Docs 类产品) 或 代码编辑器 非常重要。它让浏览器原生的纠错功能融入你的产品设计语言。
多列布局优化
排版的孤儿与寡妇:orphans & widows
这两个词听起来很悲惨,但它们是 印刷排版 (Print Layout) 和 多列布局 (Multi-column) 的核心术语。
场景: 你用 CSS columns: 2 把文章分成了两列。
痛点:
- 孤儿 (Orphan): 一段话的 最后一行 单独跑到了第二列的顶部。
- 寡妇 (Widow): 一段话的 第一行 单独留在了第一列的底部。
- 这会破坏阅读的连续性。
现代解法: 强制规定最少行数。
p {
/* 核心:
orphans: 3 -> 如果一段话要断开,留在底部的至少要有 3 行。
widows: 3 -> 如果一段话要断开,移到下一列顶部的至少要有 3 行。
*/
orphans: 3;
widows: 3;
}底蕴价值: 这是 对内容的控制力。浏览器会自动计算断行位置,保证你的文章版块看起来整齐划一,不会出现“断头断尾”的尴尬。

变为:
多列布局美化
杂志标题横跨:column-span
这是 多列布局 (Multi-column) 中的点睛之笔。
你用 CSS columns: 3 把一篇长文分成了三列(像报纸一样)。
痛点: 文章中间有一个 <h2> 大标题。默认情况下,这个标题会被挤在某一列里,很窄,很丑。
你希望标题能横跨所有列,像杂志排版一样打断一下。
- 现代解法: 让元素跨列。
.article {
columns: 3; /* 分三列 */
}
h2 {
background: #eee;
padding: 10px;
/* 核心:
none: 默认,卡在列里。
all: 横跨所有列。标题上方是三列,下方也是三列,标题自己独占一行。
*/
column-span: all;
}底蕴价值: 这是 流体排版 的高级控制。它允许你在连续的文本流中插入“中断点”,创造出节奏感更强的阅读体验。
普通模式:

开启之后:

真正的小型大写字母
font-variant-caps
你想让一行英文标题显示为“小型大写字母”(SMALL CAPS)。
以前的做法: text-transform: uppercase; font-size: 0.8em;。
问题: 这样做的线条会变细(因为字号小了),导致和周围的正常文字粗细不均。
现代解法: 调用字体文件里专门设计好的小型大写字形。
h2 {
font-family: "Times New Roman", serif;
/* 核心:
使用字体设计师专门画的"小型大写字母"。
它们的粗细(Stroke Width)和正常大写字母是一样的,
只是个头矮一点。视觉上非常和谐。
*/
font-variant-caps: all-small-caps;
}底蕴价值: 这是对 字体排印 (Typography) 的尊重。你不是在暴力缩放文字,而是在切换字形(Glyphs)。这让网页看起来像精心排版的书籍。

描边文字优化
paint-order (绘制顺序)
设计师给了一个“文字描边”的效果。你用了 -webkit-text-stroke: 4px red;。
结果: 描边是居中绘制的!粗粗的描边把文字原本的笔画都吃掉了一半,文字变得细细的、丑丑的。
现代解法: 控制绘制层级。先画描边,再画文字填充。
h1 {
font-size: 60px;
fill: white;
stroke: red;
stroke-width: 4px;
/* 核心:
默认是 normal (先 fill 后 stroke)。
改成 stroke fill -> 先画描边,再画填充。
这样填充色会盖住描边的一半,文字原本的粗细就保住了!
*/
paint-order: stroke fill;
}底蕴价值: 这是 图形渲染管线 的微调。在 SVG 和 Canvas 中很常见,但在 CSS 中知道的人很少。它让 CSS 能够胜任更复杂的艺术字设计。
scroll-margin
简单来说,scroll-margin 是给 “滚动定位” 留出的 “安全距离”。
它是解决网页内锚点跳转(如点击目录跳转到某个标题)时,标题被固定的导航栏(Fixed Header)遮挡住的终极方案。
1. 痛点场景:消失的标题
你一定遇到过这种情况:点击页面的“联系我们”导航,页面确实滚下去了,但由于顶部有一个固定的导航条,导致“联系我们”这四个字被挡在了导航条下面,用户看不见。
以前的做法:
- 给元素加巨大的
padding-top和等值的负margin-top(代码非常脏)。 - 用 JavaScript 监听点击,手动计算滚动偏移量(增加性能开销)。
2. 现代解法:scroll-margin
它告诉浏览器:“当这个元素被滚动到视口顶部时,请在它上方额外留出一段空间。”
核心代码:
CSS
h2 {
/* 当用户跳转到这个标题时,上方会留出 80px 的间距 */
/* 这 80px 刚好可以放下一个固定的导航栏 */
scroll-margin-top: 80px;
}3. 取值列表与简写
你可以分别为四个方向设置边距,或者使用简写属性。
| 属性 | 作用说明 |
|---|---|
scroll-margin-top | 最常用。控制顶部滚动停止时的偏移量。 |
scroll-margin-bottom | 控制底部滚动停止时的偏移量。 |
scroll-margin-left/right | 在水平滚动(如图片轮播卡片)时非常有用。 |
scroll-margin | 简写属性。例如 scroll-margin: 20px 0;(上下 20px,左右 0)。 |
4. 深度底蕴:它与 margin 的区别
虽然名字里带 margin,但它是一个**“虚拟边距”**:
- 不影响布局:它不会改变盒子在文档流中的实际位置,也不会撑开背景色。
- 只在滚动时触发:只有当浏览器执行“滚动到该元素”的操作时(如
id锚点跳转、scrollIntoView()方法),这段间距才会生效。 - GPU 友好:这是浏览器原生的滚动策略,比 JS 模拟的滚动偏移更流畅。
🛠️ 综合实战:完美锚点跳转
既然你目前在开发 Astro 项目,这个属性特别适合放在你的博客正文或长页面的目录跳转中。配合 scroll-behavior: smooth,可以实现 App 级的丝滑体验:
CSS
html {
/* 全局平滑滚动 */
scroll-behavior: smooth;
}
section {
/* 确保每个章节跳转后,都不会被顶部的导航栏遮住 */
scroll-margin-top: 100px;
}💡 进阶:scroll-padding
如果你不想在每个标题上都写一遍,还有一个父级属性:scroll-padding。
- 用法:直接写在滚动的容器(通常是
html或body)上。 - 效果:它会把整个容器的“滚动可视区域”缩小。
CSS
html {
/* 整个页面的滚动锚点都会默认下移 80px */
scroll-padding-top: 80px;
}你想让我帮你把这个属性集成到你正在研究的 Tailwind CSS 配置或者 Astro 项目的全局样式中吗?我们可以一劳永逸地解决标题被遮挡的问题。
aspect-ratio
以前为了让一个 div 保持 16:9(比如视频容器),我们需要用 padding-top: 56.25% 这种反直觉的奇技淫巧。
现在只需要使用这个属性
.video-card {
width: 100%;
aspect-ratio: 16 / 9; /* 直接锁定宽高比 */
}它能自动根据宽度计算高度,或者根据高度计算宽度,极其优雅。
inset:绝对定位的缩写
写 position: absolute 时,经常要重复写 top, right, bottom, left。
/* 以前 */
.overlay {
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
}
/* 现在 */
.overlay {
position: absolute;
inset: 0; /* 一个属性顶四个 */
}甚至可以写 inset: 10px 20px(分别对应上下、左右)。
accent-color:一键换色
以前想改复选框(Checkbox)或单选框(Radio)的那个蓝色圆点,得写一两百行代码重写样式。
input {
accent-color: #ff5722; /* 一行代码,所有系统控件变成你的主题色 */
}
逻辑属性:不再分“上下左右”
其实这是 CSS 为了应对**“全球化”和“屏幕旋转”**而进行的一次底层逻辑大重构。
你可以把它们直接等同于你熟悉的 width 和 height,只不过它们是**“带脑子”的宽高**。
在以前的观念里,屏幕永远是横着的,文字永远是从左到右的。所以 width 就是横向,height 就是纵向。
但现代 Web 需要处理两种特殊情况:
- 垂直书写模式(比如日文、古诗):文字是从上往下写的。此时,你的“行”是垂直的,你的“块”是水平堆叠的。
- 移动端翻转:布局逻辑有时需要随之调整。
inline-size(行尺寸):指的是文字排列方向的长度。在中文里,就是宽度。block-size(块尺寸):指的是段落堆叠方向的长度。在中文里,就是高度。
想象你在写一首古诗:
.poem {
writing-mode: vertical-rl; /* 文字改为垂直排列 */
/* 如果你用物理属性: */
width: 200px; /* 无论文字怎么转,这盒子永远是 200px 宽 */
/* 如果你用逻辑属性: */
inline-size: 200px; /* 此时它会自动变成控制“高度”,因为文字是垂直流动的 */
}当你写 margin-inline: auto 时,大家一眼就知道你是为了水平居中内容
margin-inline:代替 margin-left 和 margin-right(水平边距)。
margin-block:代替 margin-top 和 margin-bottom(垂直边距)。
**inline-size: 100px;**逻辑尺寸(对应行长度)
**block-size: 100px;**逻辑尺寸(对应块高度)
filter与backdrop-filter
| 属性 | 作用对象 | 常见用途 | 示例效果 |
|---|---|---|---|
filter | 作用于元素自身内容(包括文字、图片、子元素) | 给元素本身加滤镜,如模糊、灰度、亮度调整 | 模糊图片本身 |
backdrop-filter | 作用于元素背后的内容(背景或下层元素) | 让元素的背景区域产生滤镜效果,比如毛玻璃 | 半透明背景+毛玻璃效果 |
兼容性
filter:主流浏览器都支持 ✅backdrop-filter:部分旧版浏览器(尤其是 Edge/IE)不支持 ❌
backdrop-filter必须配合半透明背景(如rgba()或透明图片)才可见效果,否则完全看不到。
他门语法格式几乎一样,但作用范围不同。我就只介绍其中之一
backdrop-filter 是什么?
backdrop-filter 用于给**元素后面的内容(背景)**添加滤镜效果,比如:
- 模糊(blur)
- 亮度调整(brightness)
- 对比度(contrast)
- 饱和度(saturate)
- 色相旋转(hue-rotate)
- 灰度(grayscale)
- 反相(invert)
🚫 注意:它作用于元素自身的背景之下的内容,而不是元素本身的内容。
基本语法
backdrop-filter: <filter-function> [<filter-function>]*;常见函数:
| 函数 | 说明 | 示例 |
|---|---|---|
blur() | 模糊效果 | blur(10px) |
brightness() | 调整亮度 | brightness(1.2)(比原图亮 20%) |
contrast() | 调整对比度 | contrast(0.8) |
grayscale() | 灰度化 | grayscale(0.5) |
saturate() | 饱和度 | saturate(150%) |
sepia() | 棕褐色调 | sepia(1) |
hue-rotate() | 色相旋转 | hue-rotate(90deg) |
invert() | 反相 | invert(1) |
常见用法示例
1️⃣ 制作模糊半透明背景(磨砂玻璃效果)
<div class="glass-card">
<h2>玻璃卡片</h2>
<p>这是一个使用 backdrop-filter 的模糊效果。</p>
</div>
.glass-card {
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.3);
padding: 20px;
color: white;
width: 300px;
}
body {
background: url('https://picsum.photos/800/600') no-repeat center/cover;
height: 100vh;
}🪞 这个效果就是典型的 “macOS 式磨砂玻璃”。
2️⃣ 同时使用多个滤镜
backdrop-filter: blur(8px) brightness(1.2) saturate(150%);3️⃣ 使用透明背景配合
如果没有半透明背景(如 rgba() 或 transparent),滤镜可能不会显示。
✅ 必须确保元素背景部分允许看到后面的内容。
🎨 五、搭配效果示例
.glass {
background: rgba(255, 255, 255, 0.15);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.3);
backdrop-filter: blur(12px) saturate(150%);
-webkit-backdrop-filter: blur(12px) saturate(150%);
}✨ 这个是很多 UI 框架(如 macOS Big Sur、iOS、Windows Fluent Design)使用的视觉风格。
混色背景示例
原背景:

设置filter

变为混色背景:

评论
评论加载中……