
本文旨在解决使用`@font-face`规则引入自定义字体在移动设备上无法显示的问题。核心原因通常是`src`属性中字体格式的声明顺序不当,尤其是将仅支持旧版ie的`eot`格式置于优先位置。教程将详细解释不同字体格式的兼容性,并提供优化后的`@font-face`声明范例,确保自定义字体能在各类现代浏览器和移动设备上正确渲染。
理解@font-face与字体格式兼容性
@font-face css规则允许网页开发者在网站中使用自定义字体,而无需依赖用户设备上预装的字体。通过指定字体文件的路径和格式,浏览器可以下载并渲染这些字体。然而,不同浏览器和操作系统对字体格式的支持程度各异,这使得@font-face的配置变得复杂。
常见的字体格式包括:
- WOFF2 (Web Open Font format 2.0):最新的Web字体格式,提供最佳的压缩比和性能,现代浏览器广泛支持。
- WOFF (Web Open Font Format):WOFF2的前身,压缩效率良好,被大多数现代浏览器支持。
- TTF (TrueType Font):一种广泛使用的字体格式,兼容性极佳,尤其在移动设备和旧版浏览器中表现良好。
- EOT (Embedded OpenType):微软为IE浏览器开发,主要用于IE6-IE11,现代浏览器和移动设备基本不支持。
- svg (Scalable Vector Graphics Font):用于旧版ios浏览器,但通常不推荐作为首选,因其文件较大且兼容性问题较多。
移动设备字体不显示的核心问题
当自定义字体在桌面浏览器上正常显示,但在所有移动设备上却无法加载时,一个常见且容易被忽视的原因是@font-face规则中src属性的声明顺序问题。许多开发者在生成@font-face代码时,可能会沿用一些旧的或不优化的模板,将eot格式作为主要的src来源,或者将其置于其他更广泛支持的格式之前。
例如,以下是一个可能导致移动设备显示问题的@font-face声明:
@font-face { font-family: 'gilroy-regular'; src: url('../fonts/gilroy-regular-webfont.eot'); /* 这里将EOT作为主src */ src: url('../fonts/gilroy-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/gilroy-regular-webfont.woff2') format('woff2'), url('../fonts/gilroy-regular-webfont.woff') format('woff'), url('../fonts/gilroy-regular-webfont.ttf') format('truetype'), url('../fonts/gilroy-regular-webfont.svg#gilroy-regular') format('svg'); font-weight: normal; font-style: normal; }
在这个例子中,第一行src: url(‘../fonts/gilroy-regular-webfont.eot’);会指示某些浏览器首先尝试加载EOT文件。由于EOT格式主要用于旧版IE,现代移动浏览器无法识别或支持这种格式,导致它们无法正确加载字体,从而回退到系统默认字体。
解决方案:优化@font-face的src声明顺序
解决此问题的关键在于重新组织src属性中字体格式的声明顺序,确保将支持范围最广、性能最优的格式放在前面,并利用浏览器的解析机制:浏览器会从上到下尝试加载src列表中第一个它支持的字体格式。
推荐的@font-face声明顺序应优先考虑WOFF2和WOFF,其次是TTF,最后是EOT和SVG(如果需要支持极旧的浏览器或操作系统)。
以下是优化后的@font-face声明范例:
@font-face { font-family: 'gilroy-regular'; src: url('../fonts/gilroy-regular-webfont.eot'); /* IE9 Compat Modes */ src: url('../fonts/gilroy-regular-webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../fonts/gilroy-regular-webfont.woff2') format('woff2'), /* Modern Browsers */ url('../fonts/gilroy-regular-webfont.woff') format('woff'), /* Modern Browsers */ url('../fonts/gilroy-regular-webfont.ttf') format('truetype'), /* safari, android, iOS */ url('../fonts/gilroy-regular-webfont.svg#gilroy-regular') format('svg'); /* Legacy iOS */ font-weight: normal; font-style: normal; }
解析上述优化代码:
- src: url(‘../fonts/gilroy-regular-webfont.eot’);: 这行是为了兼容IE9。IE9在没有?#iefix的情况下也能识别EOT。
- src: url(‘../fonts/gilroy-regular-webfont.eot?#iefix’) format(’embedded-opentype’),: 这是针对IE6-IE8的“IE Hack”,它通过URL中的?#iefix来阻止其他浏览器(如firefox)加载EOT文件,并确保IE能正确解析。
- url(‘../fonts/gilroy-regular-webfont.woff2’) format(‘woff2’),: WOFF2是首选,因为它提供了最佳的压缩和性能。现代浏览器会优先加载此格式。
- url(‘../fonts/gilroy-webfont.woff’) format(‘woff’),: WOFF是WOFF2的良好备选,广泛支持。
- url(‘../fonts/gilroy-regular-webfont.ttf’) format(‘truetype’),: TTF格式具有非常广泛的兼容性,特别是对于许多移动操作系统(如Android和旧版iOS)以及Safari浏览器。当WOFF/WOFF2不可用时,它是一个可靠的备选。
- url(‘../fonts/gilroy-regular-webfont.svg#gilroy-regular’) format(‘svg’);: SVG字体主要用于支持旧版iOS(iOS 4.1及以下),如果不需要支持非常老的iOS设备,可以考虑省略。
额外注意事项
除了src声明顺序外,还有一些其他因素可能影响自定义字体在移动设备上的显示:
- 文件路径正确性:确保url()中指定的字体文件路径是正确的,无论是相对路径还是绝对路径。
- 服务器MIME类型配置:Web服务器需要正确配置MIME类型,以便浏览器能够识别和处理字体文件。
- CORS(跨域资源共享)问题:如果字体文件托管在与网站不同的域名下,服务器需要配置CORS头,允许字体文件被跨域访问。例如,在nginx中可以添加:
location ~* .(eot|ttf|woff|woff2|svg)$ { add_header access-Control-Allow-Origin "*"; } - 字体文件存在且可访问:确保所有声明的字体文件都已上传到服务器,并且具有正确的访问权限。
- 字体生成工具:使用可靠的字体生成工具(如Font Squirrel的@font-face生成器)来确保生成的字体文件质量和兼容性。
总结
自定义字体在移动设备上不显示的问题,通常源于@font-face规则中src属性的字体格式声明顺序不当。通过优先声明woff2、woff和ttf等现代且兼容性广泛的格式,可以有效解决这一问题。同时,结合正确的服务器MIME类型配置和CORS策略,将确保您的自定义字体在所有主流浏览器和移动设备上都能无缝呈现,从而提供一致的用户体验。