CSS文字&排版&布局

关于文本不换行,你的直觉很准。CSS 之所以现在提供这么多属性,是因为“不换行”这个需求在现代布局中变得越来越…

文字换行相关

关于文本不换行,你的直觉很准。CSS 之所以现在提供这么多属性,是因为**“不换行”这个需求在现代布局中变得越来越精细:有的是为了强制文本一行走到底**,有的是为了防止内容撑破容器,还有的是为了逻辑上的整洁

以下是针对这些属性的深度拆解和现代方案总结。

white-space vs text-wrap

这是你提到的两个最容易搞混的属性。

white-space: nowrap; (传统全能王)

这是最经典的做法。它其实是一个“复合属性”,它不仅控制不换行,还控制空格和换行符的处理。

副作用:它会把代码里的多个空格合并成一个。

地位:它是目前的工业标准,兼容性 100%。

image-20260207235117584

变为:

image-20260207235059093

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:浏览器默认,哪到头了在哪断。

image-20260207235741575

balance(神技):文本平衡

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

image-20260207235801151

pretty(慢工出细活):

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

只保证不出现孤词

image-20260207235957104

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> 标签。
  • 场景:非常适合做那种“横向滚动的卡片标题”或“不希望被压缩的表格单元格”。

上面的情况直接变为

image-20260208001636757

3. 现代方案的“全家桶”:为什么需要这么多?

除了简单的“不换行”,我们通常还需要处理**“不换行后的后续工作”**。

A. 经典的“单行文本截断”

光有不换行是不够的,通常我们要配合这三剑客:

css
.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,它会作为基础偏移量叠加上去。

如果你想调出一手漂亮的排版,这几个属性通常是成对出现的:

css
p {
  /* 1. 断行逻辑 */
  word-break: auto-phrase; 
  /* 2. 单词间距 */
  word-spacing: 2px;
  /* 3. 字符间距 (中文微调常用) */
  letter-spacing: 0.5px;
  /* 4. 行间距 */
  line-height: 1.6;
}

image-20260212192207215

前两者都是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两端对齐除了最后一行外,拉开字间距使左右边缘对齐。

现代逻辑属性:startend

随着全球化网页(i18n)的普及,硬编码的 leftright 正在被逻辑属性取代。

text-align: start;:在从左往右(LTR)的语言(如中文)中是左对齐;在从右往左(RTL)的语言(如阿拉伯语)中自动变为右对齐。 text-align: end;:反之亦然。

两端对齐:text-align-last

这是你之前重点提到的“强制两端对齐”技巧。

  • 痛点text-align: justify 默认不会对最后一行(或只有一行的文本)生效。
  • 现代解法:使用 text-align-last: justify;
  • 场景:做简历、发票、表单 Label 时的必备神器,能强制将“姓名”和“联系电话”拉伸到同样的宽度。
css
.label {
  width: 100px;
  text-align: justify;
  /* 核心:即使这段文字只有一行(也是最后一行),
     也要强制把文字拉开,填满 100px 的宽度。
  */
  text-align-last: justify;
}

底蕴价值: 这是 排版规则的暴力破解。它解决了中文排版中特有的“对齐强迫症”,让表单看起来极其规整。

image-20260211223237024

在 CSS 渲染逻辑中,text-align: justify 是为了让段落中间的行变整齐,但规范规定:段落的最后一行(或只有一行时)永远不进行两端对齐,而是保持在书写方向的起始端(通常是左侧)。

css
text-align: justify:开启了两端对齐的“潜能”。
text-align-last: justify:打破了保护机制,强制要求哪怕只有这一行,也要把多余的空间平摊到每个字之间。

文本省略

首字下沉

initial-letter 这是一个专门提升阅读体验的属性,让网页排版向纸媒(杂志、报纸)看齐。

文章第一段的第一个字特别大,占据三行高度(Drop Cap)。

css
p::first-letter {
  /* 参数1: 占据几行高度 (3行) */
  /* 参数2: 下沉几行 (默认就是占据的行数,也可以设置更少) */
  initial-letter: 3; 
  
  color: gold;
  font-weight: bold;
  margin-right: 0.5em;
}

