Div中心超大图像

Tom*_*Tom 163 css

我一直试图解决如何仅使用css将div中的超大图像居中.

我们使用流体布局,因此图像容器的宽度随页面宽度而变化(div的高度是固定的).图像位于div内,其值为嵌入框阴影,以便看起来好像是在图像中查看页面.

图像本身已经调整大小,以尽可能广泛的价值填充周围的div(设计有一个max-width值).

如果图像小于周围的div,则很容易做到:

margin-left: auto;
margin-right: auto;
display: block; 
Run Code Online (Sandbox Code Playgroud)

但是当图像大于div时,它只是从左边缘开始,偏离右边中心(我们正在使用overflow: hidden).

我们可以指定一个width=100%,但是浏览器在调整图像大小和网页设计中心方面做了很糟糕的工作,围绕着高质量的图像.

有关图像居中的想法,以便overflow:hidden均匀地切断两个边缘?

hyo*_*nis 356

尝试这样的事情.无论两者的大小如何,这都应该使中间的任何巨大元素垂直和水平地相对于其父元素居中.

.parent {
    position: relative;
    overflow: hidden;
}

.child {
    position: absolute;
    top: -9999px;
    bottom: -9999px;
    left: -9999px;
    right: -9999px;
    margin: auto;

}
Run Code Online (Sandbox Code Playgroud)

  • 这太不可思议了,但我好奇......为什么这个有用? (20认同)
  • 是的,我也遇到过'-100%'的问题^^.顺便说一句:如果你添加`min-width`和`min-height`为'100%`你基本上得到`background-size:cover;`带图像标签的行为 - > [jsfiddle](http://jsfiddle.net/zzur2aqc /) (15认同)
  • 为什么不在顶部/右侧/底部/左侧使用"-100%"?有了它,容器可以有任何**宽度. (14认同)
  • 我必须在父母身上设置一个固定的高度才能使其工作. (11认同)
  • 精彩:这适用于任何元素.即使有html 5视频......谢谢! (4认同)
  • 据我所知:它的工作原理是因为它创建了一个比图像(2*9999px x 2*9999px)更大的元素(希望)并将图像置于该元素内(margin:auto).因此,只要图像不超过2*9999px它就应该有效. (3认同)
  • @HarrisonPowers嗯,父母必须有一个高度,无论是固定的还是动态的.如果某些其他内容填满div导致它具有高度(例如文本),它也将起作用. (2认同)

yun*_*zen 141

这是一个古老的Q,但没有flexbox或者绝对位置的现代解决方案就像这样.

margin-left: 50%;
transform: translateX(-50%);
Run Code Online (Sandbox Code Playgroud)

.outer {
  border: 1px solid green;
  margin: 20px auto;
  width: 20%;
  padding: 10px 0;
  /*   overflow: hidden; */
}

.inner {
  width: 150%;
  background-color: gold;
  /* Set left edge of inner element to 50% of the parent element */
  margin-left: 50%; 
  /* Move to the left by 50% of own width */
  transform: translateX(-50%); 
}
Run Code Online (Sandbox Code Playgroud)
<div class="outer">
  <div class="inner">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos exercitationem error nemo amet cum quia eaque alias nihil, similique laboriosam enim expedita fugit neque earum et esse ad, dolores sapiente sit cumque vero odit! Ullam corrupti iure eum similique magnam voluptatum ipsam. Maxime ad cumque ut atque suscipit enim quidem. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Excepturi impedit esse modi, porro quibusdam voluptate dolores molestias, sit dolorum veritatis laudantium rem, labore et nobis ratione. Ipsum, aliquid totam repellendus non fugiat id magni voluptate, doloribus tenetur illo mollitia. Voluptatum.</div>
</div>
Run Code Online (Sandbox Code Playgroud)

那它为什么有效呢?
乍一看,我们似乎向右移动了50%,然后向左移动了50%.那会导致零班,那么呢?
但是50%不一样,因为背景很重要.如果计算相对边距,则边距计算为父元素的百分比,而在变换中,50%相对于同一元素.两者的宽度.

