如果图像比其容器宽,我如何居中?

Posted

技术标签:

【中文标题】如果图像比其容器宽,我如何居中?【英文标题】:How do I center an image if it's wider than its container? 【发布时间】:2011-03-19 01:22:54 【问题描述】:

通常,您使用display: block; margin: auto 将图像居中,但如果图像大于容器,则会向右溢出。如何让它均匀地溢出到两边?容器的宽度是固定的并且是已知的。图片的宽度未知。

【问题讨论】:

【参考方案1】:

我看到这是一篇旧帖子,所以也许现在每个人都知道这一点,但我需要帮助,我使用 flex 解决了这个问题:

.parent 
   display: flex;
   /* give it the width and height you like */



.parent img 
   min-width: 100%;
   min-height: 100%;
   object-fit: cover;

【讨论】:

【参考方案2】:

我发现这是一个更优雅的解决方案,没有 flex,类似于上面的内容,但更通用(适用于垂直和水平):

.wrapper 
    overflow: hidden;

.wrapper img 
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /* height: 100%; */ /* optional */

【讨论】:

【参考方案3】:

这是一个 2 行 CSS 解决方案(跨浏览器支持可能需要多行):

img 
    margin-left: 50%;
    transform: translateX(-50%);

【讨论】:

【参考方案4】:

另一种纯CSS解决方案是使用transform属性:

html

<div class="outer">
    <img class="image" src="http://www.gstatic.com/webp/gallery/4.jpg" />
</div>

CSS:

.outer 
    position: relative;
    width: 100px;
    border: 1px solid black;
    height: 150px;
    margin-left: 100px; /* for demo */
    /* overflow: hidden; */


img.image 
    width: 200px;
    opacity: 0.7;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    -webkit-transform: translateX(-50%);

Fiddle

只需将overflow:hidden 添加到父div 以隐藏图像的额外区域。

【讨论】:

【参考方案5】:

纯CSS解决方案

需要一个额外的包装器(在 FireFox、IE8、IE7 中测试):

改进的答案

原来的答案有问题(如下)。如果图像大于outer 以它的自动边距为中心的容器,则它会截断左侧的图像并在右侧创建 excessive 空间,as this fiddle shows。

我们可以通过将inner 向右浮动然后将右侧居中来解决这个问题。这仍然会将页面左侧的img 截断,但它是通过显式将它推到那个方向然后从那个方向移回中心来实现的,这就是防止 额外 水平滚动的原因在右边。 现在我们只需要获得尽可能多的向右滚动来查看图像的右侧部分。

Fiddle Example(小提琴中的边框仅供演示。)

基本 CSS

div.outer 
    width: 300px; /* some width amount needed */
    margin: 0 auto; 
    overflow: visible;

div.inner 
    position:relative;
    float: right; /* this was added and display removed */
    right: 50%;

div.inner img 
    position: relative; 
    right:-50%; /* this was changed from "left" in original */

如果您希望在宽幅图像上完全不向右滚动

然后使用上面的方法,还设置任何包含outer(like body 或a third wrapper)的元素具有overflow: hidden


原创(历史)

Fiddle Example(小提琴中的边框仅供演示。)

HTML

<div class="outer">
    <div class="inner">
        <img src="/yourimage.png">
    </div>
</div>

CSS

div.outer 
    width: 300px; /* some width amount needed */
    margin: 0 auto; 
    overflow: visible;

div.inner 
    display: inline-block; 
    position:relative; 
    right: -50%;

div.inner img 
    position: relative; 
    left:-50%; 

【讨论】:

+1 - 很棒。 float: left.inner 风格中是必需的吗? 但是,对于新修订的解决方案,float: right 是必需的。 效果很好!我唯一要添加的是在末尾带有“clear class”的 div 以清除 --- .clear clear:both; 和 出于我自己的目的,我分叉了您的小提琴以使用动画功能完成它的步伐。它非常好!谢谢! jsfiddle.net/hSNBT 注意:如果您在图像本身上放置了明确的尺寸(例如,对于响应式设计),您还需要将这些相同的尺寸(特别是宽度)应用于 .inner 类,否则在 IE 中图像不会居中。【参考方案6】:

其实还有更简单的纯css/html方式(不用大水平滚动):

HTML

<div class="outer">
  <img src="/my/sample/image.jpg">
</div>

CSS

如果你不想看到图片溢出

div.outer img 
    position: absolute;
    left: -50%;
    z-index:-1;

div.outer 
    overflow: hidden;
    position: relative;
    height: 200px;

图像溢出可见

div.outer img 
    position: absolute;
    left: -50%;
    z-index:-1;

div.outer 
    overflow: visible;
    position: relative;
    height: 200px;

body, html 
    overflow-x:hidden;

图片溢出可见的背景解决方案:

HTML

<div class="outer">
  <div class="inner"></div>
</div>

CSS

div.outer 
    width: 100%;
    height: 200px;

div.inner 
    background: url('/assets/layout/bg.jpg') center no-repeat;
    position: absolute;
    left: 0;
    width: 100%;
    height: inherit;

假设外部是在一个指定宽度的容器中。

【讨论】:

【参考方案7】:

HTML

​<div class="image-container">
  <img src="http://www.google.com/images/logo.gif"  />
</div>​

CSS

.image-container 
    width: 150px;
    border: solid 1px red;
    margin:100px;


.image-container img 
    border: solid 1px green;

jQuery

$(".image-container>img").each(function(i, img) 
    $(img).css(
        position: "relative",
        left: ($(img).parent().width() - $(img).width()) / 2
    );
);

在 jsFiddle 上查看:http://jsfiddle.net/4eYX9/30/

【讨论】:

对我来说完美的解决方案,这真的让我很开心,我只是在高度上添加了相同的逻辑,所以它会匹配我所有的案例jsfiddle.net/4eYX9/152【参考方案8】:

我只能想到一个 javascript 解决方案,因为您需要做的是将图像相对定位在其容器左侧的负数:

jQuery

$(document).ready(function()

    var theImg = $('#container img');
    var theContainer = $('#container');
    if(theImg.width() > theContainer.width())
        theImg.css(
            position: 'relative',
            left: (theContainer.width() - theImg.width()) / 2
        )
    
)

【讨论】:

【参考方案9】:

我认为没有纯 CSS 解决方案(下一个答案除外 :))。然而,使用 Javascript 只需找到图像的宽度,减去容器宽度,除以 2 即可得到所需的容器左侧多远。

【讨论】:

【参考方案10】:

最好将其设置为容器的background image。

#container 
    background: url('url/to/image.gif') no-repeat center top;

【讨论】:

@Cannibal:啊,我现在明白你的“不能溢出”是什么意思了。确实如此,您只是希望溢出可见。不,仅使用 CSS 背景图像确实不可能。仅当您想将其放在 &lt;body&gt; 上时才有用。

以上是关于如果图像比其容器宽,我如何居中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 div 容器中自动裁剪和居中图像

在 Div 中居中超大图像

不定宽元素的居中方法

如何在 Safari 中将 flex 容器的绝对定位子项居中?

如何根据容器而不是屏幕大小来提供图像大小

如果您不知道图像的大小,请在 Div 中垂直和水平居中图像?