为啥普遍应用时字体大小不可靠?

Posted

技术标签:

【中文标题】为啥普遍应用时字体大小不可靠?【英文标题】:Why is font-size unreliable when universally applied?为什么普遍应用时字体大小不可靠? 【发布时间】:2013-05-27 20:38:22 【问题描述】:

使用以下 CSS:

* 
    margin: 0;
    padding: 0;
    font-family:"Segoe UI";
    font-variant: small-caps;

.red 
    color: hsl(0, 100%, 50%);
    font-size: 3em;

.orange 
    color: hsl(30, 100%, 50%);
    font-size: 3em;

.yellow 
    color: hsl(60, 100%, 50%);
    font-size: 3em;

.green 
    color: hsl(120, 100%, 50%);
    font-size: 3em;

.blue 
    color: hsl(210, 100%, 50%);
    font-size: 3em;

.indigo 
    color: hsl(230, 100%, 50%);
    font-size: 3em;

.violet 
    color: hsl(274, 100%, 50%);
    font-size: 3em;

... * 选择器中的属性工作正常 - 它们适用于所有类;但是,如果我将 font-size 移动到那里,文本就会变成暴龙的比例。您可以通过将字体大小从各个类移动到 * 类来看到这一点:http://jsfiddle.net/NvTvr/8/

为什么会这样?

更新

所以这是要走的路,那么:

* 
    margin: 0;
    padding: 0;
    font-family:"Segoe UI";
    font-variant: small-caps;
    font-size: 48px;

.red 
    color: hsl(0, 100%, 50%);

...等等。 (在颜色类中没有指定字体大小);如http://jsfiddle.net/NvTvr/10/中所见@

【问题讨论】:

您不必对* 应用任何字体样式。虽然不像font-size 那样有问题,但您仍然不必要地将它们应用于已接受答案中提到的所有元素。 请不要编辑问题以包含答案。编辑问题只是为了澄清您的问题。 @BoltClock:通过 * 选择器将边距和填充重置为 0 不是公认的做法吗? 【参考方案1】:

因为em 是相对于上下文的。

由于font-size 是从上下文继承的,每个带有em font-size 的后代元素都会将当前font-size 乘以包含文本内容的元素。

让我们在实践中看看,假设:

*  font-size: 3em 

您将(相对于上下文)font-size 应用于所有元素。

这意味着,html 元素将具有默认浏览器字体大小的 3 倍。 body 的字体大小是其容器 (html) 的 3 倍,相当于默认字体大小的 9 倍。对于每个元素的祖先,依此类推。

有一个没有这个问题的新单元,rem,它是相对于 root 的。但这没有得到广泛支持(不支持 IE


这部分答案中的em x px x rem 辩论有点跑题了。

引用this answer:

当您特别希望某物的大小取决于当前字体大小时,请使用 em

现代浏览器可以很好地缩放px 单位。 em 主要在旧 IE 占主导地位并且在缩放时没有缩放 px 字体大小时使用。

不过,em 已用于网页设计。比如说,在制作 CSS 图标时,应该相对于文本的字体大小进行缩放。但是对于整体布局,我会选择rem/px,它不会产生复杂的问题和令人头疼的问题,或者在进行流畅的布局时会产生百分比。

px 用于字体大小的问题在于,如果您需要更改页面文本的整体大小,则必须更改每个使用 pxfont-size 声明。这就是rem 提供帮助的地方。

对于font-size 使用哪个单位,总是有激烈的讨论。选择一种对您的项目来说麻烦更少且足够的方法。

所以总而言之,这取决于个人喜好和项目要求。


参考资料:

定义和解释

CSS Length units-MDN Why em instead of px? - 所以问题 Font sizing with rem - Snook.ca

更多讨论

Should I use px or rem in my css? - SO 问题(推荐px 用于font-size) Why Ems? - CSS-Tricks(推荐em 用于font-size

【讨论】:

“它遭受级联”是什么意思? @BoltClock 我的措辞不正确吗?它应该意味着第一部分中描述的效果 - 元素上设置的字体大小级联到后代元素(也许“被继承”在这里更有意义)。然后这个继承的字体大小与元素自己的em字体大小复合。如果您可以改进措辞,请随意(有点太困了atm,但如有必要,我明天可能会查看此答案)。 @BoltClock 我已经删除了那个模棱两可的部分,并在开头添加了一个段落。【参考方案2】:

这是因为当您使用 "*" 选择器时,您将 font-size:3em 应用于 ".red",".green" 等的父级,(在本例中为 body )以及; em 是一个复合单元,因此通过声明字体大小的方式,您将 font-size:3em 应用于正文(48px 假设浏览器默认为 16px),然后将 font-size:3em 应用于您的类,这意味着字体大小为 144px。

希望我的解释有意义。

【讨论】:

【参考方案3】:

em 单位,当在font-size 属性的值中使用时,表示父元素的字体大小。所以声明* font-size: 3em 使得每个元素的字体大小是其父元素字体大小的三倍。

如果你想使用浏览器默认字体大小的三倍(可以是任何字体大小),那么最简单的方法是声明body font-size: 3em ,而不为其他元素声明font-size

【讨论】:

【参考方案4】:

感谢 Jukka 的明确和暗示*建议,CSS 现在是:

* 
    margin: 0;
    padding: 0;
    /*font-family: Consolas;*/
    /*font-family: Candara;/*
    /*font-family: Calibri;*/
    font-family:"Segoe UI";
    font-variant: small-caps;

body  font-size: 3em 
.red  color: hsl(0, 100%, 50%); 
.orange  color: hsl(30, 100%, 50%); 
.yellow  color: hsl(60, 100%, 50%); 
.green  color: hsl(120, 100%, 50%); 
.blue  color: hsl(210, 100%, 50%); 
.indigo  color: hsl(230, 100%, 50%); 
.violet  color: hsl(274, 100%, 50%); 

更新jsfiddle是http://jsfiddle.net/NvTvr/11/

虽然,如果您在 jsfiddle 中选择 TidyUp,它会垂直扩展一行类和元素声明(如果只设置一个属性,我喜欢将它们全部放在一行上的想法)。

【讨论】:

以上是关于为啥普遍应用时字体大小不可靠?的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使我没有明确设置表格字体大小,表格也不使用正文字体大小?

为啥在调整页面大小时 Firefox 会重新请求字体?

为啥我的Excel的字体大小更改不了呢?

如何使用准确的 GDI 字体大小?

在 UITextView 上调用 setAttributedText 会重置字体大小,我不知道为啥

为啥 Twitter Bootstrap 使用像素作为字体大小?