惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
罗磊的独立博客
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
B
Blog RSS Feed

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
不要搞混了,不是text而是CSS font-size-adjust属性 « 张鑫...
张鑫旭,zhangxinxu · 2025-02-12 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=11527
本文可全文转载,独立域名个人网站无需授权,但需要保留原作者、出处以及文中链接,任何网站均可摘要聚合,商用请联系授权。

font-size-adjust封面占位图

介绍一个前端新特性,CSS font-size-adjust属性,语法还有些小复杂,研究了下,怎么说呢,非常细节的一个CSS属性,设计的初衷是解决一个小众的问题场景。

一、不同字体下的字形大小问题

我们给一段文字设置同样大小的字号,要是字体的类型不同,那么呈现的大小就会有明显的不同。

例如,中文字体中的楷体就比雅黑和苹方字体显得小,英文字体中的Times字体就比Verdana字体显得小。

为了让整体字体下的视觉表现接近,于是就设计了font-size-adjust这个CSS属性,可以指定字体的尺寸。

参见下面的代码和截图示意:

<h4>中文字体</h4>
<p>我是中文内容,都是16px,最终的表现为?</p>
<p style="font-family: STKaiti, KaiTi">我是中文内容,都是16px,最终的表现为?</p>

明明都是16px,结果楷体的字形大小小了一圈:

楷体表现

英文也是类似的,衬线字体看起来都小了一圈。

<h4>英文字体</h4>
<p style="font-family: verdana">Welcome to support my new book - HTML is not simple</p>
<p style="font-family: Times">Welcome to support my new book - HTML is not simple</p>

英文衬线字体小一号

尤其英文,字体不同,其占据的宽度大小区别很大,这就导致,原本可以一行展示的内容,在其他设备上就是两行,而造成布局问题。

我们可以使用font-size-adjust进行微调,使细节完美。

使用Example案例

如何调整?可以根据小写字母x的高度占比进行统一设置。

以上面的案例继续举例,只需要增加这样一行代码,苹方和楷体的视觉大小就很很接近。

p {
  font-size-adjust: 0.545;
}

此时的中英文排版效果就会是这样:

font-size-adjust调整后的效果

为何这里的值是0.545呢?

因为Verdana字体的纵横比值的精确值就是0.545,当我们设置这个值的时候,无论什么字体的小写字母x都会按照0.545的纵横比渲染,于是Times这种字体的视觉表现,就会跟Verdana类似。

这就是font-size-adjust属性作用的原理,然而,font-size-adjust属性不仅仅这些,如果我们希望基于大写字母设置怎么办?如果希望基于字形的宽度设置,又如何?

这些font-size-adjust属性都支持,下面深入了解下font-size-adjust属性的语法。

二、深入font-size-adjust语法

先看一些语法使用示意:

/* 关键字值 */
font-size-adjust: none;

/* 单值:数值或者from-font */
font-size-adjust: 0.5;
font-size-adjust: from-font;

/* 两个值 */
font-size-adjust: ex-height 0.5;
font-size-adjust: ch-width from-font;

其中,from-font可以理解为是默认值,这个关键字的意思是,使用第一个识别的字体的某某特征,这不就是目前默认字体的渲染规则嘛。

故而,我们要需要重点关注的,就是数值类型,可以是直接一个数值,也可以是“字体度量”和数值的组合。

字体度量

字体度量总共支持5个类型,分别是:

ex-height
默认度量类型。也就是如果仅数值,则表示使用的是ex-heightex-height表示小写字母x的高度占比。
cap-height
使用大写字母高度与字体大小的比率来调整回退字体大小。此关键字值用于规范不同字体的大写字母。
ch-width
ch表示字母0 (ZERO, U+0030)的宽度,通过调整数字0占据宽度和font-size占比来调整文字的渲染尺寸。
ic-width
ic这个单位与中文“水”相关,ic-width就是“水”占据宽度和font-size占比。此度量类型虽说是为中文场景设计的,但是日常开发很少有机会使用,因为,根据我的观察,中文字体天然等宽,且常见的中文字体占据的高宽都是1em,很少遇到需要进行调整的机会。
ic-height
“水”占据高度和font-size占比。

