13px的monospace

77 阅读3分钟

让我们先从一个实际问题出发

当我写了如下代码(p元素和其上级元素的font-size都未做设置,即为浏览器的默认字体大小,大部分浏览器默认为16px)

span {font-family: monospace}

<p>This is a 'p' with a <span>'span'</span> inside.</p>

打开浏览器之后我们确实可以在computed中看到p元素的大小为16px,但是此时span的大小是多少呢?

按照我们的第一想法,span没有设置那就是继承了父元素的默认字体大小,即16px,所以我认为span的字体大小是16px,但是在谷歌浏览器中,显示的却是13px。

很明显,问题就出在font-family: monospace(等宽字体的字体族名)上面。

然后我们可以在谷歌浏览器的字体设置里发现一个特例,也就是monospace的默认字体大小为13px。

看到这里,我们不妨去做个推测,就是说span的font-size会根据其font-family去计算,这时我们去试验一下

span {font-family: monospace; font-size: 16px;}

<p>This is a 'p' with a <span>'span'</span> inside.</p>

嗯。。。span的大小是16px了,再来一个

span {font-family: monospace; font-size: 1em;}

<p>This is a 'p' with a <span>'span'</span> inside.</p>

嗯。。span的大小又是13px。。。

那究竟什么时候font-size会根据font-family去计算呢?

这里就要聊一聊font-size的值了,除了可以给font-size设置固定值(px ,rem ,em ..),设置百分比,还可以给其设置绝对大小值:xx-small, x-small, small, medium, large, x-large, xx-large

画重点了,谷歌浏览器的字体默认值是 font-size: medium, 得到16px是因为大部分字体medium对应的值为16px。 也就是说,如果我们的字体得到的是绝对大小值,那么他会根据font-family去重新计算。

最后再归纳一下

第一段代码中,不写font-size,其实就是继承了浏览器的默认字体大小,即font-size:medium

第二段代码中,由于写了font-size:16px,所以得到的是font-size:16px(rem同理)

第三段代码中,写了font-size:1em,实际上会得到的font-size:1medium,如果是1.5em会替换成1.5medium(百分比同理)

也就是说最后的结果中带有绝对大小值的都会根据font-family重新计算

经过测试,大概只有写px和rem的时候结果不会得到绝对大小值,至于为什么,可能大概是因为谷歌浏览器的产品认为这样才能体现"不同font-family可以设置不同size"这个设置项的作用吧

解决方案

如果你一定要用monospace的话,把这个元素或者任意上级元素的font-size改成px或者rem就可以。

还有一种解决方法可以说和上面的分析毫无关系,就是当设置font-family为monospace时,在他前面添加一个确定的字体名,例如:font-family: "Courier New", monospace;

关于这种解决方法可以查看meyerweb.com/eric/though…

最后,这篇文档中说明的问题是针对谷歌浏览器的,在五大浏览器中,chrom,firefox,Safari中都存在这个问题,但是在ie和Opera中却不存在。