image-20260211200057897

这里面还有报纸分栏,很多CSS值得学习

html
<!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>

控制打印

@pagebreak-inside

很多前端工程师会忽略网页的打印样式。但如果你在做 B 端系统(报表、发票),这非常重要。

打印网页时,一个表格经常被切成两半(一半在第一页,一半在第二页),非常难看,所以现在控制分页行为:

css
@media print {
  /* 设置页边距,甚至可以隐藏页眉页脚 */
  @page {
    margin: 1cm;
    size: A4 portrait; /* 强制 A4 纵向 */
  }

  .card, table, img {
    /* 核心:禁止在元素内部强行分页 */
    /* 浏览器会尽量把它整个移到下一页去 */
    break-inside: avoid; 
  }
}

底蕴价值: 这是对**多媒介(Media Types)**的掌控。Web 不仅仅是在屏幕上看的,也是可以被输出到纸张上的。掌握这个,能让你在处理企业级报表需求时游刃有余。

异形排版

shape-outside 这是 Web 排版中最具艺术感的属性之一。

痛点: 网页上所有的盒子默认都是矩形的。如果你放一张圆形的图片,文字还是会绕着它的矩形边界排布,导致四个角有很大的空白,非常难看。

现代解法: 让文字沿着图片的轮廓流动。

css
.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(裁剪路径),你可以做出杂志级别的创意排版,比如文字环绕着一个不规则的瓶子流动。

image-20260211200559979

css
      /* 视觉上切成六边形 */
      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,因为那是矩形的边距。现代解法: 给“形状”加边距。

css
.circle-img {
  float: left;
  shape-outside: circle(50%);

  /* 核心:
     在那个看不见的圆形轮廓外面,再推开 20px。
     文字会沿着这个扩大的圆形轮廓排布。
  */
  shape-margin: 20px;
}

image-20260211222746581

文本省略号

纯 CSS 里,实现“长文本显示省略号(…)”有几种常见方式,具体取决于是 单行 还是 多行

✅ 单行文本省略号

最常见,也是兼容性最好:

css
.ellipsis-single {
  overflow: hidden;          /* 超出隐藏 */
  white-space: nowrap;       /* 不换行 */
  text-overflow: ellipsis;   /* 超出显示省略号 */
}

要生效:必须和 width 或者 max-width 一起使用,否则没法触发“超出”。

✅ 多行文本省略号(WebKit 内核)

CSS 本身没有完全标准化的多行省略方案,常用的是 -webkit-line-clamp

css
.ellipsis-multi {
  display: -webkit-box;            /* 弹性伸缩盒 */
  -webkit-box-orient: vertical;    /* 垂直排列 */
  -webkit-line-clamp: 3;           /* 限制显示 3 行 */
  overflow: hidden;                /* 超出隐藏 */
}

⚠️ 注意:

  • 这是 WebKit 专属属性(Chrome、Safari、Edge 新版支持较好)。
  • Firefox 直到比较新的版本才开始实验性支持。

✅ 其他方案

  1. 渐变遮罩(更优雅):

    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 行,多余的变…”。

css
display: -webkit-box; /* 必须变成弹性伸缩盒 */
-webkit-box-orient: vertical; /* 必须垂直排列 */
-webkit-line-clamp: 3; /* 必须用私有前缀 */
overflow: hidden;

这堆代码非常脆弱,稍微改一下 display 就失效了。

现代解法: 它是 overflow 的一种属性。

css
.text {
  /* 标准属性:当作为块级元素时,限制行数 */
  line-clamp: 3;
  /* 配合 content-visibility 甚至可以做长文本性能优化 */
}

底蕴价值: 这代表了 CSS 标准化的胜利。我们将不再依赖浏览器的怪异模式,而是拥有了稳定、可预测的文本截断能力。

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 窄。后果: 当你做一个快速跳动的倒计时(比如秒表),因为数字宽度一直在变,整个字符串就会左右抖动,看起来非常廉价。或者在财务报表里,上下两行的数字无法对齐小数点。现在可以强制开启字体的“等宽数字”特性。