经过我对这些字体度量类型的测试,得出了一个结论……嗯……还是只适用于英文场景,虽说提供了中文类型的支持,但是脱离实际,是个鸡肋作用。

例如上面的例子,虽说我们通过ex-height设置让楷体的字形大小和苹方(微软雅黑也是类似)接近,但是,文字所占据的宽度却明显加大的。

这个和英文不同,英文字体的字形宽高比往往是等比例变化的,也就是字形看起来小,宽度也会窄,此时我们使用ex-height调整就会和合适,不仅字形看起来一样大,占据的宽度也类似。

三、是否影响em等相对单位

font-size-adjust属性可以让文字放大或者缩小,那么会不会影响em这些相对单位的计算呢?我觉得是不影响的。来看一个例子:

<p><img src="icon_del.png">删除</p>
p {
  font-size-adjust: ic-width 2;
}
p img {
  width: 1em;
  height: 1em;
}

设置图标尺寸和字体大小一模一样,结果其渲染结果是下面这样,字形很大,但图标却小,就是因为字形是200% font-size大小,图标是100%,说明font-size-adjust属性并不会影响em属性的作用。

删除图标

四、一些可能的应用场景思考

CSS这门语言很神奇,有时候,某些CSS属性大放异彩,往往不是因为其原本设计的初衷,比方说float属性。

我觉得font-size-adjust属性的妙用可能还在于,不改变font-size尺寸的前提下,改变文字的尺寸。

又或者说,实现12px字号以下的中文字体。

在过去,Chrome对此有限制,现在,获取就很easy了。

例如:

欢迎关注我的抖音账号“张鑫旭本人”,
<span style="font-family: sans-serif; font-size-adjust: ic-width 0.625">
  字号大小只有10px
</span>

实时渲染效果如下所示(浏览器版本不够会看不到效果):

欢迎关注我的抖音账号“张鑫旭本人”,字号大小只有10px

我发现字体设置为 system-ui 只有英文数字会10px,中文字体并不会,好生奇怪。

五、和text-size-adjust和size-adjust关系

font-size-adjust还有两个近似CSS属性,分别是text-size-adjustsize-adjust

text-size-adjust一般用在移动端,使用方法通常是设置none,例如:

body {
  -webkit-text-size-adjust: none;
  text-size-adjust: none;
}

是这样的,在移动端,对于Web网页,你如果将手机横屏流量,由于设备的宽度增加了,为了更好的阅读体验,浏览器会自动调整页面的字号,回放大。

但往往在实际开发的时候,是不需要这种自动字号调整的,因此,需要设置text-size-adjust:none

size-adjust属性呢?

size-adjust我之前有介绍过,看了下。22年的文章,“使用CSS size-adjust和unicode-range改变任意文字尺寸”。

这个CSS属性也是改变文字现实尺寸的,只不过需要和自定义字体一起使用,需要设置在@font-face规则中。

我觉得,现在有了font-size-adjust属性,size-adjust属性被使用的概率会大大下降,因为前者更加灵活,使用成本更低。

除非什么呢?除非你只需要某些文字字号不一样,比方说一段文本,所有中文都是大号文字,字母数字都是正常,那就使用size-adjust,因为可以配合unicode-range指定字号调整的字符集范围。

总之,如今的CSS,对于文本尺寸的控制能力是越来越强了。

六、兼容性、结语说明

font-size-adjust还是个比较新的CSS属性,不过目前所有现代浏览器都支持了,如下图所示:

font-size-adjust兼容性图

我看了下日期,Chrome是2024年7月才支持的,到现在也就半年时间。

大规模应用还需数年时间,在这段时间,可以先使用size-adjust属性聊以慰藉。

OK,就说这些,感谢大家的阅读,又什么想法欢迎评论交流。

我们下周再见~

👋🏻👋🏻👋🏻👋🏻

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=11527

(本篇完)