元素垂直居中的各種實現方式


一點感悟

曾子曰:"吾日三省吾身", 意思就是說每天要多次想一想自己到底干了什么 O(∩_∩)O~。好吧,這個其實大家都知道,那為什么還要在這里扯呢?很簡單,就是知道的人很多,但做到的人很少。結合自己的工作經驗,談談前端開發的一些認識誤區:

  • 只知其然,不知其所以然;
  • 解決過的問題,下次同樣還是忘記,要查找相關的資料;
  • google,百度一個方法,實現了就可以了;

這些認識的誤區,我相信很多人(包括我自己)都會犯,原因是多種多樣的:

  • 項目有時候確實很急,我們沒有時間來搗鼓這些東西;
  • 哎,以后遇到再找資料好了,反正自己已經知道怎么查找關鍵字了;
  • 我去,哥(姐)還要和女(男)盆友去逛街呢,沒空搞這些細節;
  • ......

總結原因,那就是對技術的專注度不夠,沒有熱情往縱深的方向去挖掘。有人可能會反駁了: "擦,css就那些有限的的屬性,感覺沒什么好學的"(ps:自己以前就是報這種態度的,慚愧)。其實這是正確的嗎?css其實是很精深的一門學問,別看只有一些屬性,但屬性的各種值,屬性之間的搭配,屬性之間的差異......,還有瀏覽器不同的表現,這些都了解清楚了嗎?我們常常在感慨為什么別人會實現一些很好的效果出來,會提出很好的解決方案,其實就是因為他們對屬性,屬性值了解得很透徹,知道怎樣的搭配能產生怎樣的效果。所以,騷年們,如果想在前端有些進步,好好靜下心來學習吧。專注,實踐,學習,歸納

本文是css學習總結的開篇之作,也是我最近感悟的一些總結,希望對您有一些思考吧,廢話什么的就不多說了。

本文地址: http://forkme.info/element-vertical-align/或者http://www.cnblogs.com/blackmanba/p/element-vertical-align.html, 轉載請注明源地址。

開始

最近在搗鼓頁面的時候遇到一個問題,如何實現文字與圖片的垂直居中?如圖:

problem

其實這個問題網上答案一大堆,很多同行也都有自己的各種解決方法,下面查找資料再經過自己實驗總結的方法,會着重介紹優缺點。說了這么多,接下來就是展示最終的顯示效果,如果不知道效果是什么的話,請點擊我思密達

1. inline-height法

這種方法相信很多人都知道並且嘗試過,主要是利用inline元素(或者inline-block元素)的inline-box模型(ps:這個可以查看@旭哥的文章拜拜了,浮動布局-基於display:inline-block的列表布局,原理什么的旭哥都講得很清楚了,這里就不要再瞎子點燈——多此一舉了), 只要設置inline-heigth的值和父元素的height一致即可讓文字居中顯示,樣式如下:

.inline {
	display: inline;
	*display: inine;
	zoom: 1;
}
.lg{
	font-size: 18px;
	font-weight: bold;
	line-height: 80px; /* 注意:line-height和容器的高度一致 */
}

最終效果圖上面已經截過,這里就不再搞多一張了,免得浪費親們寶貴的時間。 O(∩_∩)O~,
最終效果請點擊這里查看,
源代碼在可以在開發者工具中查看, 下同。

1.1 優點

  • 簡單,使用很少的樣式就可以實現;
  • 兼容性強,兼容IE6+, chrome和Firefox(opera沒試過)

1.2 缺陷

  • 只能用於單行文字,多行文字間距過大,效果請點擊
  • 要知道父容器高度,如果不想定死高度的話只能通過javascript獲取並設置,復雜度增大;
  • line-height只能適用於inline和block級別的元素;

1.3 總結

line-height讓文字垂直居中這個方法對於單行文字來說那是再好不過,不用理相鄰元素是什么,圖片啊,文字啊什么都妥妥的沒影響。經過之前一段時間的使用,可以說效果不錯。當然,如果您的需求是多行文字或者是做自適應布局的話,建議不要用這個方法,因為~~~~不適合。%>_<%

