diplay:table-cell和偽元素:after方法讓圖片居中


讓圖片居中和文字居中是不一樣的,文字居中可以通過line-height等調整,讓圖片居中方法,參考各種資料博文和測試  目前接觸兩種方法 display:table-cell和偽元素:after方法

一,display:table-cell

這個屬性是讓元素以表格單元格的形式呈現類似table標簽中的td,其他現代瀏覽器和ie8+都是支持的 ie6/7是不支持的(當然下面也有解決方法)、

如果只看table元素 就兩個特點:

1,同行等高

2,寬度自動調整

那么table-cell是不是也具有這個特點呢,答案是:yes;為什么呢?

css中有一個有意思的規則“創建匿名表格元素”。拿table-cell來扯,就是,當某個元素被設置為display:table-cell的時候,如果她的父節點不是display:table-row,爺爺節點不是display:table,那么下面就是見證奇跡的時候,這個兒子生出了他的爸爸和爺爺(瀏覽器會自動創建者兩個匿名盒對象)雖然你找不到你的father 和 grandfather,但這確實發生了。

看下下面兩種情況 來了解下這個不可思議的事情,代碼如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>table-cell</title>
    <style>
        div{padding:10px 0;}  
        .classtd,  td{height:34px; padding:10px; margin:10px; border:1px solid #ccc; vertical-align:middle;}  
        .classtd{display:table-cell; border-color:#cc0;}  
    </style>
</head>
<body>
    <div class="classtd">tom</div>  
    <div class="classtd">jack</div>  
    <div>普通 div</div>  
    <div class="classtd">angel</div>  
      
    <div>======= 上面是div 下面是table ========</div>  
    <table cellpadding="0" cellspacing="0">  
        <tr>  
            <td class="dtc">tom</td>  
            <td class="dtc">jack</td>  
        </tr>  
    </table>  
    <table style="margin-top:10px;" cellpadding="0" cellspacing="0">  
        <tr>  
            <td>angel</td>  
        </tr>  
    </table>  
</body>
</html>

然后就可以下結論了:

tom 和 jack ,生出了父親和爺爺(瀏覽器會創建一個表格來包裹相鄰的display:table-cell元素),表現和第一個表格相同。angel自己生出了父親和爺爺表現和第二個表格相同。

既然是這樣,那么想了解table-cell,就是變相了解表格的td了。那就回到了前面所說的兩個特點:同行等高,寬度自動調節。我們就可以拿這個貨來作等高布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>img</title>
    <style>
        div{ width: 500px; height: 500px; background: #eee; text-align: center; display: table-cell; vertical-align: middle;}
        div img{ vertical-align: middle;}
    </style>
</head>
<body>
    <div class="im-box">
        <img src="images/05.jpg">
    </div>
</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

很好 元素img居中顯示了,但在ie7中的顯示卻是這樣的 ,上面也提到了table-cell在ie6/7不支持

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如何解決讓ie6/7也支持table-cell,我的解決方法是讓其布局結構多加個盒子用相對絕對定位使其居中,當然或許還有更好的方法,但我目前還不知道,這樣多加個div用*hack寫的樣式在其他現代瀏覽器里也不影響,可以統一使用這樣的布局樣式,代碼如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>img</title>
    <style>
        div.im-box{ width: 500px; height: 500px; background: #eee; text-align: center; display: table-cell; vertical-align: middle; *position: relative;}
        div.im-cont{ *position: absolute; *top: 50%}
        div.im-cont img{ vertical-align: middle; display: inline; *position: relative; *top: -50%; *left: -50%;}
    </style>
</head>
<body>
    <div class="im-box">
        <div class="im-cont">
            <img src="images/05.jpg">
        </div>
    </div>
</body>
</html>

顯示如:

這樣就可以讓在ie7中居中顯示。

二,偽元素:after

偽元素after/before+content我們知道可以給元素生成內容,content屬性在css2就已被引入被大多瀏覽器支持 (Firefox 1.5+, Safari 3.5+, IE 8+, Opera 9.2+, Chrome 0.2+)ie8以下還是不支持。其生成內容就不說了,看下偽元素的其他實用的用法。

1,:after+content清楚浮動

我們知道盒子中如果元素浮動,那么盒子就會高度塌陷 如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>偽元素</title>
    <style>
    div{ padding: 10px; background: yellow;}
    div img{ float: left;}
    </style>
</head>
<body>
    <div class="im-box">
        <img src="images/05.jpg" alt="">
    </div>
</body>
</html>

通常 我們解決這樣的方法有overflow:hidden/auto;添加空div並clear:both;給子元素設置高度等 現在我們用:after來解決浮動問題

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>偽元素</title>
    <style>
    div{ padding: 10px; background: yellow; *zoom:1;}
    div:after{display:block; content:"clear"; height:0; clear:both; overflow: hidden; visibility:hidden;}
    div img{ float: left;}
    </style>
</head>
<body>
    <div class="im-box">
        <img src="images/05.jpg" alt="">
    </div>
</body>
</html>

需要解釋的是偽元素在ie8下不支持 所以我們用ie的私有縮放屬性*zoom來解決浮動的破壞 在ie7下展示如下

很好,用:after+zoo來解決浮動帶來的破壞 比其他方法最實用,且不產生多余標簽;

2,:after+content讓大小不固定圖片居中

上面介紹了用table-cell讓其劇中的方法,來看下偽元素使其居中怎么做到

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>img</title>
    <style>
        div.im-box{ width: 500px; height: 500px; background: #eee; text-align: center; font-size:0; *font-size:200px;}
        div.im-box:after{ display: inline-block; width: 0; height: 100%; content: 'center'; vertical-align: middle; overflow: hidden;}
        div img{ vertical-align: middle; }
    </style>
</head>
<body>
    <div class="im-box">
      <img src="images/05.jpg">
    </div>
</body>
</html>

與清除浮動影響類似,IE6/7不支持:after偽類,我們可以用另外的方法讓圖片垂直居中,例如font-size方法,設一個比較大點的字體大小,IE6/7就可以實現圖片垂直對齊了,至於其他瀏覽器,就用:after偽類+content內容生成一個vertical-align:middle屬性的元素就可以了。

 


免責聲明!

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



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