CSS解決頁(yè)面圖片水平垂直居中問題的方法

做為一個(gè)前端設(shè)計(jì)人員,對(duì)于產(chǎn)品展示頁(yè)面的設(shè)計(jì)一定不會(huì)陌生,其中產(chǎn)品圖片擺放是必定經(jīng)歷的一步,并且水平居中和垂直居中又是最多的。有時(shí)需要產(chǎn)品圖片水平垂直居中顯示,這種展示用CSS來實(shí)現(xiàn)又是比較棘手的一件事,我想很多前端攻程師都有研究過或者說是搜索過這些方法吧。很多網(wǎng)站都是使用table來實(shí)現(xiàn)產(chǎn)品圖片垂直居中,實(shí)現(xiàn)也是相當(dāng)?shù)姆奖?,唯一不足之處就是結(jié)構(gòu)繁鎖,那么今天和大家一起看幾種不是使用talbe方法實(shí)現(xiàn)產(chǎn)品圖片水平垂直居中的方法。
圖片水平垂直居中存在的問題
所謂的圖片水平垂直居中就是把圖片放在一個(gè)容器元素中(容器大于圖片尺寸或是指定了大小的容器),并且圖片位居此容器正中間(中間是指元素容器的正中間),而圖片不是以背景圖片(background-image)形式展示,是以<img>元素形式展示的。如下圖所示:
大家都知道,如果其中img有明確的尺寸,并且圖片尺寸都是一致的,要實(shí)現(xiàn)其水平垂直居中一件非常容易的事情,我們只要像下面操作就能方便解決問題:
將圖片以塊元素方式顯示(display:block);
給圖片指定明確的margin-left和margin-top值,而其中margin-left值等于圖片所在容器的寬度(imbBoxWidth)減去圖片本身寬度(imgWidth)的值的一半【margin-left=(imgBoxWidth-imgWidth)/2】;margin-top值和margin-left很類似,只是把相對(duì)應(yīng)的寬度值換成高度值,即【margin-top=(imgBoxHeight-imgHeight)/2】。
上面的方法是方便簡(jiǎn)單,但受限太大,比如說圖片不一樣時(shí),用上面的方法實(shí)現(xiàn)就比較難,或許你會(huì)說給相圖尺寸的圖片定義一個(gè)類,然后在給他們指定不同的margin。但有很多情況下我們是無法使用這種方法來解決圖片水平垂直居中的問題,比如說有很多不同尺寸的圖片,而且圖片容器的單位和圖片大小單位不一致時(shí),這樣我們就沒有辦法能計(jì)算出圖片與容器之間的margin是多少,此時(shí)解決圖片水平居垂直居中就相當(dāng)?shù)睦щy。換過來說,如果有什么辦法能讓不同尺寸的圖片實(shí)現(xiàn)水平垂直居中,那對(duì)于我們來說是多么有用的,又是多么方便的一件事。
解決問題——讓圖片水平垂直居中
解決水平居中是相當(dāng)?shù)娜菀?,如果圖片左浮動(dòng)并且"display:inline"時(shí),我們只要給圖片設(shè)置一個(gè)"text-align:center"屬性,就順利解決了水平居中。
對(duì)于垂直居中的最佳解決方案,在現(xiàn)代瀏覽器中,我們可以給圖片容器設(shè)置“dipslay:table-cell;vertical-align:middle”, 這種方法能順利的讓圖片實(shí)現(xiàn)垂直居中,但只能在現(xiàn)代瀏覽器運(yùn)行,在IE6-7中無法正常運(yùn)。這樣一來是不是將無法實(shí)現(xiàn)呢?大家別急,我們一起來看下面的幾種方法:
1、table-cell加上display:inline
這種方法很神奇,前面我們說過用display-table和vertical-middle是在現(xiàn)代瀏覽器中實(shí)現(xiàn)圖片垂直居中是最佳辦法,只是IE6-7不支持display:table-cell,其實(shí)并不是那么嚴(yán)重,我們只要在IE6-7下給他來個(gè)另外的寫法。其實(shí)掌握了原理在IE下實(shí)現(xiàn)起來也并不難,下面我們一起先來看看這個(gè)思路:
首先在圖片的容器元素中設(shè)置“display:table-cell;vertical-align:middle;”實(shí)現(xiàn)現(xiàn)瀏覽器的垂直居中;
IE6-7有一個(gè)好的辦法,就是創(chuàng)建一個(gè)線盒,此線盒的高度和圖片容器的高度一樣,并且給這個(gè)線盒也設(shè)置“vertical-align:middle”。
接下來的關(guān)鍵是給IE6-7創(chuàng)建線盒,還好IE6-7下部分顯示支持“dipslay:inline-block”。這樣我們就可以在圖片的容器中創(chuàng)建一個(gè)空元素(比如說span),并且設(shè)置span的“display:inline-block;height:100%;vertical-align:middle”。
創(chuàng)建線盒中有一個(gè)細(xì)節(jié)需要注意,在IE6-7中空的line-block元素寬度為“0”,這樣在IE6-7下是沒有效果的,此時(shí)我們需要給span加上“width:1px”,此時(shí)會(huì)給水平居中造成1px的誤差,但這種bug你是可以接受得了的。
那么最終解決方案就是使用display:table-cell和設(shè)置了display:inline-block的線合span。當(dāng)然其中還是需要為IE寫一點(diǎn)特殊的代碼,接下來我們的起來看代碼:
HTML Markup
- <ul class="imgWrap clearfix">
- <li><a href="#" class="imgBox"><span></span><img src="images/img1.jpg" alt="" /></a></li>
- <li><a href="#" class="imgBox"><span></span><img src="images/img2.jpg" alt="" /></a></li>
- <li><a href="#" class="imgBox"><span></span><img src="images/img3.jpg" alt="" /></a></li>
- <li><a href="#" class="imgBox"><span></span><img src="images/img4.jpg" alt="" /></a></li>
- </ul>
CSS Code
- <style type="text/css">
- .imgWrap li {
- float: left;
- border: solid 1px #666;
- margin: 10px 10px 0 0;
- list-style: none;
- border-collapse: collapse;
- }
- .imgWrap a {
- background: #ffa url(images/gridBg.gif) repeat center;
- width: 219px;
- height: 219px;
- display: table-cell;/*圖片容器以表格的單元格形式顯示*/
- text-align: center; /* 實(shí)現(xiàn)水平居中 */
- vertical-align: middle; /*實(shí)現(xiàn)垂直居中*/
- }
- .imgWrap a:hover {
- background-color: #dfd;
- }
- .imgWrap img {
- border: solid 1px #66f;
- vertical-align: middle; /*圖片垂直居中*/
- }
- </style>
- <!--下面是解決IE6-7的正常顯示的代碼-->
- <!--[if lt IE 8]>
- <style type="text/css">
- .imgWrap a {
- display: block;
- }
- .imgWrap span {
- display: inline-block;
- vertical-align: middle;
- height: 100%;
- }
- .imgWrap {
- _height: 0;
- zoom: 1;
- }
- </style>
- <![endif]-->
效果
2、空白標(biāo)簽實(shí)現(xiàn)圖片的垂直居中
這種方法很有意思,也很有獨(dú)特之處,兼容各瀏覽器,代碼較第一種方法又簡(jiǎn)單很多,最主要的不要單獨(dú)給IE寫效果,而且易懂,下面一起看看這種方法吧。
HTML Markup
- <ul class="imgWrap clearfix">
- <li><a href="#" class="imgBox"><span></span><img src="images/img1.jpg" alt="" /></a></li>
- <li><a href="#" class="imgBox"><span></span><img src="images/img2.jpg" alt="" /></a></li>
- <li><a href="#" class="imgBox"><span></span><img src="images/img3.jpg" alt="" /></a></li>
- <li><a href="#" class="imgBox"><span></span><img src="images/img4.jpg" alt="" /></a></li>
- </ul>
CSS Code
- <style type="text/css">
- .imgWrap li{
- width: 219px;
- height: 219px;
- float: left;
- border: solid 1px #666;
- margin: 10px 10px 0 0;
- list-style: none;
- text-align: center;
- font-size: 0;
- }
- .imgWrap a {
- display: block;
- height: 100%;
- background: #ffa url(images/gridBg.gif) repeat center;
- }
- .imgWrap a:hover {
- background-color: green;
- }
- .imgWrap span {
- display: inline-block;/*將行內(nèi)元素改變?yōu)樾袃?nèi)塊元素顯示*/
- width: 1px;/*實(shí)現(xiàn)IE下可讀效果*/
- height: 100%;/*使用元素高度和圖片容器高度一樣*/
- vertical-align: middle;/*垂直對(duì)齊*/
- }
- .imgWrap img {
- vertical-align: middle;
- }
- </style>
效果
3、display:table模擬表格實(shí)現(xiàn)圖片垂直居中
接下來要說的這種方法是結(jié)構(gòu)有點(diǎn)復(fù)雜,而且在IE6-7事要配合hack來產(chǎn)現(xiàn)。這個(gè)方法就是模擬表格的形式來實(shí)現(xiàn)圖片垂直居中的效果。
表格大家都知道,他有行(table-row)單元格(table-cell),眾所周知,表格單元格中“vertical-align: middle”能讓元素垂直居中,那么下面這個(gè)實(shí)例就是利用這種原理來制作的,一起來看代碼
HTML Markup
- <ul class="imgWrap clearfix">
- <li>
- <div class="table">
- <div class="tableCell">
- <a href="#" class="imgBox"><img src="images/img1.jpg" alt="" /></a>
- </div>
- </div>
- </li>
- <li>
- <div class="table">
- <div class="tableCell">
- <a href="#" class="imgBox"><img src="images/img2.jpg" alt="" /></a>
- </div>
- </div>
- </li>
- <li>
- <div class="table">
- <div class="tableCell">
- <a href="#" class="imgBox"><img src="images/img3.jpg" alt="" /></a>
- </div>
- </div>
- </li>
- <li>
- <div class="table">
- <div class="tableCell">
- <a href="#" class="imgBox"><img src="images/img4.jpg" alt="" /></a>
- </div>
- </div>
- </li>
- </ul>
CSS Code
- .imgWrap li {
- background: #ffa url(images/gridBg.gif) repeat center;
- width: 219px;
- height: 219px;
- float: left;
- border: solid 1px #666;
- margin: 10px 10px 0 0;
- list-style: none;
- text-align: center;
- }
- .table {
- width: 100%;
- height: 100%;
- display: table;
- position: relative;
- }
- .tableCell {
- display: table-cell;
- vertical-align: middle;
- text-align: center;
- padding: 10px;
- *position: absolute;
- *top: 50%;
- *left: 50%;
- }
- .imgWrap a {
- display: block;
- *position:relative;
- *top: -50%;
- *left: -50%;
- }
效果
相關(guān)文章
利用CSS3的flexbox實(shí)現(xiàn)水平垂直居中與三列等高布局
這篇文章給大家介紹了三個(gè)小節(jié)的內(nèi)容,其中包括關(guān)于css3中flexbox需要掌握的概念、flexbox實(shí)現(xiàn)水平垂直居中對(duì)齊和三列等高自適應(yīng)頁(yè)腳區(qū)域黏附底部的布局,有需要的可以參考2016-09-12Flexbox制作CSS布局實(shí)現(xiàn)水平垂直居中的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄狥lexbox制作CSS布局實(shí)現(xiàn)水平垂直居中的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-27淺析CSS實(shí)現(xiàn)水平垂直同時(shí)居中的5種思路
下面小編就為大家?guī)硪黄獪\析CSS實(shí)現(xiàn)水平垂直同時(shí)居中的5種思路。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧2016-04-28- 下面小編就為大家?guī)硪黄孌IV水平垂直居中的兩種完美方法推薦。一起跟隨小編過來看看吧。希望給大家一個(gè)參考2016-03-15
全面總結(jié)使用CSS實(shí)現(xiàn)水平垂直居中效果的方法
這篇文章主要介紹了使用CSS實(shí)現(xiàn)水平垂直居中效果的方法的總結(jié),涵蓋了從最原始的高度設(shè)置到令人興奮的CSS3的Flexbox方式,非常全面,十分推薦!需要的朋友可以參考下2016-03-10- 這篇文章主要介紹了CSS定位“十字架”之水平垂直居中的相關(guān)資料,CSS如何定位“十字架”實(shí)現(xiàn)水平垂直居中效果,小編為大家解答,感興趣的小伙伴們可以參考一下2016-03-02
- 這篇文章主要針對(duì)HTML對(duì)于元素水平垂直居中進(jìn)行的探討,對(duì)元素水平垂直居中操作進(jìn)行講解,感興趣的小伙伴們可以參考一下2016-02-24
- 本文是小編日常遇到的關(guān)于html水平垂直居中的一些問題小結(jié),特此分享在腳本之家網(wǎng)站供大家參考2015-11-18
- 這篇文章主要介紹了DIV或者DIV里面的圖片水平與垂直居中的方法,需要的朋友可以參考下2018-11-15