在添加CSS之前我们有这种情况

       +-------------------------------------------+
       | Parent element P of E                     |
       |                                           |
       +-----------------------------------------------------------+
       | Element E                                                 |
       +-----------------------------------------------------------+
       |                                           |
       +-------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

随着margin-left: 50%我们 增加的风格

       +-------------------------------------------+
       | Parent element P of E                     |
       |                                           |
       |                     +-----------------------------------------------------------+
       |                     | Element E                                                 |
       |                     +-----------------------------------------------------------+
       |                     |                     |
       +---------------------|---------------------+
       |========= a ========>|

       a is 50% width of P
Run Code Online (Sandbox Code Playgroud)

然后transform: translateX(-50%)转移到左边

       +-------------------------------------------+
       | Parent element P of E                     |
       |                                           |
+-----------------------------------------------------------+
| Element E                 |                               |
+-----------------------------------------------------------+
|<============ b ===========|                      |
       |                    |                      |
       +--------------------|----------------------+
       |========= a =======>|

       a is 50% width of P
       b is 50% width of E
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仅适用于水平居中,因为边际百分比计算始终相对于宽度.即不仅margin-leftmargin-right,而且还margin-topmargin-bottom相对于宽度被计算.

浏览器兼容性应该没问题:https: //caniuse.com/#feat=transforms2d

  • 这是纯粹的巫师魔法。谢谢!在 Safari 和 Chrome 中完美运行(添加了 `-webkit-transform: translateX(-50%);` 作为很好的衡量标准) (3认同)
  • 这是迄今为止最优雅的解决方案 (2认同)

Guf*_*ffa 22

在div中放置一个大div,将div放在中心,并将图像放在div中.

这使它水平居中:

HTML:

<div class="imageContainer">
  <div class="imageCenterer">
    <img src="http://placekitten.com/200/200" />
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.imageContainer {
  width: 100px;
  height: 100px;
  overflow: hidden;
  position: relative;
}
.imageCenterer {
  width: 1000px;
  position: absolute;
  left: 50%;
  top: 0;
  margin-left: -500px;
}
.imageCenterer img {
  display: block;
  margin: 0 auto;
}
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/Guffa/L9BnL/

为了使它垂直居中,你也可以使用相同的内部div,但是你需要将图像的高度放在它内部.


Eze*_*wei 7

游戏晚了,但是我发现这种方法非常直观。 https://codepen.io/adamchenwei/pen/BRNxJr

的CSS

.imageContainer {
  border: 1px black solid;

  width: 450px;
  height: 200px;
  overflow: hidden;
}
.imageHolder {
  border: 1px red dotted;

  height: 100%;
  display:flex;
  align-items: center;
}
.imageItself {
  height: auto;
  width: 100%;
  align-self: center;

}
Run Code Online (Sandbox Code Playgroud)

的HTML

<div class="imageContainer">
  <div class="imageHolder">
    <img class="imageItself" src="http://www.fiorieconfetti.com/sites/default/files/styles/product_thumbnail__300x360_/public/fiore_viola%20-%202.jpg" />
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 真好!也可以简化。技巧是通过父容器上的“ display:flex”和图像上的“ align-self:center”来完成的。这是一个优化的版本:https://codepen.io/anon/pen/dWKyey (3认同)

小智 7

这很简单,只需将一些 Flex 和 Overflow 设置为隐藏即可。

在此输入图像描述

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        div {
            height: 150px;
            width: 150px;
            border: 2px solid red;
        
            overflow: hidden;
            display: flex;
            align-items: center;
            justify-content: center;
        }
    </style>
</head>
<body>
    <div>
        <img src="sun.jpg" alt="">
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)


小智 5

我非常喜欢将图像作为 div/node 的背景——那么background-position: center无论屏幕大小如何,您都可以使用该属性将其居中

  • 这不是使用图像的可访问方式。它可能适用于装饰图像,但任何提供信息的图像都需要替换文字。 (11认同)

小智 5

不要对图像标记使用固定的或明确的宽度或高度.相反,编码:

      max-width:100%;
      max-height:100%;
Run Code Online (Sandbox Code Playgroud)

例如:http://jsfiddle.net/xwrvxser/1/