CSS網頁製作技巧:圖片的自適應置中和相容處理

來源:互聯網
上載者:User

文章簡介:圖片的自適應置中及相容性處理。

前幾天在做騰訊微博的微賣場的時候,遇到需要做圖片置中的需求。也就是說,商品列表中的圖片需要置中顯示。因為圖片是賣家自己把商品圖片連結過來,商品圖片的大小沒有做限制和過濾。所以我們需要做的是,讓圖片在容器當中水平置中、垂直置中、圖片自適應容器大小。圖片原圖大小和在容器中顯示的大小有這樣的關係:

假設容器大小為200像素*200像素,圖片的寬為x 像素,高為y 像素,則:
當x<=200,y<=200時,圖片位於容器中的中間,即水平置中和垂直置中,顯示在容器的圖片大小為:寬=x,高=y ;
當x>200,y<=200時,顯示在容器中的圖片大小為:寬=200,高=200y/x ;
當x<=200,y>200時,顯示在容器中的圖片大小為:寬=200x/y,高=200 ;
當x>200,y>200,且x>y,顯示在容器中的圖片大小為:寬=200,高=200y/x ;
當x>200,y>200,且x<y,顯示在容器中的圖片大小為:寬=200x/y,高=200;
當x>200,y>200,且x=y,顯示在容器中的圖片大小為:寬=200,高=200 ;

為了更好地看到效果,先把圖片的原圖展示出來,以便和它在列表容器當中做對比。

x<=200,y<=200的圖片:

x>200,y<=200的圖片:

x<=200,y>200的圖片:

x>200,y>200,且x=y的圖片:

圖片自適應置中適用的情境有商品列表、相簿、搜尋圖片結果清單等。如何使用靜態方法實現這樣的效果呢?看了網上的一些方法,加上自己的一些說明,做了幾個demo,供大家參考。

使用透明圖片,在該圖片上設定背景圖。

這種方法適用於小圖片,即商品圖都比容器小,不需要縮放,載入狀態圖片可以使用這個方法。這個方法的局限性在於,商品圖片需要在伺服器端過濾,或者先等比例縮小,再在瀏覽器端顯示。

<div class="wrap_1"><a href=""><img style="background-image:url(100_100.jpg)" src=http://www.webjx.com/css/"wrap_loading.png" alt=""  width="200" height="200"></a></div>
        /* 圖片的背景圖方式 */.wrap_1 { width:200px; height:200px; border:1px solid red; }.wrap_1 img { display:block; background-repeat:no-repeat; background-position:center; }        

查看demo

設定display為table-cell

在img外設定兩層div,最外層div的樣式設定為display:table-cell。因為IE6、7中對table-cell不支援,所以針對IE6、7,設定了position來實現置中。在IE8中,如果圖片本身的寬比容器的寬大,則容器寬度會被撐開,這裡使用針對IE8的width為200px處理。

<div class="wrap_2_outer"><div class="wrap_2_inner"><a href=""><img src=http://www.webjx.com/css/"100_100.jpg" alt="" ></a></div></div>
/* table-cell方式 */.wrap_2_outer { border:1px solid red; width:200px; height:200px; display:table-cell; font-size:0; text-align:center; vertical-align:middle; *position:relative;padding:0; overflow:hidden; }.wrap_2_inner { text-align:center; vertical-align:middle; width:200px9; *width:auto;font-size:0; *position:absolute;*top:50%;*left:50%;}.wrap_2_inner img { max-height:200px; max-width:200px; *position:relative;*bottom:50%;*right:50%;margin:0 auto;}        

查看demo

用與圖片並列的一個空標籤

設定了空標籤的高,使得與它並列的。

<div class="wrap_3"><a href=""><img src=http://www.webjx.com/css/"100_100.jpg" alt="" ></a><i></i></div>
/* 空標籤 */.wrap_3 { width:200px; height:200px; overflow:hidden; text-align:center; font-size:0; border:1px solid red;  }.wrap_3 i { display:inline-block; width:0; height:100%; overflow:hidden; margin-left:-1px; font-size:0; line-height:0; vertical-align:middle; }.wrap_3 img { vertical-align:middle; max-height:200px; max-width:200px; }        

查看demo

設定行高line-height

對圖片容器設定行高為容器的高。

<div class="wrap_4"> <img src=http://www.webjx.com/css/"400_300.jpg" alt="" > </div>
/* 設定行高 */.wrap_4 { width:200px; height:200px; text-align:center; border:1px solid red; font-family: arial; line-height:198px; font-size:0; _font-size:180px; }.wrap_4 img { display:inline-block; vertical-align:middle; max-height:200px; max-width:200px; }        

查看demo

以上實現的效果為:

IE6的杯具

對於圖片的自適應,使用max-width和max-height。冷酷無情的現實就是IE6及以下不支援max-width和max-height。以上用於修複IE6中max-height,max-width的運算式_width和 _height,在運行時還存在小問題。用不同的圖片試了一下,對於寬和高至少一個值小於或等於200的圖片,能夠完美地展示,但是若寬和高兩者都大於200,則會出現一些小問題。

若_width和_height兩者一起使用,x>200,y>200,且x>y的圖片,會顯示理想的狀態。x>200,y>200,且x<y的圖片,會顯示為200*200的大小,但是沒有按比例縮放:(。

若_width、_height單獨使用,則能夠使對應的圖片顯示為理想狀態。如僅使用_width,能對橫圖起作用,對豎圖不起作用。

反之,如僅使用_height,能對豎圖起作用,對橫圖不起作用。

結論是,_width和_height都寫上,這樣做有95%完美了。另外對CSS Expression的效能做最佳化,貓哥做了詳盡的分析供大家參考。針對IE6加上_width: expression(function(el){el.style.width = el.offsetWidth > 200 ? ’200px’ : el.offsetWidth + ‘px’;counter(’2′);}(this));這句。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.