line-height和vertical-align

line-height

font-size

  • em-squarecss

    • 字体属性定义了自身的em-square,标识了字符绘制容器。这个正方形容器与font-size相关。但并不是彻底相同。
    • 字符的标线也与此相关(x-height,baseline等)
<p>
    <span class="a">Ba</span>
    <span class="b">Ba</span>
    <span class="c">Ba</span>
</p>
p  { font-size: 100px }
.a { font-family: Helvetica }
.b { font-family: Gruppo    }
.c { font-family: Catamaran }

image.png

文本的line-box

  • 一行文本,会包含不少个以上所描述的正方形容器。全部这些容器所组成的就是line-boxhtml

    • line-box的高度依赖于其子项的高度浏览器

      • 从子项最高的点,到子项最低的点
      • 默认状况下,line-box足以包含全部的子项
      • 子项的高所指==并不是==content-area的高度
    • 行内元素拥有两个不一样的高度app

      • content-area的高度less

        • font-sizefont-family共同做用
      • virtual-area的高度ide

        • line-height
      • image.png
    • line-height并不是两行文本baseline的距离,而是virtual-area的高度(word,PS等软件中,使用的是两行文本baseline的距离)svg

      • image.png
    • virtual-areacontent-area的高度差为leading(半行距)wordpress

      • 一半的leadingcontent-area之上,另外一半在下
      • leading不支持非整数,向上的一半为向上取整,向下的部分为向下取整(可能不许确)。因此多数状况,content-area会在virtual-area居中偏下的位置(leading若恰好为2的倍数,则content-area会垂直居中)。
  • <p>标签由数个line-box构成字体

    • 如下的<p>由三个line-box组成flex

      • 第二行最高
      • 没有由标签控制的第一行和第二行,没法经过非继承css属性进行控制(包括::first-line)
<p>
    Good design will be better.
    <span class="a">Ba</span>
    <span class="b">Ba</span>
    <span class="c">Ba</span>
    We get to make a consequence.
</p>

image.png

其余类型的line-box

  • 类型

    1. 替换元素,好比img, input, svg
    2. inline-block以及inline-*
    3. 特殊格式的inline元素。好比在flexbox中,全部的flex子项。
  • 这些元素的高度,由height,marginborder进行计算。

    • height:auto

      • height,line-height,content-area的高度都彻底相等。
      • image.png
    • 手动设置line-height,此时仅至关于设置了最小高度

      • 主要因为vertical-align的影响

line-height的常规值

  • 文本

    • line-heightvirtual-area彻底由font-family肯定,由字体设计者来定义。
    • 所以将设置line-height:1是很坏的习惯。极可能致使virtual-area的区域比content-area要小.

      • line-height设置为一个无单位数,即标识其为font-size的对应倍数。
    • padding以及border会增长background的区域,但不会修改content-area的区域
  • 其余

    • padding`margin以及border会修改height, content-arealine-box`。

vertical-align

相对父元素的匿名内联元素对齐

  • baseline

    • vertical-align的默认值
    • 文本

      • baseline的具体位置由各字体肯定
    • 其余

      • img及inline-block等

        • 图片的底边为对齐值
      • textarea等

        • 未详细规定,由各浏览器本身实现
    • 使用元素的baseline去对齐父级块内的匿名内联元素baseline
    • CSS2的可视化格式模型文档中有一么一段话:
>The baseline of an ‘inline-block’ is the baseline of its last line box in the normal flow, unless it has either no in-flow line boxes or if its ‘overflow’ property has a computed value other than ‘visible’, in which case the baseline is the bottom margin edge.

* 一个`inline-block`元素,若是里面没有`inline`内联元素,或者overflow不是visible,则该元素的基线就是其margin底边缘,不然,其基线就是元素里面最后一行内联元素的基线

```
.dib-baseline {
  display: inline-block; width: 150px; height: 150px;
  border: 1px solid #cad5eb; background-color: #f0f3f9;
}
<span class="dib-baseline"></span>
<span class="dib-baseline">x-baseline</span>
```

image.png
明明尺寸、display水平都是同样的,结果呢,两个却不在一个水平线上对齐,为何呢?哈哈,上面的规范已经说明了一切。第一个框框里面没有内联元素,所以,基线就是容器的margin下边缘,也就是下边框下面的位置;而第二个框框里面有字符,纯正的内联元素,所以,第二个框框就是这些字符的基线,也就是字母x的下边缘了。因而,咱们就看到了框框1下边缘和框框2里面字符x底边对齐的好戏。

  • middle

    • 文本

      • This identifies a baseline that is offset from the alphabetic baseline in the shift-direction by 1/2 the value of the x-height font characteristic. The position of this baseline may be obtained from the font data or, for fonts that have a font characteristic for “x-height”, it may be computed using 1/2 the “x-height”. Lacking either of these pieces of information, the position of this baseline may be approximated by the “central” baseline.
      • 中点由==元素==的baseline加上其1/2x-height的高度,具体可参考字母’x’在CSS世界中的角色和故事

        • 这里的元素包括父级块内的匿名内联元素
    • 其余

      • 内容区域的中心
    • 将这些元素的中点进行对齐。

      • 也就是说...middle也不会是真居中,和字体的x-heightbaseline相关。
      • 纯粹由可替换元素组成的内容须要居中时,能够设置父级font-size:0,将父级块内的匿名内联元素高度置为0(即保证了该元素的全部线都是一致的)
  • top/bottom

    • 文本

      • line-box的顶部/底部
    • 其余

      • 外边距的顶部/底部
  • text-top/text-bottom

    • 文本

      • content-area的顶部/底部
    • 其余

      • 外边距的顶部/底部
  • 实质上,以上的属性都是由子元素的对齐点,去匹配父元素内的匿名内联元素的对应对齐点。

数值

  • 百分比

    • 使元素的基线对齐到父元素的基线之上的给定百分比,该百分比是line-height属性的百分比。负值则为向下
  • 数值

    • 使元素的基线对齐到父元素的基线之上的给定长度。负值则为向下

问题

  • vertical-align:baseline可能致使line-box高度比line-height要大。
<p>
    <span>Ba</span>
    <span>Ba</span>
</p>
p {
    font-family: Catamaran;
    font-size: 100px;
    line-height: 200px;
}
span:last-child {
    font-size: 50px;
}

image.png

  • 更为常见的状况是
<p>
    <span>Ba</span>
</p>
p {
    line-height: 200px;
}
span {
    font-family: Catamaran;
    font-size: 100px;
}

此时line-box中会存在一个匿名行内元素,字符属性与<p>可继承的字符熟悉值相同。该元素width为0,line-height<span>极可能不一致。致使<p>的高度不为200px;

//这样可能更容易理解,Ba就是那个 匿名行内元素,即便没有在标签中显式添加文本内容,也会存在对应高度
<p>
    Ba
    <span>Ba</span>
</p>
p {
    line-height: 200px;
}
span {
    font-family: Catamaran;
    font-size: 100px;
}

参考地址:

  1. https://www.zhangxinxu.com/wo...
  2. https://stackoverflow.com/que...
  3. https://stackoverflow.com/que...
  4. https://stackoverflow.com/que...
  5. https://iamvdo.me/en/blog/css...
相关文章
相关标签/搜索