这三个CSS新特性,现在可以直接用了

更新日期: 2026-08-04 阅读: 221 标签: 特性

2026年3月,三个CSS特性在所有主流浏览器里正式达标了。说实话我翻浏览器更新日志的时候才发现,这几个功能其实早就逐步实现了,只是现在才完全统一。

这篇文章聊聊这三个东西:文本高亮API、text-indent的两个新关键字、还有font-family: math。每个都解决了前端写了好几年hack的麻烦事。


搜索高亮,不用再改DOM了

做过页内搜索的人都知道那套流程有多烦人:遍历文本节点、找匹配位置、用splitText切开、包一层<span>、再插回去。弄完之后还得记着清理这些span,不然DOM里全是残留节点。

我之前维护过一个这样的功能,每次看到代码里莫名其妙多出来的空span就很头疼。方案能跑,但写的时候就感觉不对——我只是想给文字加个背景色,为什么要动DOM结构?

Custom Highlight API的思路完全不一样。样式写在CSS里,用::highlight()定义;JavaScript只负责标出哪些文本区间需要高亮,注册到CSS.highlights就完事了。浏览器在渲染阶段直接画上去,不动DOM,不触发reflow。

::highlight(search-result) {
  background-color: oklch(88% 0.17 95);
  color: oklch(28% 0.03 240);
}
javascript:
const textNode = document.getElementById("content").firstChild;

const range = new Range();
range.setStart(textNode, 4);
range.setEnd(textNode, 24);

const highlight = new Highlight(range);
CSS.highlights.set("search-result", highlight);

浏览器内部的处理方式很有意思。布局阶段直接跳过了,文本位置早就计算好了;渲染引擎在绘制阶段遍历文本盒子时查一下高亮注册表,发现坐标重叠就直接在文字底下画一个背景矩形,再把文字盖上去。整个过程没有DOM变更,没有布局重算。简单说就是,浏览器相当于拿着一张便利贴记了坐标,而不是为了给几个字加颜色就重建整个页面。

兼容性方面,Chrome 105就支持了(2022年9月),Safari 17.2和Firefox 111也跟上了,2026年3月正式成为baseline。如果你需要支持更老的浏览器,可以把旧的span方案当作fallback,新项目直接上这个就行。


text-indent终于能正常做悬挂缩进了

text-indent这个属性从CSS诞生那天就有,但几十年来它只接受长度值。想做悬挂缩进(第一行顶格、后续行缩进)怎么办?给容器加padding-left,再给text-indent写个负值。能跑,但写起来像是在跟浏览器斗智斗勇。

现在两个新关键字hanging和each-line把这件事变成了声明式写法。

/* 悬挂缩进:第一行不动,后续行缩进3em */
cite {
  text-indent: 3em hanging;
}

以前做参考文献列表、术语表、代码注释对齐,都得绕那个负值hack。现在一行声明,浏览器自己处理对齐计算。

each-line解决的是另一个问题:正常的text-indent只影响block的第一行,如果中间有<br>强制换行,后面那行不算新block,不会缩进。写诗歌、歌词、剧本对话的时候就很烦。加上each-line,每个<br>后面的行也会正常缩进。

.poetry {
  text-indent: 2.5em each-line;
}

兼容性方面,Chrome 146补齐了最后一块(Safari和Firefox更早就实现了),2026年3月全浏览器达标。这个特性属于典型的"用了没坏处",老浏览器不支持最多就是缩进失效,布局不会崩。


数学公式,浏览器能直接渲染了

公式渲染这块我自己接触不多,但身边做教育产品和文档工具的朋友一直在抱怨:要么引KaTeX或MathJax(体积大、有运行时成本),要么把每个公式导出成SVG图片(屏幕阅读器读不了、没法选中复制)。

MathML加上font-family: math提供了原生路径。公式直接用HTML标签写,浏览器原生渲染,不需要任何外部JS库。

<math display="block">
  <msup>
    <mi>e</mi>
    <mrow>
      <mi>i</mi>
      <mi>π</mi>
    </mrow>
  </msup>
  <mo>+</mo>
  <mn>1</mn>
  <mo>=</mo>
  <mn>0</mn>
