在此示例中,为什么无单位行高的行为与百分比或em有所不同?

马修·巴特里克(Matthew Butterick)

我对以下CSS的行为感到困惑,在这个小提琴中对此进行了说明

<style type="text/css">
p {
    font-size: 14px;
}

.percentage {
    line-height: 150%;
}

.em-and-a-half {
    line-height: 1.5em;
}

.decimal {
    line-height: 1.5;
}

.smaller {
    font-size:50%;
}

.caption {
    font-weight: bolder;
    font-size: 80%;
}

</style>

<p class="caption">default line spacing</p>

<p>This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p>This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>


<p class="caption">line-height: 150%</p>

<p class="percentage">This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p class="percentage">This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>


<p class="caption">line-height: 1.5em</p>

<p class="em-and-a-half">This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p class="em-and-a-half">This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>


<p class="caption">line-height: 1.5</p>

<p class="decimal">This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p class="decimal">This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

前两段具有默认的行距。第二段有一个较小的词。但这不会影响该段中的行距。并非应该如此,但是-

接下来的两段有line-height: 150%同样,第二段有一个较小的词。但是这一次,由于原因不清楚,较小的字体在前两行之间(至少在Safari,Chrome,Firefox和Explorer中)创建了额外的空间。这是我试图修复的CSS中的原始问题。(我推测这与浏览器缩小单词然后垂直向下移动以重新对齐基线有关。)

接下来的两段有line-height: 1.5em我的理解是1.5em150%确实,行为是相同的:第二段的前两行之间有多余的空间。

但是这里很奇怪:接下来的两段都有line-height: 1.5-没有指定单位。这次,多余空间的问题消失了。

总而言之,当父级和子级的行高不同时(通过继承无单位值),CSS似乎给出一致的行距结果,而当父级和子级的行高相同时,CSS给出的行距结果不一致。

因此,我的问题是:

  1. 我知道CSS规范之间1.5150%或它的同义词之间存在故意的语义差异1.5em(即:将无单位值传递给子元素,并使用子字体的字体大小计算其线高,而百分比或em值将导致为父元素计算线高,然后将该计算值传递给这个孩子。)但是,这如何解释这里看到的行为差异?多余的空间从哪里来?如果是某些CSS定位规则的结果,那么该规则是什么?

  2. 或者,如果这些示例都应以相同的方式呈现,那么哪个实现不正确?(关于第2季度的说明:在不同的浏览器上呈现渲染异常的事实强烈表明,没有一个实现不正确,这将带您回到问题(1)。)

  3. 在实际应用中,是有缺点切换到无单位的测量样 1.5 line-height (答案:否)

马修·巴特里克(Matthew Butterick)

根据提出的答案中的线索,我认为在这些示例中看到的渲染行为是违反直觉的,但是是正确的,并且受规范中几个规则与整个CSS框模型的相互作用的要求

  1. CSS通过公式line-height= L + AD来计算框所需的前导L ,其中AD是字体的“从顶部到底部的距离”然后“在A的前面加上一半,在D的下面加上另一半”。因此,有文字font-size:16pxline-height:24px会的上方和下方领先4PX。文本font-size:8pxline-height:24px将拥有领先的上面和下面加上了8px。

  2. 但是,默认情况下,“用户代理必须按其相关基准对齐字形。” 这开始解释这里发生了什么。line-height用百分比或em指定时,子项将继承计算值(此处为smaller跨度)。这意味着smaller跨度line-height与父块相同但是由于使用L + AD公式,该跨度的文本在顶部和底部具有更多的前导,因此基线在其框中位于较高的位置。浏览器smaller垂直向下推跨度以匹配基线。

  3. 但是浏览器遇到了一个新问题-如何处理封闭块中的行距,该行已被基线调整过程打乱。规范也解决了这一问题:line-height块级元素的“指定元素内线框的最小高度”意思是,CSS不会保证您将获得精确的结果line-height,只是您至少会得到该数目。因此,浏览器在封闭块中将各行分开,以便重新对齐的子框适合。

