视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何对未知高度的图片设置垂直居中
2020-11-27 18:48:09 责编:小采
文档
 这篇文章主要介绍了对未知高度的图片设置垂直居中的方法详解,实践时特别留意一下IE浏览器中的显示情况,需要的朋友可以参考下

标准浏览器还是将外部容器#box的显示模式设置为display:table-cell,IE6/IE7是利用在img标签的前面插入一对空标签的办法

但是实际在浏览器中实现起来的效果并不是很完美,由于各浏览器的解析都各不相同,所以在各浏览器都会有1px-3px的偏差。
方法一:

该方法是将外部容器的显示模式设置成display:table,img标签外部再嵌套一个span标签,并设置span的显示模式为display:table-cell,这样就可以很方便的使用vertical-align象表格元素那样对齐了,当然这只是在标准浏览器下,IE6/IE7还得使用定位。
HTML代码

<p id="box">
<span><img src="images/demo.jpg" alt="" /></span>
</p>

CSS代码

<style type="text/css"> 
#box{ 
 width:500px;height:400px; 
 display:table; 
 text-align:center; 
 border:1px solid #d3d3d3;background:#fff; 
} 
#box span{ 
 display:table-cell; 
 vertical-align:middle; 
} 
#box img{ 
 border:1px solid #ccc; 
} 
</style> 
<!--[if lte IE 7]> 
<style type="text/css"> 
#box{ 
 position:relative; 
 overflow:hidden; 
} 
#box span{ 
 position:absolute; 
 left:50%;top:50%; 
} 
#box img{ 
 position:relative; 
 left:-50%;top:-50%; 
} 
</style> 
<![endif]-->

方法二:

方法二和方法一的实现的原理大同小异,结构也是相同的,方法一用的是条件注释,方法二就用的CSS Hack。
CSS代码

#box{ 
 width:500px;height:400px; 
 overflow:hidden; 
 position:relative; 
 display:table-cell; 
 text-align:center; 
 vertical-align:middle; 
 border:1px solid #d3d3d3;background:#fff; 
} 
#box span{ 
 position:static; 
 *position:absolute; /*针对IE6/7的Hack*/
 top:50%; /*针对IE6/7的Hack*/
} 
#box img { 
 position:static; 
 *position:relative; /*针对IE6/7的Hack*/
 top:-50%;left:-50%; /*针对IE6/7的Hack*/
 border:1px solid #ccc; 
}

该方法有个弊端,在标准浏览器下由于外部容器#box的显示模式为display:table-cell,所以导致#box无法使用margin属性,并且在IE8下设置边框也无效。
方法三:

标准浏览器还是将外部容器#box的显示模式设置为display:table-cell,IE6/IE7是利用在img标签的前面插入一对空标签的办法。

HTML代码

<p id="box">
 <i></i><img src="images/demo.jpg" alt="" />
</p>

CSS代码

<style type="text/css"> 
#box{ 
width:500px;height:400px; 
display:table-cell; 
text-align:center; 
vertical-align:middle; 
border:1px solid #d3d3d3;background:#fff; 
} 
#box img{ 
border:1px solid #ccc; 
} 
</style> 
<!--[if IE]> 
<style type="text/css"> 
#box i { 
 display:inline-block; 
 height:100%; 
 vertical-align:middle
 } 
#box img { 
 vertical-align:middle
 } 
</style> 
<![endif]-->

方法四:

在img标签外包裹一个p标签,标准浏览器利用p标签的伪类属性:before来实现,IE6/IE7使用了CSS表达式来实现兼容。
HTML代码

<p id="box">
 <p><img src="images/demo.jpg" alt="" /></p>
</p>

CSS代码

#box{ 
 width:500px;height:400px; 
 text-align:center; 
 border:1px solid #d3d3d3;background:#fff; 
} 
#box p{ 
 width:500px;height:400px; 
 line-height:400px; /* 行高等于高度 */
} 
/* 兼容标准浏览器 */
#box p:before{ 
 content:"."; /* <a href="http://casinogreece.gr/">????????????</a> 具体的值与垂直居中无关,尽可能的节省字符 */
 margin-left:-5px; font-size:10px; /* 修复居中的小BUG */
 visibility:hidden; /*设置成隐藏元素*/
} 
#box p img{ 
 *margin-top:expression((400 - this.height )/2); /* CSS表达式用来兼容IE6/IE7 */
 vertical-align:middle; 
 border:1px solid #ccc; 
}

使用:beforr这个方法对于标准浏览器来说比较给力,也没发现有副作用,但是对于IE6/IE7,如果对性能要求较高的话CSS表达式的方法要慎用。
方法五:

该方法针对IE6/IE7,将图片外部容器的字体大小设置成高度的0.873倍就可以实现居中,标准浏览器还是使用上面的方法来实现兼容,并且结构也是比较优雅。
HTML代码

<p id="box">
 <img src="images/demo.jpg" alt="" />
</p>

CSS代码

#box{ 
 width:500px;height:400px; 
 text-align:center; 
 border:1px solid #d3d3d3;background:#fff; 
 /* 兼容标准浏览器 */
 display: table-cell; 
 vertical-align:middle; 
 /* 兼容IE6/IE7 */
 *display:block; 
 *font-size:349px; /* 字体大小约为容器高度的0.873倍 400*0.873 = 349 */
 *font-family:Arial; /* 防止非utf-8引起的hack失效问题,如gbk编码 */
} 
#box img{ 
 vertical-align:middle; 
}

设置字体大小的方法感觉比较怪异,也没有看到一个合理的解释,只知道图片元素有一些不同于其他元素的特性,但是对于IE6/IE7来说,这个方法还是比较给力的。
思考:很多方法都是依赖于将外部容器的显示模式设置成table才能实现垂直居中,也就是p来模拟table,如果CSS有一个属性来实现这种效果那该多好。

下载本文
显示全文
专题