2. 采用absolute+margin:auto

這個方法涉及到一個概念,就是margin屬性的屬性的定位問題,絕對定位的元素在填充的時候會根據自身的高度和margin值來決定最終位置。如果什么都木有設置,默認就是填充整個父容器,尺寸固定就會通過margin來決定最后的位置。概念什么的比較繞,我們可以點擊這里查看最終結果,css如下:

.parent {
	position: relative;
}
.abs {
	    position: absolute;
	    top: 0;
	    bottom: 0;
	    right: 0;
	    left: 0;
	    margin: auto;
	    height: 20%;
}

2.1 優點

  • 簡單
  • 文字多的話,兄弟元素也能對應居中,不管兄弟元素是什么,效果請點擊
  • 適應性強,父容器不用限死高度

2.2 缺陷

  • IE6,7 不兼容

2.3 總結

這個方法對於不用兼容IE6, 7的應用來說是十分高效並且實用的,在實際項目的使用中並不推薦這種用法,因為絕對定位脫離了文檔流,會帶來一些維護上的問題,並且也不利於重用。當然,這一切都是權衡,綜合考慮開發和維護成本后,如果覺得合適,就可以采用。

3. 采用display: table-cell

這個方法使用到了table-cell來布局,其實table-cell,顧名思義就是單元格,設置了table-cell的元素其實和傳統的td標簽效果是一致的,最終效果請點擊這里,代碼如下:

.cell {
    display: table-cell;
    height: 80px;
    vertical-align: middle;
}

3.1 優點

  • 簡單,高效
  • 適應性強

3.2 缺點

  • IE6,7 不兼容(如果是圖片居中可以使用font-size,文字不可以)
  • 容器高度固定,設置overflow: hidden 會導致文字不顯示
  • 文字撐開兄弟元素不居中,效果

3.3 總結

使用table-cell的方式總體來說是不錯的解決方案。當然,缺點也很明顯,見上面。根據具體情況具體分析使用即可

4. 采用inline-block 方法

這個方法是目前為止我個人覺得最好的方法。原因很簡單:簡單易懂,容易上手,兼容性強。此方法本質上是利用了inline-block的垂直居中對齊特性。廢話不多說,請點擊我。不想看效果的童鞋可以直接看代碼,如下

.inline-block {
	    display: inline-block;
	    *display: inline;
	    zoom: 1;
	    vertical-align: middle;
}

4.1 一點小結

此方法沒有什么好說的,無論是兼容性還是其他特性都能完美呈現,並且不必知道文字高度,對於高度超過圖片的文字也能夠完美適應。真要說不好也就是先要理解inline box模型(ps:⊙﹏⊙b汗,有硬想缺點的嫌疑)。

5. 采用button 方法

這個方法是無意中看到的,其實原理很簡單,但很有創意。那就是利用控件的特有屬性。button標簽就是這樣的一個例子,因為其特性,我們就可以利用它來實現對應的效果了。請點擊我。代碼如下:

<button>
	<a href="#" class="inline-block w60p verticalmiddle" style="text-align: left;">盛松成:中國信貸結構繼續改善</a>

	<img src="http://jsfiddle.qiniudn.com/news3.png" alt="news" class="fn nomargin verticalmiddle">
</button>

5.1 優點

  • 利用button本身的屬性,簡單明了,甚至可以不用寫css
  • 擴展性好,能根據文字高度自適應

5.2 缺點

  • 典型的為了效果使用標簽,可維護性低
  • 不滿足標簽的語義化,對搜索引擎不友好

結語

本文算作是自己前端開發的一個開端,主要是對自己知道的方法的總結和思考,並寫成文章方便自己以后查閱。希望對您的學習有所幫助。隨時歡迎交流意見,請在下方評論,多多益善!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM