1. 程式人生 > >CSS深入理解之line-height

CSS深入理解之line-height

line-height

一、line-height的定義

行高line-height,兩行文字基線之間的距離。

1、什麼是基線?字元(x)下邊緣

2、為什麼是基線?基線是*線定義之根本。

3、需要兩行麼?不需要,兩行的定義決定了一行的表現

行高line-height可以讓單行文字垂直居中?

其實並不是真的垂直居中,只是看起來居中。

二、line-height與行內框盒子模型

所有內聯元素的樣式表現都與行內框盒子模型有關!例如浮動的文字環繞效果......

<p>這是一行普通的文字,這裡有個 <em>em</em> 標籤</p>

上面是一行普通的文字,有個em標籤。但是卻包含了4中盒子。

1、“內容區域”(content area),是一種圍繞文字看不見的盒子。“內容區域”(content area)的大小與font-size大小相關。

2、“內聯盒子”(inline boxes),“內聯盒子”不會讓內容成塊顯示,而是排成一行。如果外部含inline水平的標籤(span,a,em等),則屬於“內聯盒子”。如果是光禿禿的文字,則屬於“匿名內聯盒子”;

3、“行框盒子”(line boxes),每一行就是一個“行框盒子”,每個“行框盒子”又是由一個一個“內聯盒子”(inline boxes)組成;

4、<p>標籤所在的“包含盒子”(containing box),此盒子由一行一行的“行框盒子”(line boxes)組成。

瞭解行內框盒子模型,對理解line-height有什麼現實意義?

三、line-height的高度機理

<p>這是一行普通的文字,這裡有個<em>em</em>標籤</p>

這是一行普通的文字,這裡有個em標籤。

console.log(document.querySelector("p").clientHeight);//p標籤的高度

元素高度從何而來?是裡面的文字撐開的?不是的。

元素p的高度是由line-height行高決定的

內聯元素的高度是由line-height決定的!

Line-height明明是兩基線距離,單行文字哪來行高,還控制了高度?

(1)行高由於其繼承性,影響無處不在,即使單行文字也不例外;

(2)行高只是幕後黑手,高度的表現不是行高,而是內容區域和行間距。只不過正好:內容區域高度(content area)+ 行間距(vertical spacing)= 行高(line-height)

內容區域:

(1)內容區域(content area)高度只與字號(font-size)以及字型(font-family)有關,與line-height沒有任何關係。

(2)在simsun宋體字型下,內容區域高度等於文字大小值。也就是說,在simsun字型下:font-size + 行間距 = line-height

(3)行間距上下拆分就有了“半行間距”。

行高決定內聯盒子高度;行間距牆頭草,可大可小(甚至負值),保證高度正好等同於行高。

如果行框盒子裡面有多個不同行高的內聯盒子,高度如何表現?

(1)舉例:

<p>這是一行普通的文字,這裡有個<em style=”line-height:80px”>em</em>標籤</p>

這是一行普通的文字,這裡有個em標籤。

console.log(document.querySelector("p").clientHeight);//p標籤的高度

<p>的高度是80px

<p>這是一行普通的文字,這裡有個<em style="line-height:80px;vertical-align:40px;">em</em>標籤</p>   <p>的高度為98px

(2)如果行框盒子裡面有多個不同行高的內聯盒子,高度並不一定等於高度最高的內聯元素的高度。

含多個行框盒子的包含容器

多行文字的高度就是單行文字高度累加。

若行框盒子裡面混入inline-block水平元素(如圖片),高度如何表現?

四、line-height各類屬性值

1、line-height支援的屬性值

Normal、<number>、<length>、<percent>、inherit

(1)line-height:normal,預設屬性值,跟著使用者的瀏覽器走,且與元素字型關聯。

在Chrome瀏覽器下,微軟雅黑的normal值為1.32(字型佔據的高度/字型大小)

在Chrome瀏覽器下,宋體的normal值為1.14

(2)line-height:<number>,使用數值作為行高值。例如:line-height:1.5,根據當前元素的font-size大小計算。假如文字大小(font-size)20px,則行高為1.5*20px=30px

(3)Line-height:<length>,使用具體長度值作為行高值。例如:line-height:1.5em,line-height:1.5rem,line-height:20px,line-height:20pt。

(4)Line-height:<percent>,使用百分比作為行高值。例如:line-height:150%,相對於設定了該line-height屬性的元素的font-size大小計算。假設文字大小font-size為20px,則行高值為20px*150%=30px

(5)Line-height:inherit,行高繼承(IE8+),例如:input{line-height:inherit;},input框等元素預設行高是normal,使用inherit可以讓文字框樣式可控性更強。

2、line-height:1.5,line-height:150%,line-height:1.5em,有什麼區別?

(1)line-height:1.5,所有可繼承元素根據font-size重計算行高;

(2)line-height:150%/1.5em,當前元素根據font-size計算行高,繼承給下面的元素。

3、body全域性數值行高使用經驗:body{ font-size:14px; line-height:1.5; }

匹配20畫素的使用經驗,line-height=20px/14px=1.4285714...

body{ font-size:14px; line-height:1.4286; }

五、line-height與圖片的表現

1、行高會不會影響圖片實際佔據的高度?

行高不會影響圖片實際佔據的高度!

2、消除圖片底部間隙的方法

(1)圖片塊狀化---無基線對齊,img{ display:block;}

(2)圖片底線對齊,img{ vertical-align:bottom;}

(3)行高足夠小 -- 基線位置上移,.box{ line-height:0;}

3、小圖片和大文字,基本上高度受行高控制

六、Line-height的實際應用

1、實現:大小不固定的圖片、多行文字垂直居中

(1)大小不固定的圖片垂直居中(近似垂直居中  


<style>
.box {
	line-height:200px;
	text-align:center;
	background:#eee;
}

.box>img{vertical-align:middle;}
</style>

<div class="box">
	<img src="1.png">
</div>

(2)多行文字垂直居中(也是近似垂直居中)  

<style>
.box {
	line-height:200px;
	text-align:center;
	background:#eee;
}

.box>.text{
	display:inline-block;
	line-height:normal;
	text-align:left;
	vertical-align:middle;
}
</style>

<div class="box">
    <div class="text">
    多行文字水平垂直居中實現的原理跟圖片水平垂直居中是一樣的,區別在於要把多行文字所在的容器的display水平轉換成和圖片一樣,也就是inline-block,以及重置外部繼承的text-align和line-height屬性值。
    </div>
</div>