前幾天在做騰訊微博的微賣場的時候,遇到需要做圖片居中的需求。也就是說,商品列表中的圖片需要居中顯示。因為圖片是賣家自己把商品圖片鏈接過來,商品圖片的大小沒有做限制和過濾。所以我們需要做的是,讓圖片在容器當中水平居中、垂直居中、圖片自適應容器大小。圖片原圖大小和在容器中顯示的大小有這樣的關系:
為了更好地看到效果,先把圖片的原圖展示出來,以便和它在列表容器當中做對比。
x<=200,y<=200的圖片:
x>200,y<=200的圖片:
x<=200,y>200的圖片:
x>200,y>200,且x=y的圖片:
圖片自適應居中適用的場景有商品列表、相冊、搜索圖片結果列表等。如何使用靜態的方法實現這樣的效果呢?看了網上的一些方法,加上自己的一些說明,做了幾個demo,供大家參考。
這種方法適用於小圖片,即商品圖都比容器小,不需要縮放,加載狀態圖片可以使用這個方法。這個方法的局限性在於,商品圖片需要在服務器端過濾,或者先等比例縮小,再在浏覽器端顯示。
1<
div
class
=
"wrap_1"
><
a
href
=
""
><
img
style
=
"background-image:url(100_100.jpg)"
src
=
"wrap_loading.png"
alt
=
""
width
=
"200"
height
=
"200"
></
a
></
div
>
1
2
3
/* 圖片的背景圖方式 */
.wrap_
1
{
width
:
200px
;
height
:
200px
;
border
:
1px
solid
red
; }
.wrap_
1
img {
display
:
block
;
background-repeat
:
no-repeat
;
background-position
:
center
; }
查看demo
在img外設置兩層div,最外層div的樣式設置為display:table-cell。因為IE6、7中對table-cell不支持,所以針對IE6、7,設置了position來實現居中。在IE8中,如果圖片本身的寬比容器的寬大,則容器寬度會被撐開,這裡使用針對IE8的width為200px處理。
1<
div
class
=
"wrap_2_outer"
><
div
class
=
"wrap_2_inner"
><
a
href
=
""
><
img
src
=
"100_100.jpg"
alt
=
""
></
a
></
div
></
div
>
1
2
3
4
/* 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
:
200px
\
9
; *
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
設置了空標簽的高,使得與它並列的。
1<
div
class
=
"wrap_3"
><
a
href
=
""
><
img
src
=
"100_100.jpg"
alt
=
""
></
a
><
i
></
i
></
div
>
1
2
3
4
/* 空標簽 */
.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
對圖片容器設置行高為容器的高。
1<
div
class
=
"wrap_4"
> <
img
src
=
"400_300.jpg"
alt
=
""
> </
div
>
1
2
3
/* 設置行高 */
.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
以上實現的效果為:
對於圖片的自適應,使用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表達式的性能做優化,可以加上這句zoom: expression(function(el){el.style.zoom = “1″; alert(el.tagName);}(this));。
注:圖片來源於網絡。