vertical-align對齊規則
起作用的前提條件
- 只能應用於內聯元素以及 display 值為 table-cell 的元素。
- vertical-align 屬性只能作用在 display 計算值為 inline、inline- block,inline-table 或 table-cell 的元素上。因此,預設情況下,span、strong、 em等內聯元素,img、button、input等替換元素,非 HTML 規範的自定義標籤 元素,以及<td>單元格,都是支援 vertical-align 屬性的,其他塊級元素則不支援。
- 浮動和絕對定位會讓元素塊狀化,從而讓內聯元素的vertical-align不生效
百分比
- vertical-align 的百分比值是相對於 line-height 計算的
- 且是以line-height的基線為基礎,vertical-align:0%和vertical-align:baseline效果一樣
vertical-align:inline-block和baseline
- vertical-align 屬性的預設值 baseline 在文字之類的內聯元素那裡就是字元 x 的下 邊緣,對於替換元素則是替換元素的下邊緣。但是,如果是 inline-block 元素則規則要 複雜了:一個 inline-block 元素,如果裡面就是沒有圖文內容,或者 overflow 不是 visible, 則該元素的基線就是其 margin 底邊緣;否則其基線就是元素裡面最後一行內的圖文的基線。 見demo :inline-block元素的vertical-align.html
vertical-align:middle實現垂直居中
-
內聯元素:元素的垂直中心點和行框盒子基線往上 1/2 x-height 處對齊。vertical-align:middle 定義是元素的中線和字元 x 中心點對齊
-
table-cell 元素:單元格填充盒子相對於外面的表格行居中對齊。table-cell 元素設定 vertical-align 垂 直對齊的是子元素,但是其作用的並不是子元素,而是 table-cell 元素自身。就算 table-cell 元素的子元素是一個塊級元素,也一樣可以讓其有各 種垂直對齊表現。
-
middle 將元素盒子的垂直中點與父盒子的baseline加上父盒子的x-height的一半位置對齊 這裡元素盒子的垂直中點容易確定,父盒子的baseline也好確定,但是x-height要進行計算得到,這個x-height就是字母x的高度。
-
baseline確定的規則 1、inline-table元素的baseline是它的table第一行的baseline。
2、父元素【line box】的baseline是最後一個inline box 的baseline。
3、inline-block元素的baseline確定規則
規則1:inline-block元素,如果內部有line box,則inline-block元素的baseline就是最後一個作為內容存在的元素[inline box]的baseline,而這個元素的baseline的確定就要根據它自身來定了。 規則2:inline-block元素,如果其內部沒有line box或它的overflow屬性不是visible,那麼baseline將是這個inline-block元素的底margin邊界。 實際例子見:對齊規則1.html 詳情見部落格:https://www.cnblogs.com/starof/p/4512284.html?utm_source=tuicool&utm_medium=referral
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
.ctn-block{
display: block;
background-color: #bbb;
line-height: 200px;
font-size: 50px;
}
.ctn-block .child1{
display: inline-block;
width: 100px;
height: 100px;
margin:10px 0;
vertical-align: baseline; /*將子元素盒子的baseline與父盒子的baseline對齊
vertical-align: middle;/*將子元素盒子的垂直中點與父盒子的baseline加上父盒子的x-height的一半位置對齊*/
/***注意:當vertical-align設定為top和bottom時,其就不是按照baseline進行定位了,而是根據line box進行定位。子元素盒子的頂部和底部也就是其上下margin外邊界。**/
/*vertical-align: top;/*將子元素盒子的頂部和其所在的line box頂部對齊*/
/*vertical-align: bottom;/*將子元素盒子的底部和其所在的line box底部對齊*/
background-color: aliceblue;
}
/*
父元素.ctn-block的base-line是Gg的baseline,
inline-block元素因為沒有內部line box,也沒有設定overflow:visible,所以其baseline是底margin邊界。
*/
.wrapper{
width: 200px;
height: 200px;
border: 1px solid red;
line-height: 150px; /*line box就是行高所形成的那個高度*/
}
.son{
/***注意:當vertical-align設定為top和bottom時,其就不是按照baseline進行定位了,而是根據line box進行定位。子元素盒子的頂部和底部也就是其上下margin外邊界。**/
/*vertical-align: top;/*將子元素盒子的頂部和其所在的line box頂部對齊*/
/*vertical-align: bottom;/*將子元素盒子的底部和其所在的line box底部對齊*/
vertical-align: bottom;
display: inline-block;
width: 50px;
height: 50px;
background: black;
}
</style>
</head>
<body>
<div class="ctn-block">
<div class="child1"></div>
<span>Gg</span>
</div>
<div class="wrapper">
<span class="son"></span>
</div>
</body>
&l