1. 程式人生 > 實用技巧 >2020-10-15

2020-10-15

(1)單行文字/行內元素/行內塊級元素

原理:line-height的最終表現是通過inline box實現的,而無論inline box所佔據的高度是多少(無論比文字大還是比文字小),其佔據的空間都是與文字內容公用水平中垂線的。

#parent{
    height: 150px;
    line-height: 150px;  /*與height等值*/
}

優缺點:

  • 優點:簡單;相容性好
  • 缺點:只能用於單行行內內容;要知道高度的值

(2)多行文字/行內元素/行內塊級元素

原理同上

#parent{  /*或者用span把所有文字包裹起來,設定display:inline-block轉換成圖片的方式解決*/
    height: 150px;
    line-height: 30px;  /*元素在頁面呈現為5行,則line-height的值為height/5*/
}

優缺點:

  • 優點:簡單;相容性好
  • 缺點:只能用於行內內容;需要知道高度和最終呈現多少行來計算出line-height的值,建議用span包裹多行文字

(3)圖片

原理:vertical-align和line-height的關係

#parent{
    height: 150px;
    line-height: 150px;
    font-size: 0;
}
img#son{vertical-align: middle;} /*預設是基線對齊,改為middle*/

優缺點:

  • 優點:簡單;相容性好
  • 缺點:需要新增font-size: 0; 才可以完全的垂直居中;不過需要主要,html#parent包裹img之間需要有換行或空格

(4)單個塊級元素

html程式碼:

<div id="parent">
    <div id="son"></div>
</div>

(4-1) 使用tabel-cell實現:

原理:CSS Table,使表格內容對齊方式為middle

#parent{
    display: table-cell;
    vertical-align: middle;
}

優缺點:

  • 優點:簡單;寬高不定;相容性好(ie8+)
  • 缺點:設定tabl-cell的元素,寬度和高度的值設定百分比無效,需要給它的父元素設定display: table; 才生效;table-cell不感知margin,在父元素上設定table-row等屬性,也會使其不感知height;設定float或position會對預設佈局造成破壞,可以考慮為之增加一個父div定義float等屬性;內容溢位時會自動撐開父元素

(4-2) 使用絕對定位實現:

/*原理:子絕父相,top、right、bottom、left的值是相對於父元素尺寸的,然後margin或者transform是相對於自身尺寸的,組合使用達到水平居中的目的*/
#parent{
    height: 150px;
    position: relative;  /*父相*/
}
#son{
    position: absolute;  /*子絕*/
    top: 50%;  /*父元素高度一半,這裡等同於top:75px;*/
    transform: translateY(-50%);  /*自身高度一半,這裡等同於margin-top:-25px;*/
    height: 50px;
}

/*優缺點
- 優點:使用margin-top相容性好;不管是塊級還是行內元素都可以實現
- 缺點:程式碼較多;脫離文件流;使用margin-top需要知道高度值;使用transform相容性不好(ie9+)*/

或

/*原理:當top、bottom為0時,margin-top&bottom會無限延伸佔滿空間並且平分*/
#parent{position: relative;}
#son{
    position: absolute;
    margin: auto 0;
    top: 0;
    bottom: 0;
    height: 50px;
}

/*優缺點
- 優點:簡單;相容性較好(ie8+)
- 缺點:脫離文件流*/

(4-3) 使用flex實現:

原理:flex設定對齊方式罷了,請查閱文末flex閱讀推薦

#parent{
    display: flex;
    align-items: center;
}

或

#parent{display: flex;}
#son{align-self: center;}

或
/*原理:這個尚未搞清楚,應該是flex使margin上下邊界無限延伸至剩餘空間並平分了*/
#parent{display: flex;}
#son{margin: auto 0;}

優缺點:

  • 優點:簡單靈活;功能強大
  • 缺點:PC端相容性不好,移動端(Android4.0+)

(5)任意個元素(flex)

原理同上

#parent{
    display: flex;
    align-items: center;
}

或

#parent{
    display: flex;
}
.son{
    align-self: center;
}

或 

#parent{
    display: flex;
    flex-direction: column;
    justify-content: center;
}

優缺點:

  • 優點:簡單靈活;功能強大
  • 缺點:PC端相容性不好,移動端(Android4.0+)

本章小結:

  • 對於垂直居中,最先想到的應該就是 line-height 了,但是這個只能用於行內內容;
  • 其次就是考慮能不能用vertical-align: middle; ,不過這個一定要熟知原理才能用得順手,建議看下vertical-align和line-height的基友關係 ;
  • 然後便是絕對定位,雖然程式碼多了點,但是勝在適用於不同情況;
  • 移動端相容性允許的情況下能用flex就用flex