CSS 缺少字形的字体回退

CSS Font Fallback for Missing Glyphs

CSS:

p { 
font-family: Gill Sans, SFU GillSans;
}

"SFU GillSans" 是越南语的字体。根据 this link,如果 p 包含不在 Gill Sans 字体中的越南字符,则浏览器将在 "SFU GillSans" 字体中查找它。

如果默认字体缺少 任何 个字符,是否可以完全切换到第二种字体,而不仅仅是某些字符?

纯HTML/CSS:不,你不能那样做。

但是您可以做的是确定字符串中使用了哪些字形,将其与字体中可用的字形进行比较,然后使用 [=33= 有条件地为部分或整个页面设置不同的字体] class.

可以使用 JavaScript 或使用任何服务器端语言即时确定字符串中使用了哪些字形。


更新:我在下面添加了一个特别针对越南语的示例。

可以轻松更改 VIETNAMESE_DIACRITIC_CHARACTERScontainsVietnamese 的名称和内容,以匹配(不)支持的后备字体或主字体中的字符范围。 (白名单或黑名单方法)。

// From 
var VIETNAMESE_DIACRITIC_CHARACTERS = 'ẮẰẲẴẶĂẤẦẨẪẬÂÁÀÃẢẠĐẾỀỂỄỆÊÉÈẺẼẸÍÌỈĨỊỐỒỔỖỘÔỚỜỞỠỢƠÓÒÕỎỌỨỪỬỮỰƯÚÙỦŨỤÝỲỶỸỴ';

var paragraphs = document.querySelectorAll('p');

for (var i = 0, m = paragraphs.length; i < 1; i++) {
  if (containsVietnamese(paragraphs[i])) {
    paragraphs[i].className = 'vietnamese';
  }
}

function containsVietnamese(paragraph) {
  var text = paragraph.innerText || paragraph.textContent;
  for (var i = 0, m = text.length; i < m; i++) {
    // Return true if VIETNAMESE_DIACRITIC_CHARACTERS contains the uppercase character from the paragraph
    if (VIETNAMESE_DIACRITIC_CHARACTERS.indexOf(text[i].toUpperCase()) > -1) {
      return true;
    }
  }
}
p {
  border: 1px solid #ddd;
  font-family: myregularfont, sans-serif;
}
.vietnamese {
  font-family: myvietnamesefont, serif;
  background: green;
}
<p>This paragraph should switch to a serif font: bằng "level, flat" ngang and huyền trắc "oblique, sharp" sắc, hỏi, ngã, and nặng</p>
<p>Chinese (汉语 / 漢語; Hànyǔ or 中文; Zhōngwén) is a group of related but in many cases mutually unintelligible language varieties.</p>
<p>English is a West Germanic language that was first spoken in early medieval England and is now a global lingua franca.</p>

简答:没有。这不是 CSS 能做的。

后备字体确实意味着后备,而不是 "font switching on some signal"。回退仅根据 "if glyph X is not in font A, try font B (if specified), then C, then ... until we find a generic font-family, or nothing, in which case, use the parent element's font".

定义

如果这就是您 SFU GillSans 用于所有甚至包含单个越南字符的文本的方式,为什么不使用看起来不错并且支持 Latin-A 到 Latin-D 的字体呢?例如,您可以只使用 SFU GillSans 作为您的主要字体,而不是作为后备字体。 CSS 注意:您需要在这些名称周围加上引号。带有破折号或空格等特殊字符的字体系列值需要用引号引起来 as per the CSS spec.

是的,我们可以!如果您事先知道不受支持的 glyphs/ranges,则可以使用 unicode-range。我的回答是可耻地从 this answer. If it helps you feel free to vote that answer up.

复制过来的

是的,你可以,使用一种叫做 unicode-range 的东西它适用于所有现代网络浏览器:https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face

顺便说一句,更多信息来自 http://24ways.org/2011/unicode-range

实例:http://jsfiddle.net/jfcox/3LQyr/

<style>
@font-face {
    font-family: Foobar;
    src: local('Times New Roman');
    unicode-range: U+61-6E;
}
@font-face {
    font-family: Foobar;
    src: local('Arial');
    unicode-range: U+6F-7A;
}
body{
  font-family:Foobar;
}
</style>
<p>abcdefghijklmnopqrstuvwxyz</p>​