这是反意图的原因是,它与大多数文字处理器和页面布局程序的工作方式相反。在这些程序中,段落中较小的文本段通过其基线(如CSS)对齐,但是行高被强制为基线之间的距离,而不是围绕较小文本的框。但这不是错误-CSS是围绕box模型设计的所以最后,我们可以说这种间距行为是该模型的结果。

这仍然让我们用无单位的行高来解释示例中的行为:

  1. 首先,请注意,当line-height指定no时,浏览器默认将应用无单位的行高。这是规范必需的line-heightis的初始值normal定义为“具有与<number>相同的含义”,并且规范建议其值为“ 1.0到1.2之间”。这与我们在上面的示例中看到的一致,其中带有line-height: 1.5的段落与没有设置行高的段落具有相同的行为(即,它们隐含地获得line-height: normal

  2. 正如其他人指出的那样,当段落具有时line-height: 1.5smaller跨度不会继承所计算的段落的行高相反,smaller跨度将根据其自身的字体大小来计算其自身的行高。当段落具有时line-height: 1.5; font-size: 14px,则其计算的行高为14px * 1.5 = 21px。如果smallerspan仅具有属性font-size: 50%,则其字体大小为14px * 50%= 7px,其行高为7px * 1.5 = 10.5px(通常将其四舍五入为整个像素)。但总的来说,该smaller框的大小是周围文字的一半。

  3. 和以前一样,浏览器将使smaller跨度与相邻基线垂直对齐但是这一次,因为周围的框smaller比周围的文本短,所以此重新对齐在封闭块中没有任何副作用。它已经适合了,因此不需要像以前一样扩展父段的行。

两种情况都代表规范的一致实施。这是个好消息,因为这意味着我们可以预测行间距行为。

这使我们回到了这个问题的原始原因。虽然我现在知道CSS盒子模型需要这种行为,但是作为一名练习打字员,这很少是我想要的行为。我想要的是段落中的行具有一致且精确的行距,即使该段落中的某些文本跨度较小。

不幸的是,似乎没有办法像文字处理程序或页面布局程序中那样直接在CSS中强制精确的行距。同样,这是因为CSS框模型:它不使用基线到基线的行距模型,line-height而是指定为最小度量值,而不是最大度量值。

但是我们至少可以说,无单位的行高值可以在CSS中产生精确的行距的最佳近似值像我这样的挑剔的排版人员应该对它们感到满意,因为无单位的值已得到规范的认可,并且它们在浏览器中产生一致的结果。他们不是黑客,也不是不推荐使用的东西。

需要注意的是,它们仍然只是一个近似值。无单位的行高值不会更改基础的CSS框模型,也不会更改CSS框定位规则。因此,在某些情况下,他们可能无法获得预期的结果。但是,永远保持警惕是好的排版的代价。小心点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这些小型D程序的行为有所不同?

来自分类Dev

为什么/ bin / sh在Mac和Ubuntu上的行为有所不同

来自分类Dev

在此示例中,为什么无单位行高的行为与百分比或em不同?

来自分类Dev

为什么在Chrome / IE和Firefox中重新定义功能的行为会有所不同?

来自分类Dev

为什么此数组初始化的行为有所不同?

来自分类Dev

在通过PropertyDescriptorCollection进行迭代时,为什么var的行为有所不同?

来自分类Dev

为什么reference_wrapper对于内置类型的行为有所不同?

来自分类Dev

为什么最后一个列表项在自定义列表中的行为有所不同?

来自分类Dev

在这些示例中,为什么“ last”在Perl中的行为有所不同?

来自分类Dev

为什么我在Codename One模拟器中获得的行为与在真正的Android设备上有所不同?

来自分类Dev

为什么单个元素哈希表在Powershell中的行为有所不同?

来自分类Dev

JavaFx MediaPlayer在单元测试和应用程序中的行为有所不同,为什么?

来自分类Dev

在此示例中,为什么max()函数对于两个属性的行为有所不同?

来自分类Dev

为什么numpy导入的行为有所不同?

来自分类Dev

为什么groupby操作的行为有所不同

来自分类Dev

为什么在具有一级索引的MultiIndex列的熊猫DataFrame中,行为会有所不同?

来自分类Dev

为什么NumberFormatInfo在Azure环境中的行为有所不同?

来自分类Dev

为什么宽度为百分比的浮标在具有同级容器的容器中的行为与以像素为单位的宽度不同?

来自分类Dev

为什么在此示例中,“ grep”的行为有所不同?

来自分类Dev

为什么我的脚本中的tar与手动使用tar的行为有所不同

来自分类Dev

为什么一个Meteor客户端集合的行为与MongoDB中显示的有所不同?

来自分类Dev

<|>在Parsec中-为什么这些示例的行为有所不同?

来自分类Dev

为什么JavaScript“删除”运算符在不同浏览器中的行为会有所不同?

来自分类Dev

当类中的counter较大时,为什么java线程的行为会有所不同?

来自分类Dev

为什么C ++中带符号和无符号字符的ascii值会有所不同?

来自分类Dev

为什么回显$?在此脚本中运行时是否有所不同?

来自分类Dev

在这些示例中,为什么“ last”在Perl中的行为有所不同?

来自分类Dev

为什么hide()的行为有所不同?

来自分类Dev

为什么to_sym的行为有所不同?

Related 相关文章

  1. 1

    为什么这些小型D程序的行为有所不同?

  2. 2

    为什么/ bin / sh在Mac和Ubuntu上的行为有所不同

  3. 3

    在此示例中,为什么无单位行高的行为与百分比或em不同?

  4. 4

    为什么在Chrome / IE和Firefox中重新定义功能的行为会有所不同?

  5. 5

    为什么此数组初始化的行为有所不同?

  6. 6

    在通过PropertyDescriptorCollection进行迭代时,为什么var的行为有所不同?

  7. 7

    为什么reference_wrapper对于内置类型的行为有所不同?

  8. 8

    为什么最后一个列表项在自定义列表中的行为有所不同?

  9. 9

    在这些示例中,为什么“ last”在Perl中的行为有所不同?

  10. 10

    为什么我在Codename One模拟器中获得的行为与在真正的Android设备上有所不同?

  11. 11

    为什么单个元素哈希表在Powershell中的行为有所不同?

  12. 12

    JavaFx MediaPlayer在单元测试和应用程序中的行为有所不同,为什么?

  13. 13

    在此示例中,为什么max()函数对于两个属性的行为有所不同?

  14. 14

    为什么numpy导入的行为有所不同?

  15. 15

    为什么groupby操作的行为有所不同

  16. 16

    为什么在具有一级索引的MultiIndex列的熊猫DataFrame中,行为会有所不同?

  17. 17

    为什么NumberFormatInfo在Azure环境中的行为有所不同?

  18. 18

    为什么宽度为百分比的浮标在具有同级容器的容器中的行为与以像素为单位的宽度不同?

  19. 19

    为什么在此示例中,“ grep”的行为有所不同?

  20. 20

    为什么我的脚本中的tar与手动使用tar的行为有所不同

  21. 21

    为什么一个Meteor客户端集合的行为与MongoDB中显示的有所不同?

  22. 22

    <|>在Parsec中-为什么这些示例的行为有所不同?

  23. 23

    为什么JavaScript“删除”运算符在不同浏览器中的行为会有所不同?

  24. 24

    当类中的counter较大时,为什么java线程的行为会有所不同?

  25. 25

    为什么C ++中带符号和无符号字符的ascii值会有所不同?

  26. 26

    为什么回显$?在此脚本中运行时是否有所不同?

  27. 27

    在这些示例中,为什么“ last”在Perl中的行为有所不同?

  28. 28

    为什么hide()的行为有所不同?

  29. 29

    为什么to_sym的行为有所不同?

热门标签

归档