能否按 unicode range 设置 font-size?
CSS 选择器不能按 Unicode 范围为字符单独设置 font-size。如果无法增加 HTML 标签,可以用 @font-face 的 unicode-range 配合 size-adjust,缩放指定字符使用的字体。
为什么选择器做不到
span.name[...] 中的方括号是属性选择器,只能匹配 HTML 属性,不能匹配文本中的 Unicode 码点。给 span.name 设置 font-size,会影响整个元素中的文本。
unicode-range 用于限定某个 @font-face 可以处理的字符范围。浏览器选择字体时,可以让指定符号使用这个字体,其他字符使用后备字体。字体文件还必须包含相应字形,才能用于显示这些字符。CSS Fonts 规范:unicode-range
用 size-adjust 缩放指定符号
先为符号定义一个字体名称,用 unicode-range 限定字符,用 size-adjust 设置缩放比例,再把这个字体放到元素字体列表的最前面。
@font-face {
font-family: "MySymbols";
src: local("Twemoji Mozilla");
unicode-range: U+1F6A8;
size-adjust: 200%;
}
span.name {
font-family: "MySymbols", "Noto Sans", sans-serif;
font-size: 25px;
}
HTML 无需改动:
<div><span class="name">🚨Abc</span></div>
<div><span class="name">🗐 Abc</span></div>
如果本地字体可用、包含对应字形,且浏览器支持 size-adjust:
🚨的码点是U+1F6A8,会使用"MySymbols",按200%缩放。Abc不在指定范围内,会使用后备字体,保持正常比例。🗐也不在该范围内,因此不会被这条规则放大。
size-adjust: 200% 会将该字体的字形和字体度量放大到原来的两倍,元素的 font-size 计算值仍然是 25px。这相当于让该字体按两倍字号绘制。由于字形本身的设计尺寸不同,符号可见部分的高度不一定恰好是 50px。CSS Fonts 规范:size-adjust
如何指定其他字符范围
unicode-range 支持单个码点、连续区间,也可以用逗号分隔多个范围:
/* 单个字符 */
unicode-range: U+1F6A8;
/* 连续区间 */
unicode-range: U+1F600-1F64F;
/* 多个范围 */
unicode-range: U+1F6A8, U+1F600-1F64F;
按需要选择一种写法,放入对应的 @font-face 中。
U+1F?? 中的每个 ? 代表一位十六进制数字,因此它表示 U+1F00-1FFF,不包含 U+1F6A8。如果只调整 🚨,直接写 U+1F6A8 最准确。CSS Fonts 规范:范围语法
使用时需要注意什么
local("Twemoji Mozilla") 只会查找用户设备上的本地字体,不会自动下载。如果字体不存在或缺少目标字形,浏览器会使用后备字体,符号也就不会按这里设置的比例缩放。如果需要稳定提供该字体,可以将 src 改为指向实际字体文件的 url(...),并确认字体包含目标字符,且允许用于网页。
缩放还会影响字符占用的宽度和字体度量,可能改变换行与行高。如果页面设置了较小的固定 line-height,应检查放大后的符号是否与相邻行重叠,或被容器裁切。
要缩小符号,调低比例即可。例如,size-adjust: 80% 会让该字体在 25px 基准下按相当于 20px 的比例绘制。
备注:内容仅供参考。
