网页图片居中:商品图片的自适应居中的方法
前几天在做腾讯微博的微卖场的时候,遇到需要做图片居中的需求。也就是说,商品列表中的图片需要居中显示。因为图片是卖家自己把商品图片链接过来,商品图片的大小没有做限制和过滤。所以我们需要做的是,让图片在容器当中水平居中、垂直居中、图片自适应容器大小。图片原图大小和在容器中显示的大小有这样的关系:
- 假设容器大小为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,供大家参考。
使用透明图片,在该图片上设置背景图。
这种方法适用于小图片,即商品图都比容器小,不需要缩放,加载状态图片可以使用这个方法。这个方法的局限性在于,商品图片需要在服务器端过滤,或者先等比例缩小,再在浏览器端显示。
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 ; }
|
设置display为table-cell
在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 ;}
|
用与图片并列的一个空标签
设置了空标签的高,使得与它并列的。
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 ; }
|
设置行高line-height
对图片容器设置行高为容器的高。
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 ; }
|
以上实现的效果为:
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表达式的性能做优化,可以加上这句zoom: expression(function(el){el.style.zoom = “1″; alert(el.tagName);}(this));。
注:图片来源于网络。