css
.countdown, .finance-table {
  /* 核心:告诉字体文件,我要用等宽的数字字形 */
  /* 即使是 Arial 或 Helvetica,数字也会变得像代码一样整齐 */
  font-variant-numeric: tabular-nums; 
}

底蕴价值: 这是字体排印学 (Typography) 的知识。你不需要换成丑丑的“等宽字体”(Monospace),就能拥有等宽字体的对齐优势,同时保留无衬线字体的美感。

image-20260211201847905

强制把每个数字的占用宽度设置为等宽

下划线现代化

text-underline-offset

痛点: 默认的 text-decoration: underline 非常丑。那根线紧贴着文字底部,还会切断像 g, j, p, q, y 这种有下伸部(Descender)的字母。以前的 Hack:border-bottom 模拟下划线,但很难控制粗细和颜色,而且换行时会断裂。现在可以调整下划线的偏移量。

css
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) 的控制力。

image-20260211202138850

优雅:

image-20260211202219993

配合 text-decoration-style: wavy 可以做拼写检查效果,offset 让波浪线不会挡住文字。

以前的下划线方案展示:

text-decoration相关属性添加下划线

css
.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

css
.element {
    display: inline-block;
    /* 设置距离 */
    padding-bottom: 9px;
    /* 设置样式大小颜色 */
    border-bottom: 2px solid red;
}

shadow添加下划线

image-20250914181302757

css
display: inline;
box-shadow: 0px 3px 0px 0px red;

box-shadow 使用两个内阴影画一条下划线:一个用于创建长方形,另一个覆盖在上面。这意味着该属性必须在纯色背景上使用。

可以使用 text-shadow 覆盖下行字母附近的下划线,但必须使用与背景色一样的颜色。这意味着只在纯色背景上有效,而不能应用于渐变色或者图片上。(也就是文字其实有个白色边框,这样就会覆盖住下划线)

css
.text-shadow {
    text-shadow: -2px -2px white, -2px 2px white, 2px -2px white, 2px 2px white;
}

image-20250914181202421

把绿色换成白色就达到了,这种方式只针对纯色背景起效

最简单的下划线:

css
/*向内一条线*/
box-shadow: inset 0px -2px #000;
/*向外一条线*/
box-shadow: 0px 2px #000;
/*如果希望线更远,控制距离,只有一条线的话,线会变粗,所以需要第二条纯色背景线来覆盖住粗的那部分*/
box-shadow: inset 0 -0.175em #fff, inset 0 -0.2em #000;
css
/*设置多条线来画出两条双下划线*/
.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-gradientbackground-position 创建沿着文本水平复制的图像。

这个方法也要设置 display: inline;

image-20250914180201144

以波浪线为例:

css
.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;

image-20250914183747780

改变排版方向

writing-mode这是国际化布局创意排版的核心。1

取值 (Value)文字流向 (Inline Axis)换行/块流向 (Block Axis)视觉原点 (Start)width 控制什么?height 控制什么?典型应用场景
horizontal-tb (默认)左 → 右 (水平)↓ 下一行 (垂直)左上角容器宽度 (水平尺寸)容器高度 (垂直尺寸)99% 的现代网页 中文/英文横排
vertical-rl上 ↓ 下 (垂直)← 左一列 (水平)右上角列的总宽 (视觉上的横向距离)单行文字长度 (视觉上的纵向高度)古诗词展示 日文/繁体中文书籍 竖排菜单
vertical-lr上 ↓ 下 (垂直)→ 右一列 (水平)左上角列的总宽 (视觉上的横向距离)单行文字长度 (视觉上的纵向高度)现代侧边栏标题 蒙古文排版
sideways-rl (实验性)下 ↑ 上 (垂直)→ 右一列左下角(同上)(同上)极少使用 (仅 Firefox 支持)

场景:

  1. 你需要做中文的竖排古诗词展示。
  2. 或者,你想做一个侧边栏标题,文字是侧着竖起来的(不是旋转,是竖排)。

以前的做法: 给每个字包一个 span 然后换行,或者用 transform: rotate(90deg)(这样字的方向是歪的)。

现代解法: 改变书写模式。

css
.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 (物理属性) 的原因——为了适应这种书写模式的变化。

