【问题标题】:Center a large image of unknown size inside a smaller div with overflow hidden将未知大小的大图像居中在一个较小的 div 中,并隐藏溢出
【发布时间】:2013-11-09 12:47:52
【问题描述】:

我想在 不带 javascript不带背景图像的 div 中居中显示 img。

这是一些示例代码

<div> 
    <img src="/happy_cat.png"/> 
</div>
  • 不知道img的大小,应该可以超过parent的宽度
  • 我不知道父 div 的宽度(它是 100%)
  • 父 div 具有固定高度
  • 图片大于父级且父级有overflow:hidden
  • 只需要支持现代浏览器

想要的结果。 (忽略不透明度等,只注意定位)。

我知道这可以通过背景图片轻松完成,但这不是我的选择。我也可以使用 javascript,但这似乎是一种非常笨拙的方式来实现这一点。

谢谢!

杰克

【问题讨论】:

  • 我认为这不能单独使用 CSS 来完成。你是否愿意接受同样的 jquery/js 解决方案?
  • 我这里只想用JS作为最后的结果。如果经过调查这是不可能的,那么我会退出并使用 JS,但我相信这可以用一些漂亮的现代 CSS3 来完成。
  • @JackMahoney 一个问题:父 &lt;div&gt; 的尺寸(或者特别是高度——因为宽度已经是 100%)是由内部图像单独决定的吗?
  • 好问题。父级的高度是已知且固定的。
  • center oversized image in div 的可能重复项

标签: html css


【解决方案1】:

老问题,新答案:

当图像大于包装 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 */
}

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

【讨论】:

  • 这很好用。如果您还想垂直居中,可以将 align-items: center 添加到您的 div 容器中。
  • 天才。谢谢!我还使用了 Cory 的 align-items: center 建议进行垂直居中,这很奏效。
  • 在我的情况下这种拉伸图像
  • @che-azeh 可能还有另一个 CSS 规则,其中最大高度或最大宽度适用于图像...
  • 很棒的解决方案!
【解决方案2】:

这个呢:

.img {
   position: absolute;
   left: 50%;
   top: 50%;
   -webkit-transform: translateY(-50%) translateX(-50%);
}

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

您可能希望通过transform-moz-transform 等添加浏览器支持。

【讨论】:

  • 哈——你知道这到底是怎么回事!谢啦。多么有趣的解决方案。 :)
  • 我最近了解了翻译居中,太棒了!很高兴它帮助了你。
  • 你不知道你为我节省了多少时间!
  • 这个很好用,但是如果你想要一个兼容 IE8 的版本,你应该使用答案here
  • 这个方法并不完美,因为如果你将margin-top改为50%,50%是基于父宽度而不是父高度(假设父宽度不等于它的高度),所以它会产生错误的边距顶部。你对这种情况有什么看法?
【解决方案3】:

我知道这是旧的,但我也想出了一个与上述非常相似的纯 css 解决方案。

.parent {
    float: left;
    position: relative;
    width: 14.529%; // Adjust to your needs
}

.parent img {
    margin: auto;
    max-width: none; // this was needed for my particular instance
    position: absolute;
    top: 11px; right: -50%; bottom: 0; left: -50%;
    z-index: 0;
}

【讨论】:

    【解决方案4】:

    感谢大家的帮助。 我认为这仅在 CSS 中是无法实现的。

    我将转向 jQuery 解决方案。这里有一些[伪]代码供感兴趣的人使用。

    我打算放弃 CSS 解决方案,但看起来可以做到(请参阅接受的答案)。这是我要使用的 JS 解决方案。

    var $img = $('img'),
        w = $img.width();
    
    $img.css({marginLeft: -w});
    

    以及随附的 css

    img{
      position:absolute;
      left:50%;
    }
    

    【讨论】:

      【解决方案5】:

      这总是有点棘手,并且有很多解决方案。我发现最好的解决方案如下。这会将其垂直和水平居中。

      CSS

      #container {
          height: 400px;
          width: 400px;
      }
      .image {
          background: white;
          width: 100%;
          height: 100%;
          position: relative;
          overflow: hidden;
      }
      
      .left {
          width: 100px;
          height: 100%;
          z-index: 2;
          background: white;
          top: 0px;
          position: absolute;
          left: 0px;
      }
      .right {
          width: 100px;
          height: 100%;
          z-index: 2;
          position: absolute;
          background: white;
          top: 0px;
          right: 0px;
      }
      .image img {
          margin: auto;
          display: block;
      }
      

      HTML

          <div id="container">
      <div class="image">
          <div class="left"></div>
          <div class="right"></div>
          <img width="500" src="https://www.google.com.au/images/srpr/logo11w.png" />
      </div>
      

      See fiddle

      略有不同的技术:Fiddle

      【讨论】:

      • 这不起作用,因为您在 .centered 容器上设置了明确的宽度。我不知道任何元素的宽度!
      • 如果 img 宽度大于它的容器,那么 max-width 不会帮助它居中。 jsfiddle.net/ZXUxv/1
      • 我认为您不理解我的要求(如果这听起来很粗鲁,请见谅)。即使我设置了最大宽度,如果图像本身大于容器(我想允许),那么它也不会居中。我不能用最大宽度限制图像的大小。它需要大于其父 并且 居中。请参阅我上一条评论中的 js fiddle。它具有更大的图像和最大宽度。
      • @JackMahoney 抱歉,我没有看到您的评论。请检查更新的小提琴。它应该做你所要求的。否则我不知道你在问什么。
      • 抱歉,更新后的小提琴仍然没有以父级为中心的图像。无论如何,谢谢你的时间。如果您对这个问题感到困惑,请在更新后的问题中查看我的图片。
      【解决方案6】:

      只需初始化图像的位置如下。

      HTML:

      <div> 
          <img id="img" src="/happy_cat.png"/> 
      </div>
      

      CSS:

      #img {
          left: 0;
          right: 0;
      }
      

      或查看margin: auto;

      这是用于水平对齐。要将其垂直对齐,您可以对您的 &lt;div&gt; 执行 display: table-cell; 然后 vertical-align: middle; 但这不是一个好习惯,因为您的 &lt;div&gt; 不是表格。

      【讨论】:

      • 抱歉,这不适用于宽度大于父级的图像。
      • 哦,真的。我错过了。
      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      相关资源
      最近更新 更多