您现在的位置是:网站首页> 编程资料编程资料
深入理解CSS @font-face性能优化CSS3 @font-face属性使用指南CSS3用@font-face实现自定义英文字体什么是@font-face及font-face如何在css中使用CSS @font-face属性实现在网页中嵌入任意字体css常用样式font设置字体的多种变换(实例详解)css中引入指定字体@font-face兼容各浏览器的问题
2021-09-04
971人已围观
简介 这篇文章主要介绍了深入理解CSS @font-face性能优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文主要介绍字体加载优化的常用策略,大部分内容为引用和翻译。
一、 font-face基本用法
font-face的基本用法想必大家都是知道的,基本上就是类似这样:
@font-face { font-family: Lato; src: url('font-lato/lato-regular-webfont.woff2') format('woff2'), url('font-lato/lato-regular-webfont.woff') format('woff'), url(font-lato/lato-regular-webfont.ttf) format("opentype"); } p { font-family: Lato, serif; }这样就可以使我们的网页用上自定义字体了。 除了font-family 和 src属性之外,还拥有font-style以及font-weight属性。 src可以指定多种字体,会按顺序依次适用,比如上面的示例中会先加载woff2字体,如果失败再加载woff字体,否则加载opentype字体。 src所支持的字体可以有以下类型:

src参数带不带引号都可以,参数的格式不同含义也不尽相同,比如下面:
src: url(fonts/simple.woff); /* 加载simple.woff,地址相对于样式表的地址 */ src: url(/fonts/simple.woff); /* 加载simple.woff,地址是网站的绝对地址 */ src: url(fonts/coll.otc#foo); /* 从coll.otc字符集中加载foo字体 */ src: url(fonts/coll.woff2#foo); /* 从coll.woff2字符集中加载foo字体 */ src: url(fonts.svg#simple); /* 加载id 为'simple'的SVG字体 */
src中加载的字体地址受跨域的约束,如果想跨域加载字体,需要设置CORS。
这就是font-face的最基础的用法。 接下来我们会进一步分析font-face的用法,并尽可能的找出优化策略。
二、 什么时候会下载字体?
上面讲了字体的基本知识,那你有没有想过,字体是在什么时候下载的呢?当我们仅仅在CSS中定义如下样式的时候, 页面加载,字体会自动下载吗?
@font-face { font-family: Lato; src: url('font-lato/lato-regular-webfont.woff2') format('woff2'), url('font-lato/lato-regular-webfont.woff') format('woff'), url(font-lato/lato-regular-webfont.ttf) format("opentype"); }很遗憾,字体并不会下载。 通常情况 下,只有当我们的页面元素用到了font-face中定义的字体的情况下,才会下载对应的字体。
注意: 这里我们说了是通常情况,这是因为,IE8在只要是定义了font-face,即使页面元素没有使用对应的字体,也会下载。
在其它浏览器中也不尽相同,
比如在 Firefox 和 IE 9+ 中,遇到如下情况也会下载字体:
html
css
#test { font-family: Lato; }有什么特别之处呢? 你可能注意到了,这个元素虽然使用到了font-family: Lato样式,但是这个元素并没有任何文本啊!!!。 按照我们的理想情况,应该是,只有有文字内容才会去下载字体嘛。 而这就是Chrome, Safari (WebKit/Blink 等)浏览器的行为。
Chrome, Safari (WebKit/Blink 等)浏览器只有在如下类似情况才会去下载字体:
html
这里是有文本的哦
css
#test { font-family: Lato; }所以总结一下,不同浏览器下载字体的策略:
- IE8 只要定义了font-face,就会去下载字体,不论实际有没有应用该字体。
- Firefox, IE 9+ 只有定义了font-face 并且页面有元素应用了该字体,就会去下载,不论该元素是否有文本内容。
- Chrome, Safari 只有定义了font-face 并且页面有元素应用了该字体,并且该元素有文本内容,才会去下载字体。
那你可能会问了,如果我们的DOM元素是通过动态插入的呢?比如:
var el = document.createElement('div'); el.style.fontFamily = 'open_sansregular'; document.body.appendChild(el); el.innerHTML = 'Content.';答案是一样的,它的下载策略如下:
var el = document.createElement('div'); el.style.fontFamily = 'open_sansregular'; /* 到这里,IE8就会开始下载字体 */ document.body.appendChild(el); /* 只有到这里,Firefox, IE 9+ 才会开始下载字体 */ el.innerHTML = 'Content.'; /* 只有到这里,Chrome, Safari 才会开始下载字体 */三、 FOIT(Flash of Invisible Text)
FOIT是浏览器在加载字体的时候的默认表现形式,也就是在字体加载过程中,页面是看不到文本内容的。在现代浏览器中,FOIT会导致这种现象出现至多3秒。FOIT会导致很差的用户体验,这是我们需要尽量去避免的。
四、 FOUT(Flash of Unstyled Text) 与 font-display属性
FOUT意思是在字体加载过程中使用默认的系统字体,字体加载完后显示加载的字体,如果超过了FOIT(3s)字体还没加载,则继续使用默认的系统字体。
IE浏览器和Edge不会等待FOIT超时才显示默认字体,会立即显示默认字体。FOUT比FOIT好,但是需要注意它引起的reflow.
那么要想使浏览器有FOUT行为,我们需要在设置@font-face的时候给它加一个属性:font-display。 font-display默认是auto, 可选属性与含义如下:
- auto. The font display policy is user-agent-defined.
- block. Gives the font face a short block period (3s is recommended in most cases) and an infinite swap period.
- swap. Gives the font face an extremely small block period (100ms or less is recommended in most cases) and an infinite swap period.
- fallback. Gives the font face an extremely small block period (100ms or less is recommended in most cases) and a short swap period (3s is recommended in most cases).
- optional. Gives the font face an extremely small block period (100ms or less is recommended in most cases) and a 0s swap period.
一般设置成fallback和optional即可。
五、 preload
在页面加入下面这个代码以便更快的加载字体:
通常和最基本的字体用法配合使用
六、 字体转 BASE64URI
这种方法就是将@font-face中定义字体时的路径直接改为字体的base64编码。
优点: 这种做法的优点是不会产生FOIT和FOUT。所以也不会有reflow和repaint. 缺点: 字体转成base64也会很大,会影响页面首次加载速度。不支持逗号分隔的形式加载多种格式的字体,只能加载一种格式字体。这导致你为了尽可能保证所有浏览器都可以兼容,通常会指定为woff格式,因为woff格式兼容性好,但是却没法使用更小体积的woff2格式,因为woff2格式兼容性差点。
七、异步加载BASE64格式URI字体
这种方法就是通过异步的方式插入带有BASE64格式URI字体的CSS链接。
八、使用Font Load API + FOUT + class切换
这种方式是期初并不使用用到@font-face的class,然后用Font Load API加载我们想用的字体,然后切换相应的CSS即可。Font Load API是原生的API:
document.fonts.load('1em open_sansregular') .then(function() { var docEl = document.documentElement; docEl.className += ' open-sans-loaded'; }); .open-sans-loaded h1 { font-family: open_sansregular; }当然这种方法需要考虑浏览器兼容性的问题。
九、 FOFT(Flash of Faux Text)
FOFT会把字体的加载分成多个部分,首先加载罗马网络字体,然后会在加载真实的粗体和斜体的时候立即使用font-synthesis属性渲染粗体和斜体的变体。
这种方法是基于[ 使用Font Load API + FOUT + class切换 ]这种方式的,非常适合加载同一种字体但是不同粗细,字形的场景,比如罗马、粗体、斜体、粗斜体等。我们将这些字体分成2阶段: 第一阶段是罗马字体,然后立即渲染人造粗体和斜体,最后(第二阶段)用真实字体替代。这里面还可以使用sessionStorage优化访问重复视图的场景。
十、CRITICAL FOFT
CRITICAL FOFT和标准的FOFI的唯一区别就在于第一阶段罗马字体的加载,CRITICAL FOFT不会加载罗马字体的全集,只会加载它的一个子集(比如A-Za-z0-9),全集会在第二阶段加载。
十一、CRITICAL FOFT WITH DATA URI
这个和CRITICAL FOFT的唯一区别就是罗马子集字体的加载方式,前面是用Font Load API完成了,这里会将马子集字体硬编码成BASE64 URI的形式加载。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关内容
- css实现图片自适应容器的示例代码CSS将img图片填满父容器div自适应容器大小的实现方法CSS实现宽高等比自适应容器的方法css实现图片自适应容器的几种方式(小结)
- 关于CSS引入方式的详细见解小结css样式引入方式及优缺点介绍详解CSS文件的三种引入方式html引入css四种引入方式示例分享Css基本概念及其引入方式介绍详解CSS文件中的4种引入方式:行内,内联式,外部式,导入式
- 用纯CSS实现镂空效果的示例代码CSS实现镂空遮罩效果CSS实现镂空效果的示例代码CSS3中文字镂空、透明值、阴影效果设置示例小结使用CSS实现中间镂空的图片遮罩效果CSS背景色镂空技术实际应用及进阶分享css3遮罩层镂空效果的多种实现方法
- 使用智能 CSS 基于用户滚动位置应用样式CSS Transition通过改变Height实现展开收起元素从QQtabBar看css命名规范BEM的详细介绍css实现两栏布局,左侧固定宽,右侧自适应的多种方法CSS 实现Chrome标签栏的技巧CSS实现两列布局的N种方法CSS实现隐藏搜索框功能(动画正反向序列)CSS3中Animation实现简单的手指点击动画的示例详解CSS中的特指度和层叠问题详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)关于CSS浮动与取消浮动的问题
- 通过CSS变量修改样式的方法示例你真的需要了解一下CSS变量 var()的用法css文件中的样式类被覆盖,js文件中的变量未定义问题CSS变量对JS交互组件开发带来的提升与变革示例代码详解
- css加载会造成阻塞吗浅谈CSS到底会不会阻塞页面渲染详解css加载会造成阻塞吗浅谈css动画是否会被js阻塞
- css动画属性使用及实例代码(transition/transform/animation) 基于CSS3的animation属性实现微信拍一拍动画效果CSS3动画之利用requestAnimationFrame触发重新播放功能CSS3中动画属性transform、transition和animation属性的区别css动画效果之animation的常用样式
- 基于CSS 属性实现按钮悬停边框和背景动画集合CSS 制作带边框背景色透明的消息框css3 边框、背景、文本效果的实现代码CSS3实现多背景模拟动态边框的效果CSS控制背景图像平铺实现边框阴影效果css div 边框阴影利用背景图或内外层div实现层次感觉阴影效果css样式div或li在ie6下背景平铺及border边框断线解决技巧 CSS新特性:圆角边框多栏Gird布局背景设置css背景和边框标签实例详解
- 详解解决flex布局的justify-content: space-between对齐方式的一个BUG的两种方法详解CSS中的display:flex||inline-flex属性解决display:flex属性 justify-content: space-between换行后的排版问
- 详解在CSS中解决内容过长的问题css 实现文字过长自动隐藏功能CSS实现标题文字过长部分显示省略号的方法pre标签的css代码,防止代码pre中代码过长等问题字符串过长CSS截取多余文字并用省略号显示CSS解决无空格的字母、数字过长不自动换行的问题