image-20260211202653428

如果没有这个属性:

image-20260211202811719

专业的断词:hyphens: auto

这是移动端排版的神器,尤其是英文内容。

  • 痛点: 在手机窄屏上,如果有一个很长的单词(比如 congratulations),它放不下一行,就会被挤到下一行。
    • 结果:上一行留下了一个巨大的空白缺口
  • 以前的做法: word-break: break-all。这会把单词暴力切断(比如 congra-tulations 断在奇怪的地方),阅读体验极差。
  • 现代解法: 启用字典连字符。
css
article {
  /* 必须配合 HTML 的 lang 属性使用,比如 <html lang="en"> */
  /* 浏览器会查内置字典,在正确的音节处加连字符 "-" */
  hyphens: auto; 
  
  /* 配合两端对齐,排版效果堪比印刷品 */
  text-align: justify;
}

底蕴价值: 这是排版学 (Typography) 的细节。浏览器不仅是渲染引擎,它还内置了语言学知识库。调用这个库,让你的网页看起来更像一本精致的书。

跨行样式修复

box-decoration-break: clone,它专门解决行内元素换行时的样式断裂问题。

  • 痛点:
    • 你给一段行内文本 (<span>) 加了一个渐变背景和圆角。
    • 当这段文字太长折行时,浏览器默认会把这它当成“一根被切断的火腿肠”——第一行的右边没有圆角,第二行的左边也没有圆角,渐变也是截断的。非常难看。
  • 现代解法: 告诉浏览器:“请把每一行都当做一个独立的盒子来渲染。”
css
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 个属性 进行“克隆”:

  1. background: 每一行都有完整的渐变(而不是渐变跨越两行)。
  2. border-radius: 每一行的四个角都是圆的(不再是左边直角、右边直角)。
  3. border: 每一行都有完整的四周边框(断口处会自动补上边框)。
  4. box-shadow: 每一行都有完整的阴影。
  5. padding: 每一行的左右都会有内边距(文字不会顶到边缘)。
  6. margin: 每一行的左右都会有外边距。

image-20260211203551132

image-20260211203604969

防止字体抖动

font-size-adjust

这是字体排印的高阶技巧,专门解决 Web 字体加载慢导致的问题。

痛点: 网页加载时,Web Font 还没下载好,浏览器先用 Arial 显示。

  • 问题: 同样的 16px,Arial 看起来比你要用的“苹方”或者“Roboto”要(因为不同字体的 x-height 不同)。
  • 后果: 页面加载瞬间,文字会“崩”一下,布局会跳动 (CLS - Cumulative Layout Shift)。

现代解法: 强行统一字体的视觉大小。

css
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 这种丑陋的代码来微调。

现在可以把文字上下多余的空白切掉。

css
h1 {
  /* 核心:告诉浏览器,我只要文字本身的像素高度 */
  /* 不要把 line-height 撑出来的空白算进布局里 */
  text-box-trim: trim-both;
  
  /* 配合 text-box-edge 决定切到哪里(比如切到大写字母的高度) */
  text-box-edge: cap alphabetic;
}

底蕴价值: 这让 Web 排版终于有了 平面设计软件 (Figma/Sketch) 的精度。你可以精确地控制文字与其他元素的距离,而不再受字体本身奇怪的空白影响。

image-20260211204220532

对齐图标的单位:cap (大写字母高度)

我们知道 px, em, rem, vh,但你可能不知道 cap

痛点: 你想在一个按钮里放一个 SVG 图标,让它和文字完美对齐

  • 如果你设 height: 1em,图标会偏大,因为 1em 包含了字体的上下留白(Ascender + Descender)。
  • 你不得不写 height: 0.7em 或者 transform: scale(0.8) 这种魔法数字。

现代解法: 使用 cap 单位。

css
.icon {
  /* 1cap = 当前字体大写字母的高度 (比如 'H' 的高度) */
  height: 1cap; 
  width: 1cap;
  
  /* 这样图标的高度就绝对等于文字的视觉高度,不多不少 */
}

image-20260211204524229

底蕴价值: 这是排版相对论em 是相对于字号的,cap 是相对于字形的。掌握这些细微的单位区别,你的 UI 对齐精度会提升一个档次。