</math>

配合font-family: math,浏览器会调用系统里带数学排版表的字体(比如STIX或Latin Modern Math),分数、积分、上下标的堆叠都能正确处理。更重要的是,屏幕阅读器可以把公式朗读出来,对视障用户友好很多。

Chrome 109就支持了,其他浏览器随后跟上,现在也是baseline特性。

不过说实话,MathML的标签体系挺繁琐的。如果只是偶尔在博客里写一两个公式,手写MathML标签的成本比引KaTeX还高。这个特性的价值更多在于:浏览器原生支持了,工具链可以在此基础上做更好的封装。比如markdown渲染器可以直接输出MathML而不是调外部库。


上手建议

三个特性里,Highlight API是我最推荐尽快试的。搜索高亮、文本标注、diff展示,这些场景以前都要操作DOM,现在用Range + Highlight注册就行,代码量少了一半,性能还更好。Chrome 105起步的兼容性也足够覆盖绝大多数项目。

text-indent的新关键字属于渐进增强型改进。老代码不用改,新代码直接用hanging和each-line就行。不支持的老浏览器最多就是缩进失效,布局不会崩。做内容型网站、博客、文档的可以直接上。

MathML值得知道,但不一定急着手写。除非你正在做教育产品、学术文档或任何需要展示公式的工具,否则可以先放着,等你的markdown渲染器或富文本编辑器支持了再用。

下次你给页面做搜索高亮的时候,别在DOM里种span了。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

相关推荐

Html5、Css3、ES6的新特性

Html5的新特性语义化标签:有利于SEO,有助于爬虫抓取更多的有效信息,爬虫是依赖于标签来确定上下文和各个关键字的权重。表单新特性,多媒体视频(video)和音频(audio)

Js的用途和特性

JavaScript 最初的目的是为了“赋予网页生命”。这种编程语言我们称之为脚本。它们可以写在 HTML 中,在页面加载的时候会自动执行。脚本作为纯文本存在和执行。它们不需要特殊的准备或编译即可运行。

Angular 8的新特性介绍

在今天早些时候Angular团队发布了8.0.0稳定版。其实早在NgConf 2019大会上,演讲者就已经提及了从工具到差分加载的许多内容以及更多令人敬畏的功能。下面是我对8.0.0一些新功能的简单介绍,希望可以帮助大家快速了解新版本

Js即将到来的3个新特性

Optional Chaining(可选链式调用);Nullish coalescing(空值合并);Pipeline operator(管道运算符)通过三个函数对字符串进行处理;

CSS新特性contain,控制页面的重绘与重排

contain 属性允许我们指定特定的 DOM 元素和它的子元素,让它们能够独立于整个 DOM 树结构之外。目的是能够让浏览器有能力只对部分元素进行重绘、重排,而不必每次都针对整个页面。

ES2019 新特性汇总

最近 ECMAScript2019,最新提案完成:tc39 Finished Proposals,我这里也是按照官方介绍的顺序进行整理,如有疑问,可以查看官方介绍啦~另外之前也整理了 《ES6/ES7/ES8/ES9系列》,可以一起看哈。

解密HTTP/2与HTTP/3 的新特性

HTTP/2 相比于 HTTP/1.1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何优雅降级应该是国内还不普遍使用的原因之一。

ES9(2018)新特性:异步迭代、Promise.finally、Rest/Spread等

ES9是ECMA协会在2018年6月发行的一个版本,因为是ECMAScript的第九个版本,所以也称为ES9。本篇文章介绍ES2018(ES9)的新特性,来看看怎么使用它们。

十个超级实用的 JS 特性

你可能刚上手 JavaScript,或者只是曾经偶尔用过。不管怎样,JavaScript 改变了很多,有些特性非常值得一用。 这篇文章介绍了一些特性,在我看来,一个严肃的 JavaScript 开发者每天都多多少少会用到这些特性

ES6新特性--var、let、const

var不存在块级作用域,具有变量提升机制。 let和const存在块级作用域,不存在变量提升。在同一作用域内只能声明一次。const在声明时需要赋值且无法修改,但如果常量是对象,则对象的属性可以修改。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!