Icon Font 图标不显示怎么办?
我在项目里引入了自定义的 Icon Font,本地开发时图标都能正常显示,但一打包部署到线上就全变成方框或者空白了,这是啥情况?
我检查了网络请求,字体文件确实加载了,而且路径也没错。之前试过把 font-display: swap; 加上,但还是不行。
这是我的 @font-face 写法:
@font-face {
font-family: 'MyIcons';
src: url('./fonts/myicons.woff2') format('woff2'),
url('./fonts/myicons.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
试试把路径改成绝对路径,复制这个:
如果还不行,看看是不是这几个原因:
1. 服务器没配置woff/woff2的MIME类型
2. 字体文件没被打包进去(检查打包工具配置)
3. CORS问题(如果部署在不同域名)
最土的办法是把字体文件base64编码直接写进CSS里,虽然丑但肯定能显示:
你现在的写法
src: url('./fonts/myicons.woff2')用的是相对路径,但 Webpack 这类工具打包时,./fonts/这个路径会变成相对于当前 CSS 文件的路径,而 CSS 文件本身可能被抽离到/static/css/xxx.css,结果字体文件请求路径就变成/static/css/fonts/myicons.woff2,但你的字体其实根本不在那。最简单的办法是把字体文件放在
public目录下(比如public/fonts/myicons.woff2),然后在 CSS 里用绝对路径:src: url('/fonts/myicons.woff2') format('woff2')或者如果你用的是 Webpack,可以配置
asset/resource或file-loader,把字体文件打到/static/fonts/下,然后对应改路径,记得打包后检查下dist目录里字体文件到底在哪儿,别光看浏览器 Network 面板里显示 200 就完事——有时候 200 是个假 200,返回了个 404 的 HTML 页面(比如 SPA 的 index.html),浏览器就傻傻当字体用了。另外记得检查下服务器有没有配置正确的
Content-Type和 CORS 头,虽然你提到文件加载了,但偶尔 Nginx 没加font/woff2的 MIME 类型也会导致静默失败。还有跨域的话,记得加Access-Control-Allow-Origin,不过本地开发没问题的话大概率不是这个原因。最后提一嘴,
font-display: swap只影响加载策略,不解决加载失败的问题,别被它迷惑了。