字体规则和安全字体
- 先说结论:不同于PC端字体设置的五花八门,移动端其实不太需要操心,iOS和Android都有自己的默认字体
它们的显示区别并不大 - CssFontStack对安全字体的统计
- 苹果的官方网站上,也有iOS不同版本系统对字体的支持的文档。
- 安卓各家厂商都会有一些区别。
- 大多数时候,设计同事会负责制定规范或者给出方案。
- 通常我们都会给页面指定一套字体规则,浏览器会按照字体声明的顺序依次去寻找系统中已经安装的字体(优雅降级),找到了就渲染,如果都没有找到,就使用浏览器默认的字体
- 比如:
font-family: Helvetica, STXihei, "Microsoft YaHei", Arial, SimSun,sans-serif;
- 一般都不会让页面的字体“裸奔”,我们至少需要设置一个安全字体,比如被大多数系统所默认支持的
Arial
简单的统计
- 这可能会出乎很多新手的意料:大部分手机浏览器都不支持PC机上常用的、而且比较好看的微软雅黑,如果没有特殊需求,建议移动端的中文就使用系统默认的(英文和数字可以用Helvetica)
- Android特别建议就使用系统默认字体,因为你无法预知发行厂商会去内置什么字体,或者用户是否root了手机做了什么奇怪的配置
这么做在开发的时候可能看着很丑,不过没关系。
规则 | 默认中文 | 默认西文 | 其他中文 | 其他西文 |
---|---|---|---|---|
Android | Roboto/Droid Sans Fallback | Roboto/Droid Sans | 没有雅黑和宋体 | Arial |
iOS | Heiti SC | Helvetica Neue | ST heiti无雅黑无宋体 | Tahoma/Arial/Verdana/georgia |
自定义字体
Web Font
- 现在基本上全平台都支持Web Font技术了,用CSS3提供的
@font-face
来设置吧,记得把字体文件放到服务器上或CDN上… - 常用汉字都有3500个左右,用Web Font就会增加几M的流量,不过有特殊需求的时候也没办法
反正5G时代要来了,喜欢搞事的设计纷纷露出笑容 - 页面抖动的问题:刚加载进来的时候是手机浏览器默认的字体,而整个字体文件(因为较大所以下载慢,但是CSS渲染不会阻塞页面渲染)下载下来后文字会被重新渲染,因此页面会出现抖动的现象
反正5G是吧 字体预加载避免页面抖动:
prefetch:使用HTML 5的资源预加载特性,目前只支持安卓,真机调试的时候,还需要用Fiddler之类的工具看是否有字体请求缓存,以判断当前手机浏览器是否支持prefetch
1
<link rel="prefetch" href="myFontName.ttf" />
提前使用
@font-face
:可以认为是一种黑魔法的策略,在真正需要字体的页面之前的页面,先用对用户隐藏的文字,使用Web Font策略,产生字体缓存。需要注意的是,最好是用position: absolute;
定位将需要隐藏的文字放到可视区域之外去。——不要妄想使用display:none
,没用;也不要使用visiable: hidden
,它占地方,影响布局。
其他方案
- 常用汉字虽然有3500个左右,但还是可以考虑用一些工具,枚举有限的文字,删除不必要的,比如使用字蛛和有字库这样的工具,可以和设计商量下,应该都会。前者需要一些前端知识,后者则是可以在浏览器里操作。比如设计对数字有奇怪的偏好,完全可以生成只有数字的字体文件。
- 甚至也可以考虑把一些自定义的字体弄成图片,避免整个字体文件太大的问题
容易被忽略的版权问题
- 比如上面就提到:我们习以为常的“微软雅黑”,其实是购买Windows系统后附赠的!因此不但不允许将字体安装在服务器上,也不能使用
@font-face
的方式,其字体文件不能被修改或者作为软件一部分进行分发……这些都需要单独获得相应授权。换而言之,你只能font-family: 'microsoft yahei
但是有没有效果就看你是不是在Windows系统里的浏览器打开页面了。 - 对于商业性网站,额外需要注意这个版权问题,不仅仅是
@font-face
,即使是使用的图片,就连图片上的文字也要小心。 - 有些字体会有免授权的,就很不错,允许非商业性的。
- 推荐一个站酷字体,这个有很多免费使用的字体,甚至允许商业使用
字体大小
rem
这个方法是不合理的。TODO:补充说明
根据dpr适配
- 当页面采用根据dpr缩放时的配套方案
<meta name="viewport" content="width=640,initial-scale=0.5,maximum-scale=0.5, minimum-scale=0.5,user-scalable=no">
- 这样主要是为了让dpr是2或者3的高清屏下,能完美还原2x/3x稿里1px的设计,但是这样缩放会让所有尺寸和字体都缩放,所以需要根据dpr来设置字体,比较合理的,是用rem做单位,然后根据dpr来设置根字体的大小。
- 手淘的flexible.js方案
默认写下dpr=1的时候的字体大小,然后根据不同的dpr下的值,去匹配不同的字体大小(例子里是使用选择器,在html的tag里,会有
data-dpr
这样的自定义attribute存在,以配合选择器生效)1
2
3
4
5
6
7
8
9
10
11
12/* dpr=1(默认) */
div {
font-size: 12px;
}
/* dpr=2 */
[data-dpr="2"] div {
font-size: 24px;
}
/* dpr=3 */
[data-dpr="3"] div {
font-size: 36px;
}