前言:居中是網頁佈局中再常見不過的一種方式了,今天咱們就來聊聊css居中的那點事。
咱們主要從這幾個方面來了解下居中:css
水平居中又分爲:html
實現文字的水平居中,是最爲簡單的了,加上text-align: center;
便可,看如下代碼:web
<p class="text-center"> 文字水平居中 </p>
.text-center { text-align: center; }
注意:父元素必須是塊級元素
,即display: block;至於什麼是塊級元素
,不在本文討論的範圍
圖片水平居中跟文字同樣,也是使用text-align: center;
瀏覽器
好比div元素,假設咱們已經知道它的寬度是300px,這時候咱們就能夠這樣設置,加上margin: 0 auto;
這句代碼。佈局
<div class="div1"> 我是水平居中的div </div>
.div1 { width: 300px; margin: 0 auto; }
一樣是針對塊級元素
纔有效果。學習
<div class="parent3"> <div class="child3"></div> </div>
.parent3 { position: relative; } .child3 { position: absolute; left: 50%; width: 300px; margin-left: -150px; // 寬度的一半 }
我以爲比較簡單的方法就是給父元素設置text-align: center;
給子元素添加display: inline-block;
這樣就好了,仍是來看代碼比較直接。flex
<div class="parent"> <div class="child">未知元素寬度</div> </div>
.parent { text-align: center; } .child { display: inline-block; padding: 20px; background: red; }
父元素設置相對定位position: relative;
;子元素設置絕對定位position: absolute
加transform
。看如下例子:code
<div class="parent"> <div class="child">我是水平居中的div</div> </div>
.parent { position: relative; } .child { position: absolute; left: 50%; -webkit-transform: translate(-50%, 0); transform: translate(-50%, 0); padding: 20px; background: red; }
注意:爲了更好的兼容性,transform須要加上不一樣瀏覽器的前綴。
仍是來看具體的代碼:orm
<div class="parent2"> <div class="child2">我是水平居中的div</div> </div>
.parent2 { position: relative; float: left; left: 50%; } .child2 { position: relative; right: 50%; padding: 20px; background: red; }
<div class="parent4"> <div class="child4">我是水平居中的div</div> </div>
.parent4 { position: relative; display: flex; justify-content: center; } .child4 { padding: 20px; background: red; }
注意:flex有兼容性問題,關於flex的兼容性寫法,你們能夠自行百度下,也能夠在 caniuse查看瀏覽器的兼容狀況
「fit-content」是CSS中給「width」屬性新加的一個屬性值,他配合margin可讓我輕鬆的實現水平居中的效果。這個方法也是我第一次用到,後期有時間再來仔細研究學習下。htm
來看代碼:
<div class="fitContentDiv"> 我是水平居中的div </div>
.fitContentDiv { width: fit-content; margin: 0 auto; height: 100px; background: red; padding: 20px; }
必須配合margin: 0 auto;
來使用來能夠實現居中的效果。
注意:一樣是存在瀏覽器的兼容性問題。
這個比較簡單,只須要設置高度height
和行高line-height
相等便可。看代碼:
<p class="txt1"> 我是垂直居中的文字 </p>
.txt1 { height: 100px; line-height: 100px; background: red; }
注意:這個方法有個很差的地方就是隻能是針對單行的文字,多行就不適合用。
咱們設置padding-top
和padding-bottom
相等就能夠了,並且此方法針對多行文字也沒問題。看代碼:
<p class="txt2"> 我是垂直居中的文字 </p>
.txt2 { padding-top: 20px; padding-bottom: 20px; background: red; }
注意:這種方法也是有一個明顯的缺陷,就是你不能給文本的父元素設置高度。
此方法是利用表格單元格的特性,咱們直接看代碼:
<div class="parent6"> <div class="child6">我是垂直居中的文字(這裏面也能夠放圖片)</div> </div>
.parent6 { display: table; width: 300px; height: 300px; background: blue; } .child6 { display: table-cell; vertical-align: middle; }
此方法對圖片一樣有效,並且文本也能夠多行,是一種不錯的方法。
使用vertical-align: middle
,直接看代碼:
<p class="img-va-center"> <img src="https://via.placeholder.com/150" alt=""> </p>
.img-va-center { height: 300px; line-height: 300px; background: red; } .img-va-center img { display: inline-block; vertical-align: middle; }
看代碼:
<div class="parent6"> <div class="child6">我是垂直居中的div</div> </div>
.parent6 { position: relative; height: 300px; background: red; } .child6 { position: absolute; top: 50%; left: 0; width: 50px; height: 50px; margin-top: -25px; background: gray; }
直接上代碼了:
<div class="parent7"> <div class="child7">我是垂直居中的div</div> </div>
.parent7 { position: relative; width: 300px; height: 300px; background: red; } .child7 { position: absolute; top: 50%; width: 50px; padding: 10px; background: gray; -webkit-transform: translate(0, -50%); transform: translate(0, -50%); }
注意:一樣須要考慮
transform
的兼容性問題。
<div class="parent8"> <div class="child8">我是垂直居中的div</div> </div>
.parent8 { display: flex; width: 300px; height: 300px; background: blue; } .child8 { margin: auto; padding: 20px; background: gray; }
注意:此方法要考慮flex的兼容性問題。
<div class="parent9"> <div class="child9">我是垂直居中的div</div> </div>
.parent9 { display: flex; align-items: center; width: 300px; height: 300px; background: blue; } .child9 { padding: 20px; background: gray; }
注意:此方法要考慮flex的兼容性問題。
水平垂直居中就是把水平居中跟垂直居中的方法結合起來使用啦,這裏就再也不舉例了。
這裏雖然列舉了那麼多例子,可是方法終歸是死的,業務需求是變化無窮的,具體仍是要根據咱們項目的業務需求來搭配使用。css很強大,要實現同一個功能,能夠有不少種方法,並不僅有我列舉的這些,關鍵是要找到適合業務需求的方法,若是你有更好的方法,歡迎留言討論,你們一塊兒學習進步!