看看同一种字体是如何对应不同的字体文件的

说起在网页中引入字体文件,首先不得不提一个大多数前端至少用过或者听过的库Font Awesome。使用过这个库的都知道,只要引入一个 css 文件,然后通过给元素赋予指定的类,就可以展示出一个对应的图标,而且这个图标能使用 css 样式控制其表现,比传统的使用图片作为图标好太多了。

Font Awesome 是一种网页中使用的矢量字体图标解决方案,得益于 CSS3 中的 CSS Fonts Module Level 3 特性支持。

发现疑问

今天无意发现 Font Awesome 更新了,升级到 5.x 了之后多了一种 svg with js 的使用方式,尝试了下和 Element-ui 结合使用,发现这条路子行不通(因为使用这种方式的时候 font awesome 会把图标元素的载体元素转换成 svg 标签,从到导致了没法动态改变图标的问题,如果没有动态改变图标的需求可以使用这种方式)。

基于以上原因,所以还是使用引入 css 的老方法。然鹅,font5 给图标增加了分类,分为 solidregular,即同一个图标可能会有两种样式,如下:

<iframe height='166' scrolling='no' title='dJYdxZ' src='//codepen.io/Yuliang-Lee/embed/dJYdxZ/?height=166&theme-id=dark&default-tab=result&embed-version=2' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'>See the Pen <a href='https://codepen.io/Yuliang-Lee/pen/dJYdxZ/'>dJYdxZ</a> by xlaoyu (<a href='https://codepen.io/Yuliang-Lee'>@Yuliang-Lee</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

此时打开控制面板查看两个元素的 css,可以😱的发现使用的字体和内容编码一模一样

dom-css-content

那么问题来了,为什么图标会不一样呢?

事出必有因

我们首先打开引入这两种图标的 css 的源码看看

/* regular.css */
@font-face {
  font-family: 'Font Awesome 5 Free';
  font-style: normal;
  font-weight: 400;
  src: url('#{$fa-font-path}/fa-regular-400.eot');
  src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
  url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
}

.far {
  font-family: 'Font Awesome 5 Free';
  font-weight: 400;
}

/* solid.css */
@font-face {
  font-family: 'Font Awesome 5 Free';
  font-style: normal;
  font-weight: 900;
  src: url('#{$fa-font-path}/fa-solid-900.eot');
  src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
  url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
}

.fa,
.fas {
  font-family: 'Font Awesome 5 Free';
  font-weight: 900;
}

可以看出 font-face 中的 font-family 确实一模一样,即可以表示当有元素使用到这个字体的时候,浏览器有能力识别出需要用的是哪个'font'。

google 之后在 StackOverflow 找到了一个相关的问答(Stack Overflow 大法好)How to use font-family with same name?

咳咳。。敲黑板,划重点👓

When you describe a font with a name, imagine (in the most abstract of the explanations) that you create an object; but, when you create multiple font-rules with the same name, imagine you create an array. Now, to access and array, you have to use its index. The index here is the font-weight. So, to access different weights (technically, fonts), you use the weight. Continuing the analogy of the array above, you have to manually define the index, it's not automatically done.

原来乳此!如果出现了同样的字体,就是用 font-weight 这个属性来判断要用哪一个!这时候再回头去看上面的 font awesome的css 定义,可以看出确实两个字体使用了不同的 font-weight 。一切都'水落石出'了。

不能听风就是雨

虽然上面回答说得很有道理,并且也符合我们观察到的现象,但是我们不能听风就是雨是不?!下定论要有证据!既然别人能说出来,必然我们能找到对应这块的规范标准。

果不其然,在另外一个问答中看到,font-weightfont-style 属性都可以影响字体选择行为,并且出现了引领我们走向'真理'的评论:CSS Fonts Module。作为描述字体的属性有三个

  • font-weight
  • font-style
  • font-stretch

These descriptors define the characteristics of a font face and are used in the process of matching styles to specific faces. For a font family defined with several @font-face rules, user agents can either download all faces in the family or use these descriptors to selectively download font faces that match actual styles used in document. The values for these descriptors are the same as those for the corresponding font properties except that relative keywords are not allowed, ‘bolder’ and ‘lighter’. If these descriptors are omitted, initial values are assumed.

目前为止可以总结出几点:

  1. 可以使用 @font-face 引入外部字字体
  2. 使用 @font-face 引入相同名字的字体,可以通过设置 font-weightfont-stylefont-stretch 属性控制浏览器根据使用样式命中不同的字体文件
  3. font-weight 设置为 normal 的定义必须放在最前面,经过在 chrome 上测试,并没有这个要求。但是在 Stack Overflow 上很多人都提出有这个限制,可能是旧浏览器的行为,需要注意一下兼容性。

参考连接

  1. How to use font-family with same name?
  2. How to add multiple font files for the same font?
  3. Style Linking
  4. CSS Fonts Module Level 3
  5. element2-fontawesome5

版权声明:原创文章,如需转载,请注明出处“本文首发于xlaoyu.info

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 我的个人博客 http://yedingding.com 会更新 Teahour.fm 的最新音频文本,欢迎关注。...
    叶玎玎阅读 1,017评论 0 2
  • 这篇文字里我会介绍50 个便于使用的 CSS2/CSS3 代码片段给所有的WEB专业人员. 选择IDE开发环境来存...
    JamHsiao_aaa4阅读 1,108评论 0 3
  • 1.CSS3 边框 border-radius CSS属性用来设置边框圆角。当使用一个半径时确定一个圆形;当使用两...
    garble阅读 641评论 0 0
  • 今天这一章看的自己云里雾里的,试试能不能写着写着捋捋清楚吧。 解释人性的三种理论分别是:基因决定论,心理决定论,环...
    X_Lady阅读 482评论 2 1
  • 从世锦赛一路来的低迷,到最终的失利,这一届的男篮确实是热爱篮球以来看过的最差的一届!最后一场对战尼日利亚,阿联真的...
    羲和与望舒阅读 164评论 0 0