亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

深入理解 line-height 和 vertical-align

2024-07-11 08:59:45
字體:
來源:轉載
供稿:網友

幾個概念

  • line box:包裹 inline box 的一個盒子,一個或多個 line box 堆疊撐起一個 HTML 元素。
  • inline(-level) box:可以是一個由行內元素包裹的盒子,也可以是一個純文字的匿名盒子。
  • content area:對于非替換元素來說,content area 的范圍由 font-size 以及字體本身決定;對于替換元素來說,由元素自有寬高決定。
  • baseline:一個元素基線的位置由該元素內字母 x 底部所在的位置決定,當然字體不同基線所在的位置也就不同。

通過一段代碼可以理解一下:

div {  background-color: #ccc;  font-size: 20px;  color: #fff;}span {  color: red;}<div>文字1<span>文字2</span>文字3</div>

白色的文字就是一個匿名 inline box,紅色的文字是一個由 span 包裹的 inline box。這三個 inline box 組成一個 line box,可以理解為灰色的區域,因為在這個例子里就是由一個 line box 撐開了 div。如果有多行的文字,那就有多個 line box。

關于 content area,W3C 有一段這樣的解釋:

CSS 2.1 does not define what the content area of an inline box is (see 10.6.1 above) and thus different UAs may draw the backgrounds and borders in different places.

這篇文章對非替換元素 content area 的定義就是自有寬高加上 margin,padding 以及 border。我認為應該將 content area 理解為 content box。

line box 高度

瀏覽器會計算 line box 中每一個 inline box 的高度,對于不同的 inline box 計算方式有所不同:

如果是一個替換元素(比如 img,input),inline-* 元素或者是 flexbox 中的子元素,高度由其 margin box 決定;

inline-block 元素:

div {  background-color: #ccc;  color: #fff;}span {  display: inline-block;  height: 30px;  margin: 10px;  background: #fff;  color: red;}<div>xxx<span>xxx</span>xxx</div>

這里 span inline box 的高度就是 height + margin 2。如果 height 的值是 auto,高度就是等于 line-height + margin 2。

如果是一個非替換元素,高度由它的 line-height 決定,而不是 content area,雖然有時候看起來像 content area 撐開了 line box 的高度。

div {  background-color: #ccc;  font-size: 20px;  color: #fff;  font-family: Sana;}span {  background: #fff;  color: red;}<div>xxx<span>xxx</span>xxx</div>

這張圖片可以明顯地看出撐開 line box 的是 line-height,而不是 content area。

這篇文章用了 virtual-area height 來表示 line-height 撐開的高度,而我的理解其實就是 inline box 的高度。

line box 中所有 inline box 的最高點以及最低點決定了它的高度(該計算包括了 strut 的高度,后文會提到 strut)。

非替換元素的的 margin,padding 以及 border 并不會影響 line box 高度的計算。當一個 inline-level box 的 line-height 小于 content area 的時候,line box 的高度就會小于 content area,此時元素的 background 以及 padding 等就會溢出到 line box 之外。

以下代碼可以說明這個問題:

div {    background: #eee;    border: 1px solid #000;    box-sizing: border-box;    font-size: 50px;    line-height: 10px;}span {    background: red;    margin: 10px;    padding: 10px;}<div><span>xxx</span></div>

leading:

content area 的高度與 inline box 的高度差就是 leading,這個 leading 會等分被添加到 content area 的頂部與底部,所以說 content area 永遠位于 inline box 的中間(垂直居中)。

strut:

瀏覽器認為每一個 line box 的起始位置都存在一個寬度為 0,沒有任何字符的 匿名 inline box,稱為 strut,這個 strut 是會從父元素繼承 line-height 的,因此它的高度會影響整個 line box 高度的計算。

一個例子

div { background: #eee; border: 1px solid #000; box-sizing: border-box; }<div><img src="./image.png" alt=""></div>

在圖片中可以看到 img 與外層的 div 存在一個間隙,這就是上文提到的 strut 造成的。

在這個例子中,默認情況下 img 的底邊與父元素的基線對齊(img { vertical-align: baseline }),而這個基線實際上就是 strut 基線所在的位置。如下圖所示:

strut 其實就相當于一個不可見的字母 x,上文已經提到 strut 本身是具有 line-height 的,所以就導致圖片底部多了一段間隙。

總結一下存在間隙原因:

  • strut 存在 line-height
  • vertical-align 默認值為 baseline

對應的解決方案:

  • 修改 strut 的 line-height,因為 strut 的 line-height 不是能夠直接設置的,所以需要設置父元素的 line-height,然后讓 strut 繼承,或者修改 font-size
  • 將 vertical-align 設置為其他值line-height

W3C 中對于 line-height 的解釋是這樣的:

On a block container element whose content is composed of inline-level elements, 'line-height' specifies the minimal height of line boxes within the element. The minimum height consists of a minimum height above the baseline and a minimum depth below it, exactly as if each line box starts with a zero-width inline box with the element's font and line height properties. We call that imaginary box a "strut."

我的簡單理解是,對于由行內元素組成的塊級元素而言,line-height 決定了 line box 的最小高度,瀏覽器會假定每一個 line box 以一個寬度為 0 的 inline box (strut)開始,而這個 strut 從父元素繼承到 font 以及 line-height。

  • normal 是 line-height 的默認值,W3C 對它并沒有一個明確的定義。normal 會將 content area 作為一個計算因素。
  • line-height 并不是兩條 baseline 之間的距離。
  • line-height 的值推薦使用數值,而不是使用 em 單位,因為 em 單位會根據從父元素繼承到的 font-size 來計算行高。

vertical-align

W3C 對 baseline 以及 middle 的定義如下:

baseline: Align the baseline of the box with the baseline of the parent box. If the box does not have a baseline, align the bottom margin edge with the parent's baseline.

元素基線與父元素基線對齊,如果元素沒有基線,比如 img,則使用 margin 底邊與父元素基線對齊。

middle: Align the vertical midpoint of the box with the baseline of the parent box plus half the x-height of the parent.

元素的垂直中點位置與父元素的基線加上一半 x-height 的位置對齊。

參考

Deep dive CSS: font metrics, line-height and vertical-align
https://meyerweb.com/eric/css/inline-format.html
https://www.zhangxinxu.com/wordpress/2015/08/css-deep-understand-vertical-align-and-line-height/
https://www.w3.org/TR/CSS2/visudet.html#inline-box-height

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
57pao国产成人免费| 91人人爽人人爽人人精88v| 亚洲人成在线一二| 欧美视频在线观看免费网址| 久久久免费高清电视剧观看| 亚洲欧美三级伦理| 国产精品午夜国产小视频| 久久亚洲精品小早川怜子66| 亚洲一区二区久久| 久久免费国产精品1| 97视频免费在线看| 国产精品电影久久久久电影网| 亚洲人成在线一二| 国产一区二区三区在线观看视频| 亚洲精品小视频在线观看| 欧美午夜激情在线| 国产成一区二区| 欧美xxxx18国产| 精品亚洲一区二区三区在线播放| 欧美日韩视频免费播放| 欧美日韩中国免费专区在线看| 欧美激情亚洲另类| 精品国产电影一区| 日本精品视频在线观看| 亚洲成人国产精品| 俺去了亚洲欧美日韩| 夜色77av精品影院| 91精品久久久久久久| 国产精品久久77777| 久久久久国产精品免费网站| 7777kkkk成人观看| 77777少妇光屁股久久一区| 国产精品黄色影片导航在线观看| 美女扒开尿口让男人操亚洲视频网站| 日韩亚洲一区二区| 九九热最新视频//这里只有精品| 亚洲人午夜精品| 亚洲欧洲视频在线| 国产综合久久久久| 麻豆国产va免费精品高清在线| 狠狠躁天天躁日日躁欧美| 国产亚洲欧美另类中文| 国产在线拍偷自揄拍精品| 中文字幕日韩av综合精品| 亚洲第一偷拍网| 欧美成人手机在线| 亚洲精品电影网| www.午夜精品| 国产福利视频一区二区| 色偷偷偷综合中文字幕;dd| 日产精品久久久一区二区福利| 亚洲精品国产福利| 欧美视频在线观看免费网址| 乱亲女秽乱长久久久| 国产亚洲精品久久久久久| 日韩精品免费综合视频在线播放| 欧美亚洲激情视频| 伊是香蕉大人久久| 国内精品久久久| 一区二区三区国产视频| 欧美中文字幕视频在线观看| 一区二区欧美激情| 亚洲免费一级电影| 国产精品视频播放| 国产精品白嫩初高中害羞小美女| 欧美人与性动交a欧美精品| 国产亚洲一区二区精品| 日韩专区中文字幕| 国产精品久久久久久av福利| 欧美激情国内偷拍| 欧美成人免费在线视频| 久久久久亚洲精品国产| 欧美福利在线观看| 国产精品人成电影在线观看| 日韩美女写真福利在线观看| 这里只有视频精品| 国产精品久久久久福利| 日韩免费电影在线观看| 丝袜一区二区三区| 久色乳综合思思在线视频| 精品亚洲精品福利线在观看| 欧美午夜激情视频| 欧美亚洲一区在线| 日韩高清免费观看| 久久99国产综合精品女同| 国产成人精品免费久久久久| 亚洲天堂av电影| 欧美另类69精品久久久久9999| 欧美激情影音先锋| 欧美黑人一级爽快片淫片高清| 91精品国产综合久久久久久蜜臀| 久久精视频免费在线久久完整在线看| 亚洲情综合五月天| 国产欧美久久一区二区| 欧美日韩国产丝袜美女| 成人精品视频久久久久| 激情懂色av一区av二区av| 亚洲天堂免费在线| 2024亚洲男人天堂| 久久琪琪电影院| 日韩一区二区久久久| 永久免费看mv网站入口亚洲| 精品国产欧美一区二区五十路| 欧美一区二区三区精品电影| 欧美日韩在线观看视频| 曰本色欧美视频在线| 日本一区二区在线播放| 浅井舞香一区二区| 少妇精69xxtheporn| 亚洲一区美女视频在线观看免费| 亚洲第一男人天堂| 国产午夜精品一区二区三区| 亚洲 日韩 国产第一| 成人午夜在线影院| 国产精品一区二区三区在线播放| 成人在线免费观看视视频| 日韩精品黄色网| 91日韩在线播放| 亚洲成人a级网| 国产一区深夜福利| 亚洲欧美国产精品专区久久| 91国内精品久久| 97免费视频在线播放| 国产精品流白浆视频| 57pao成人永久免费视频| 欧美黑人一区二区三区| 97视频免费在线看| 91视频国产一区| 国产91精品在线播放| 日本久久亚洲电影| 菠萝蜜影院一区二区免费| 日本久久久久久久| 4k岛国日韩精品**专区| 性欧美暴力猛交69hd| 亚洲人成在线观看网站高清| 欧美性猛xxx| 久久久久九九九九| 狠狠操狠狠色综合网| 日日噜噜噜夜夜爽亚洲精品| 麻豆国产va免费精品高清在线| 亚洲曰本av电影| 91精品国产综合久久久久久久久| 精品色蜜蜜精品视频在线观看| 国产精品爽黄69| 国内精品视频久久| 青青久久aⅴ北条麻妃| 国产99久久久欧美黑人| 久久精品国产成人精品| 中文字幕欧美日韩精品| 亚洲国产精品大全| 国产精品久久久久久久电影| 日韩亚洲精品视频| 日韩精品在线看| 欧美多人爱爱视频网站| 久久五月天综合| 亚洲毛茸茸少妇高潮呻吟| 日韩av一区在线观看| 7777kkkk成人观看| 亚洲日本成人女熟在线观看| 国产自产女人91一区在线观看| 亚洲午夜精品视频| 日韩女在线观看| 成人免费大片黄在线播放| 欧美成人午夜剧场免费观看|