将一个未知大小的大图像置于较小的div内,并隐藏溢出

Jac*_*ney 72 html css css3

我想在没有javascript没有背景图像的div中居中一个img .

这是一些示例代码

<div> 
    <img src="/happy_cat.png"/> 
</div>
Run Code Online (Sandbox Code Playgroud)
  • 我不知道img的大小,它应该能够超过父级的宽度
  • 我不知道父div的宽度(它是100%)
  • 父div具有固定的高度
  • 图像大于父图像,父图像溢出:隐藏
  • 只需要支持现代浏览器

期望的结果.(忽略不透明等,只需注意定位).

在此输入图像描述

我知道这可以通过背景图像轻松完成,但这对我来说不是一个选择.我也可以使用javascript,但它似乎是一个非常沉重的方式来实现这一点.

谢谢!

插口

Eva*_*man 96

那这个呢:

.img {
   position: absolute;
   left: 50%;
   top: 50%;
   -webkit-transform: translateY(-50%) translateX(-50%);
}
Run Code Online (Sandbox Code Playgroud)

这假设父div相对定位.我认为如果你想要.img相对定位而不是绝对定位,这是有效的.只需删除position: absolute并将顶部/左侧更改为margin-topmargin-left.

你可能会想增加与浏览器的支持transform,-moz-transform等等.

  • 这很好用,但如果你想要一个兼容IE8的版本,你应该使用答案[这里](http://stackoverflow.com/a/19414020/2317532) (4认同)
  • 哈 - 你知道这实际上是什么!谢啦.多么有趣的解决方案.:) (2认同)

Rav*_*anH 44

老问题,新答案:

当图像大于包装div时,text-align:center或margin:auto不起作用.但是如果图像较小,那么具有绝对定位或负左边距的解决方案将产生奇怪的效果.

因此,当事先不知道图像大小(如在CSM上)并且它可能比包装div更大或更小时,有一个优雅的CSS3解决方案可用于所有目的:

div {
    display: flex;
    justify-content: center;
    height: 400px; /* or other desired height */
    overflow: hidden;
}
img {
    flex: none; /* keep aspect ratio */
}
Run Code Online (Sandbox Code Playgroud)

请注意,根据样式表中的其他规则,您可能需要将宽度:auto和/或max-width:none附加到img.

  • 这很好用.如果你还想垂直居中,可以在`div`容器中添加`align-items:center`. (4认同)
  • 在我的情况下,这种图像会延伸 (3认同)
  • Flex获胜! (2认同)