以前我们为了让图标和文字视觉对齐,通常会写 height: 0.75em

但这 0.75 是个魔数 (Magic Number)。换个字体(比如从 Arial 换成 Times New Roman),这个比例就变了,因为不同字体的大写字母占比不同。

1cap 是智能的。 当你换字体时,浏览器会读取新字体的 Cap Height 信息,图标会自动调整大小,始终保持与大写字母等高。这就是标准的力量。

悬挂标点(未支持)

hanging-punctuation

这是中文/英文专业排版中非常高级的一个特性。

当一段话以“双引号”开头时,第一行的左边缘会因为引号的存在,比下面的文字往右缩进了一点点。

这导致左边的视觉对齐线是不直的(被引号破坏了)。

现代解法: 把标点符号“挂”在文本框的外面。

css
p {
  /* 核心:
     first: 允许开头的标点挂在左边缘外面
     last: 允许结尾的标点挂在右边缘外面
     force-end: 强制行尾标点悬挂
  */
  hanging-punctuation: first last;
  /* 配合两端对齐,效果极佳 */
  text-align: justify;
}

底蕴价值: 这是印刷级排版 (Editorial Design) 的标准。如果你在做阅读类 App、博客或新闻网站,这个属性会让你的页面瞬间拥有纸质书般的质感。

着重号

text-emphasis

在中文里,我们想强调某几个字,通常是用加粗或者变色

但其实中文文法里,正统的强调方式是在字下面打着重号(小圆点)。以前 Web 做不到,只能用 border-bottom 模拟,或者用背景图。

现代解法: 原生支持着重号。

css
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)的排版习惯。

image-20260211210438520

尺寸的哲学:min-content, max-content, fit-content

这是彻底理解 CSS 盒模型尺寸计算 的关键。忘掉 width: auto 吧。

  • 场景: 你做了一个标签(Tag),希望它的宽度“刚好包住文字,但不要太宽”。
  • 三个魔法值:
css
.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;
}

image-20260211210653331

底蕴价值: 这是内在尺寸 (Intrinsic Sizing) 的概念。以前我们在外部强制给元素定宽(外在尺寸),现在我们让元素根据自己的内容决定大小。这是构建弹性组件库的核心逻辑。

  • min-content: 盒子缩到了最窄。它的宽度由句子里最长的单词(“jumps” 或 “quick”)决定。它就像水一样,只要有缝隙就往下流(换行)。
  • max-content: 盒子无视了红色的父容器边框!它直接冲出去了。因为它说:“我不换行,我需要显示整句话。”
  • fit-content: 它是最智能的。它首先尝试像 max-content 一样宽,但是当它发现自己碰到了红线(父容器边界)时,它就会乖乖换行,变成像 auto 一样。它是构建弹性组件(如 Tooltips、模态框)的最佳选择。

字体合成控制

你引入了一个只有“常规体”的中文字体。但是你在代码里写了 font-weight: bold

结果: 浏览器发现这个字体没有粗体文件,于是它自己动手把文字描粗了一圈(伪粗体)。这通常非常难看,笔画会糊在一起。

现代解法: 禁止浏览器乱动。

css
.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

css
.card {
  padding: 20px;
  background: white;
  
  /* 核心:剪掉子元素在"块级方向末尾"的所有 margin */
  /* 这里的 margin-bottom: 20px 会被物理切除 */
  margin-trim: block-end; 
}

底蕴价值: 这是容器对内容的控制权。它让组件的封装更加彻底——组件内部不需要关心自己是不是“最后一个”,父容器会处理好一切脏活累活。

代码排版神器:tab-size

如果你在做技术博客、文档站或者在线代码编辑器,这个属性是必修课。

  • 痛点:
    • <pre><code> 标签里,浏览器默认的 Tab 缩进是 8 个空格!太宽了,代码经常换行,非常难看。
    • 以前的做法: 用 JS 把所有 \t 替换成 2 个或 4 个空格 。破坏了源码。
  • 现代解法: 控制制表符宽度。
css
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 上以前做不到。

现代解法: 自动光学调整

