移动端的小字体问题
字体大小的适配原则
- 对于移动端,直接用
px
就好 - 如果需要适配大屏幕,就搭配媒体查询。
- 特别是在多端开发的时候,字体不要用
rem
一刀切,媒体查询是现在表现比较好的方案。
10px的字体的问题
- 背景知识:移动端为了保证阅读,是不会支持太小的字体的,这就是为什么绝大多数手机浏览器最小只支持12px的字体的原因
- Chrome浏览器以前提供了
-webkit-text-size-adjust:none;
尽管如此,移动端的浏览器也是不认这一套的,后来这个特性被滥用,Chrome后续版本就不再支持了。 - Chrome简体中文版和英文版不一样!英文版可以显示10px的字体,但是中文版的chrome——最小限制就是12px,还是会很贴心的帮你调整大小。开发者如果没有注意这一点,就会对不同的Chrome下的差异感到困惑。
利用
scale
的解决方案:1
2
3
4
5
6.setSize {
font-size: 10px;
transform: scale(0.7);
-webkit-transform: scale(0.7);
display: inline-block;
}用这种方法需要注意的是:
- scale对行内元素无效,所以必须变成块元素
- 有一个隐藏的坑,这些
inline-block
的元素之间出现奇怪的空白(因为英文里是使用空格字符来分割的) - 如果不想要这个空白,有几个解决方法:
- 这些行间块标签之间(指HTML代码里)不要换行,而是连着写,比如
<span>1</span><span>2</span>
- 父容器设置
font-size: 0
- 不使用
inline-block
,而用float
属性
- 这些行间块标签之间(指HTML代码里)不要换行,而是连着写,比如
- scale虽然缩小了视觉大小,但是实际占据的空间还在那里,有必要的话,通过
margin
来修正 - 如果限制字体大小只是为了布局和换行,可以考虑通过flex布局来智能换行,规避小字体,使用12px。参考本Blog另一篇《文本节点的样式》里“结合flex布局进行设置”小节
@font-size
- 中文字体一般都很少自己准备,因为看的过去的中文字体一般都挺大的,特别如果在移动端上。
但是反正5G时代要来了是吧。 语法规则:
1
2
3
4
5
6@font-face {
font-family: <YourWebFontName>;
src: <source> [<format>][,<source> [<format>]]*; // 可以是相对路径也可以是绝路径,
[font-weight: <weight>];
[font-style: <style>];
}其中
format
指的是你自定义的字体的格式,主要用来帮助浏览器识别,其值主要有以下几种类型:truetype,opentype,truetype-aat,embedded-opentype,avg等。不同的浏览器对字体格式支持是不一致的。(简单说,IE.eot;其它浏览器.woff;手机浏览器.ttf;)。为了使@font-face达到更多的浏览器支持,Paul Irish写了一个独特的font-face语法叫Bulletproof @font-face:
1
2
3
4
5@font-face {
font-family: 'YourWebFontName';
src: url('YourWebFontName.eot?') format('eot');/*IE*/
src:url('YourWebFontName.woff') format('woff'), url('YourWebFontName.ttf') format('truetype');/*non-IE*/
}更多的浏览器支持:
1
2
3
4
5
6
7
8@font-face {
font-family: 'YourWebFontName';
src: url('YourWebFontName.eot'); /* IE9 Compat Modes */
src: url('YourWebFontName.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('YourWebFontName.woff') format('woff'), /* Modern Browsers */
url('YourWebFontName.ttf') format('truetype'), /* Safari, Android, iOS */
url('YourWebFontName.svg#YourWebFontName') format('svg'); /* Legacy iOS */
}
icomoon的使用
其他类似的网站使用起来也差不多,比如iconfont。
icomoon网站的使用方法
- 打开icomoon网站,如果不需要在网站上保存信息,就没必要注册
- 点击右上角
IcoMoon App
- 点击右上角
Project
图标,进入项目列表 - 通过
Import Project
将本地icomoon文件夹中的selection.json
导入 - 进入对应的项目(就是刚才导入的项目),通过右边的小菜单可以给图标组命名等
- 通过左键点击来选择或者取消其中的图标
- 如果有自定义的svg图标,比如设计从sketch导出了,那么选择
Import Icons
导入新增的svg,并选中 - 注意到屏幕下面有3个选项卡,当前处于选择的选项卡,进入屏幕下方右侧的
Generate Font
(不用左边的,因为图很大啊) - 可以为添加的svg设置名字,e开头的是字体的编号,也就是将来content的内容
- 点击下方选项卡里的
Download
,可以获得一个.zip
文件夹
icomoon导出的svg font的使用方法
- 解压文件,将文件夹放入项目
- 通过解压出的文件夹里的
demo.html
可以查看每个图标对应的content
一般就在文件里
style.css
设置字体1
2
3
4
5
6
7
8
9
10
11/* style.css */
@font-face {
font-family: 'icomoon';
src: url('fonts/icomoon.eot?r5pkoa');
src: url('fonts/icomoon.eot?r5pkoa#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?r5pkoa') format('truetype'),
url('fonts/icomoon.woff?r5pkoa') format('woff'),
url('fonts/icomoon.svg?r5pkoa#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}然后写CSS类选择器,然后添加属性
content
,和其他所有对字体产生影响的样式都有效果。注意font-size的设置。需要应用到元素上的时候,给元素添加这些类就可以了1
2
3
4
5
6
7
8
9/* style.css */
/* 定义类选择器对应的svg */
.icon-bank-card:before {
content: "\e90a";
color: red;
}
.icon-my-order:before {
content: "\e90b";
}一般而言,我们会对上面写好的类,做一些公共的样式设置(说白了就是罗列这些类名,逗号分割,然后统一设置如下),比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/* style.css */
/* 对他们做一些公共样式的设置 */
.icon-bank-card:before,
.icon-my-order:before,
{
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'icomoon' ;
display: inline-block;
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}然后把
style.css
引入到项目里。(项目中用啥都没关系,比如scss,@import './../icomoon/style';
)
进阶:更加合理的CSS写法
上面的写法其实会让人感觉很辛苦(定义一遍,还要再罗列注入一次通用属性),高端一点的做法是利用HTML 5的data-*
和attr()
来简化配置,比如,约定在写HTML代码的时候,使用属性data-icon
(当然也可以换其他的名字)来直接注入icon,上面那些就可以简洁的写成这样:
1 | [data-icon]:before { |
1 | <!-- 用起来大概就是这样 --> |
至于颜色等特殊化处理,就应该分离,用别的CSS选择器去控制。