咨询@font-face链接失效时本地回退方案的正确性及注意事项
嘿,先直接给你结论:这个方案整体是可行的,但声明顺序和一些细节上还有可以优化的地方,我给你慢慢捋:
1. 声明顺序是对的!
浏览器解析@font-face的src属性时,是严格按照从左到右的顺序尝试加载字体的,你这个顺序逻辑很清晰:
- 先优先用用户本地已经安装的
Open Sans SemiBold或者OpenSans-SemiBold(这俩写法覆盖了不同系统的字体命名习惯,比如Windows和Linux可能叫法不一样,考虑得很周到) - 本地没有的话,就加载你自己服务器上的半粗体woff2文件
- 最后才 fallback 到CDN上的字体
这个优先级逻辑完全没问题,符合“本地优先、自有服务器次之、CDN兜底”的合理策略。
2. 潜在的坑点和优化建议
这里有几个容易踩的坑,得提醒你:
最大的问题:字重不匹配
你整个@font-face声明的是用于半粗体场景的字体(前面都是SemiBold),但最后兜底的却是OpenSans-Regular(常规字重)!如果前面的半粗体字体都加载失败了,浏览器会用常规字重的Open Sans来渲染,但如果你的页面是用这个字体来显示半粗体内容的,要么会出现字体粗细不对,要么浏览器会自动“伪造”加粗效果,渲染出来的字体会比真实的SemiBold更生硬,视觉效果打折扣。
建议:要么把CDN的资源换成OpenSans-SemiBold.woff2,要么单独给常规字重写一个@font-face,然后在页面里通过font-weight属性明确区分使用场景。协议相对URL的小风险
你用的//someserver.com/...是协议相对URL,这个本身是个好习惯——HTTPS页面自动用HTTPS加载,HTTP页面用HTTP,但要确保你的CDN同时支持两种协议,不然可能会出现加载失败的情况(比如有些CDN只支持HTTPS)。兼容性可选补充(非必需)
现在主流浏览器都支持woff2格式了,但如果你的项目需要兼容IE11这种老浏览器,可以补充一个woff格式的资源作为备选,但现在大部分场景下woff2已经足够覆盖99%以上的用户了。本地字体名称的验证
你写的两个本地字体名称local('Open Sans SemiBold'), local('OpenSans-SemiBold')覆盖了大部分情况,但不同系统的字体命名可能有细微差异,建议在目标用户常用的系统(比如Windows、macOS、Linux)上实际测试一下,确保本地字体能被正确识别。
3. 整体可行性总结
总的来说,这个方案是能跑通的,浏览器会按照你设定的顺序正常加载字体,不会出现逻辑上的错误。核心需要调整的就是最后兜底字体的字重匹配问题,其他都是可选的优化点。
内容的提问来源于stack exchange,提问作者SNYDERHAUS