css
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 把盒子“剪”成你想要的形状。

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> 里打错字时,浏览器会显示一条红色的波浪线。

这个红色波浪线太丑了,而且如果你做的是暗色模式编辑器,红色可能看不清。

现代解法: 自定义纠错样式。

css
/* 拼写错误(通常是红色波浪线) */
::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): 一段话的 第一行 单独留在了第一列的底部。
  • 这会破坏阅读的连续性。

现代解法: 强制规定最少行数。

css
p {
  /* 核心:
     orphans: 3 -> 如果一段话要断开,留在底部的至少要有 3 行。
     widows: 3  -> 如果一段话要断开,移到下一列顶部的至少要有 3 行。
  */
  orphans: 3;
  widows: 3;
}

底蕴价值: 这是 对内容的控制力。浏览器会自动计算断行位置,保证你的文章版块看起来整齐划一,不会出现“断头断尾”的尴尬。

image-20260211221703446

变为:image-20260211221717806

多列布局美化

杂志标题横跨:column-span

这是 多列布局 (Multi-column) 中的点睛之笔。

你用 CSS columns: 3 把一篇长文分成了三列(像报纸一样)。 痛点: 文章中间有一个 <h2> 大标题。默认情况下,这个标题会被挤在某一列里,很窄,很丑。

你希望标题能横跨所有列,像杂志排版一样打断一下。

  • 现代解法: 让元素跨列。
css
.article {
  columns: 3; /* 分三列 */
}

h2 {
  background: #eee;
  padding: 10px;
  /* 核心:
     none: 默认,卡在列里。
     all: 横跨所有列。标题上方是三列,下方也是三列,标题自己独占一行。
  */
  column-span: all; 
}

底蕴价值: 这是 流体排版 的高级控制。它允许你在连续的文本流中插入“中断点”,创造出节奏感更强的阅读体验。

普通模式:

image-20260211222155682

开启之后:

image-20260211222209629

真正的小型大写字母

font-variant-caps

你想让一行英文标题显示为“小型大写字母”(SMALL CAPS)。

以前的做法: text-transform: uppercase; font-size: 0.8em;

问题: 这样做的线条会变细(因为字号小了),导致和周围的正常文字粗细不均。

现代解法: 调用字体文件里专门设计好的小型大写字形。

css
h2 {
  font-family: "Times New Roman", serif;

  /* 核心:
     使用字体设计师专门画的"小型大写字母"。
     它们的粗细(Stroke Width)和正常大写字母是一样的,
     只是个头矮一点。视觉上非常和谐。
  */
  font-variant-caps: all-small-caps;
}

底蕴价值: 这是对 字体排印 (Typography) 的尊重。你不是在暴力缩放文字,而是在切换字形(Glyphs)。这让网页看起来像精心排版的书籍。

image-20260211222407651

描边文字优化

paint-order (绘制顺序)

设计师给了一个“文字描边”的效果。你用了 -webkit-text-stroke: 4px red;

结果: 描边是居中绘制的!粗粗的描边把文字原本的笔画都吃掉了一半,文字变得细细的、丑丑的。

现代解法: 控制绘制层级。先画描边,再画文字填充。

css
h1 {
  font-size: 60px;
  fill: white;
  stroke: red;
  stroke-width: 4px;
  
  /* 核心:
     默认是 normal (先 fill 后 stroke)。
     改成 stroke fill -> 先画描边,再画填充。
     这样填充色会盖住描边的一半,文字原本的粗细就保住了!
  */
  paint-order: stroke fill;
}

底蕴价值: 这是 图形渲染管线 的微调。在 SVG 和 Canvas 中很常见,但在 CSS 中知道的人很少。它让 CSS 能够胜任更复杂的艺术字设计。image-20260211222957253

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,但它是一个**“虚拟边距”**:

  1. 不影响布局:它不会改变盒子在文档流中的实际位置,也不会撑开背景色。
  2. 只在滚动时触发:只有当浏览器执行“滚动到该元素”的操作时(如 id 锚点跳转、scrollIntoView() 方法),这段间距才会生效。
  3. GPU 友好:这是浏览器原生的滚动策略,比 JS 模拟的滚动偏移更流畅。

🛠️ 综合实战:完美锚点跳转

既然你目前在开发 Astro 项目,这个属性特别适合放在你的博客正文或长页面的目录跳转中。配合 scroll-behavior: smooth,可以实现 App 级的丝滑体验:

CSS

html {
  /* 全局平滑滚动 */
  scroll-behavior: smooth;
}

section {
  /* 确保每个章节跳转后,都不会被顶部的导航栏遮住 */
  scroll-margin-top: 100px;
}

💡 进阶:scroll-padding

如果你不想在每个标题上都写一遍,还有一个父级属性:scroll-padding

  • 用法:直接写在滚动的容器(通常是 htmlbody)上。
  • 效果:它会把整个容器的“滚动可视区域”缩小。

CSS

html {
  /* 整个页面的滚动锚点都会默认下移 80px */
  scroll-padding-top: 80px;
}

你想让我帮你把这个属性集成到你正在研究的 Tailwind CSS 配置或者 Astro 项目的全局样式中吗?我们可以一劳永逸地解决标题被遮挡的问题。

aspect-ratio

以前为了让一个 div 保持 16:9(比如视频容器),我们需要用 padding-top: 56.25% 这种反直觉的奇技淫巧。

现在只需要使用这个属性

css
.video-card {
  width: 100%;
  aspect-ratio: 16 / 9; /* 直接锁定宽高比 */
}

它能自动根据宽度计算高度,或者根据高度计算宽度,极其优雅。

inset:绝对定位的缩写

position: absolute 时,经常要重复写 top, right, bottom, left

css
/* 以前 */
.overlay {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
}

/* 现在 */
.overlay {
  position: absolute;
  inset: 0; /* 一个属性顶四个 */
}

甚至可以写 inset: 10px 20px(分别对应上下、左右)。

accent-color:一键换色

以前想改复选框(Checkbox)或单选框(Radio)的那个蓝色圆点,得写一两百行代码重写样式。

css
input {
  accent-color: #ff5722; /* 一行代码,所有系统控件变成你的主题色 */
}

image-20260207161925113

逻辑属性:不再分“上下左右”

其实这是 CSS 为了应对**“全球化”“屏幕旋转”**而进行的一次底层逻辑大重构。

你可以把它们直接等同于你熟悉的 widthheight,只不过它们是**“带脑子”的宽高**。

在以前的观念里,屏幕永远是横着的,文字永远是从左到右的。所以 width 就是横向,height 就是纵向。

但现代 Web 需要处理两种特殊情况:

  1. 垂直书写模式(比如日文、古诗):文字是从上往下写的。此时,你的“行”是垂直的,你的“块”是水平堆叠的。
  2. 移动端翻转:布局逻辑有时需要随之调整。
  • inline-size (行尺寸):指的是文字排列方向的长度。在中文里,就是宽度
  • block-size (块尺寸):指的是段落堆叠方向的长度。在中文里,就是高度

想象你在写一首古诗:

css
.poem {
  writing-mode: vertical-rl; /* 文字改为垂直排列 */
  /* 如果你用物理属性: */
  width: 200px;  /* 无论文字怎么转,这盒子永远是 200px 宽 */
  /* 如果你用逻辑属性: */
  inline-size: 200px; /* 此时它会自动变成控制“高度”,因为文字是垂直流动的 */
}

当你写 margin-inline: auto 时,大家一眼就知道你是为了水平居中内容

margin-inline:代替 margin-leftmargin-right(水平边距)。

margin-block:代替 margin-topmargin-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️⃣ 制作模糊半透明背景(磨砂玻璃效果)

html
<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️⃣ 同时使用多个滤镜

css
backdrop-filter: blur(8px) brightness(1.2) saturate(150%);

3️⃣ 使用透明背景配合

如果没有半透明背景(如 rgba()transparent),滤镜可能不会显示。 ✅ 必须确保元素背景部分允许看到后面的内容

🎨 五、搭配效果示例

css
.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)使用的视觉风格。

混色背景示例

原背景:

image-20251010151849996

设置filter

image-20251010151912322

变为混色背景:

image-20251010151933897

评论

评论加载中……