将div内的图像与响应高度垂直对齐


135

我有以下代码,用于设置一个容器,该容器的高度在调整浏览器大小(以保持正方形长宽比)时随宽度而变化。

的HTML

<div class="responsive-container">
    <div class="dummy"></div>
    <div class="img-container">
        <IMG HERE>
    </div>
</div>

的CSS

.responsive-container {
    position: relative;
    width: 100%;
    border: 1px solid black;
}

.dummy {
    padding-top: 100%; /* forces 1:1 aspect ratio */
}

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

如何在容器内垂直对齐IMG?我所有的图像都有可变的高度,并且容器不能具有固定的高度/线条高度,因为它反应灵敏...请帮助!


1
这是一个简单的flexbox解决方案:stackoverflow.com/a/31977476/3597276
Michael Benjamin

Answers:


381

这是一种在水平方向和垂直方向上同时对齐元素内的内联元素的技术:

垂直对齐

1)在这种方法中,我们创建inline-block(伪)元素作为父对象的第一个(或最后一个)子代,并将其height属性设置100%为采用其父对象的所有高度。

2)此外,添加vertical-align: middle会将inline(-block)元素保留在行空间的中间。因此,我们将该CSS声明添加到第一个孩子我们的元素image)中。

3)最后,为了删除inline(-block)元素之间的空白字符,我们可以将字体的字体大小设置为零font-size: 0;

注意:以下我使用了Nicolas Gallagher的图像替换技术

有什么好处?

  • 容器(容器)可以具有动态尺寸。
  • 无需明确指定图像元素的尺寸。

  • 我们也可以轻松地使用这种方法<div>元素垂直对齐。可能具有动态内容(高度和/或宽度)。但请注意,您必须重新设置的font-size属性div才能显示内部文本。在线演示

<div class="container">
    <div id="element"> ... </div>
</div>
.container {
    height: 300px;
    text-align: center;  /* align the inline(-block) elements horizontally */
    font: 0/0 a;         /* remove the gap between inline(-block) elements */
}

.container:before {    /* create a full-height inline block pseudo=element */
    content: ' ';
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    height: 100%;
}

#element {
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    font: 16px/1 Arial sans-serif;        /* <-- reset the font property */
}

输出

在容器中垂直对齐元素

响应式容器

本部分将不会回答该问题,因为OP已经知道如何创建响应式容器。但是,我将解释它是如何工作的。

为了使容器元素的高度随其宽度(考虑长宽比)而变化,我们可以为顶部/底部padding属性使用百分比值。

顶部/底部填充或边距上的百分比值是相对于包含块的宽度。

例如:

.responsive-container {
  width: 60%;

  padding-top: 60%;    /* 1:1 Height is the same as the width */
  padding-top: 100%;   /* width:height = 60:100 or 3:5        */
  padding-top: 45%;    /* = 60% * 3/4 , width:height =  4:3   */
  padding-top: 33.75%; /* = 60% * 9/16, width:height = 16:9   */
}

这是在线演示。注释掉底部的线条,并调整面板大小以查看效果。

另外,我们可以将该padding属性应用于虚拟子元素或:before/ :after伪元素以实现相同的结果。但请注意,在这种情况下,百分比值on padding是相对于其自身宽度.responsive-container

<div class="responsive-container">
  <div class="dummy"></div>
</div>
.responsive-container { width: 60%; }

.responsive-container .dummy {
  padding-top: 100%;    /*  1:1 square */
  padding-top: 75%;     /*  w:h =  4:3 */
  padding-top: 56.25%;  /*  w:h = 16:9 */
}

演示#1
演示2 (使用:after伪元素)

添加内容

使用padding-top属性容器内部的内容顶部或底部产生巨大的空间

为了解决这个问题,就需要通过一个包装元件包的内容,通过利用来自原稿正常流中删除该元素绝对定位,最后展开的包装(BU使用toprightbottomleft属性)来填充它的父的整个空间,该容器

开始了:

.responsive-container {
  width: 60%;
  position: relative;
}

.responsive-container .wrapper {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
}

这是在线演示


聚在一起

<div class="responsive-container">
  <div class="dummy"></div>

  <div class="img-container">
    <img src="http://placehold.it/150x150" alt="">
  </div>
</div>
.img-container {
  text-align:center; /* Align center inline elements */
  font: 0/0 a;       /* Hide the characters like spaces */
}

.img-container:before {
  content: ' ';
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

.img-container img {
  vertical-align: middle;
  display: inline-block;
}

这是工作示例

显然,您可以避免使用::before伪元素来实现浏览器兼容性,并创建一个元素作为的第一个子元素.img-container

<div class="img-container">
    <div class="centerer"></div>
    <img src="http://placehold.it/150x150" alt="">
</div>
.img-container .centerer {
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

更新的演示

使用max-*属性

为了使图片在框内保持较低的宽度,您可以设置 max-heightmax-width在图像上和属性:

.img-container img {
    vertical-align: middle;
    display: inline-block;
    max-height: 100%;  /* <-- Set maximum height to 100% of its parent */
    max-width: 100%;   /* <-- Set maximum width to 100% of its parent */
}

这是UPDATED DEMO


1
您好,Hashem谢谢您的回答-对于桌面浏览器,即使重新调整为较小的宽度,这也像魔术一样起作用。但是很遗憾,这些图片在移动设备(Android v2.3.5)上位于容器div下方的位置不正确。对此有任何解决办法吗?
2013年

3
@ user1794295我通过browserstack.com在具有android v2.3(Galaxy S II,Galaxy Note,摩托罗拉Droid 4)的三个android设备上测试了这个小提琴,一切正常,您可以在这里找到结果:browserstack.com/screenshots /…。请提供您的问题的屏幕截图或进行特定测试。我会尽可能的帮助。
Hashem Qolami

1
您好,这里是一些屏幕截图:browserstack.com/screenshots / ...-您可以在较小的设备(例如Xperia,LG Nexus 4)上看到图像出现在容器下方...这是怎么回事?
user1794295

3
@HashemQolami这是最令人惊奇的CSS东西,因为我已经开始构建网站:)。
亚历山大·索洛尼克

1
谢谢font-size: 0;
约翰内斯·利伯曼

47

使用flexbox,这很容易:

小提琴

只需将以下内容添加到图像容器:

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex; /* add */
    justify-content: center; /* add to align horizontal */
    align-items: center; /* add to align vertical */
}

2
在我看来,此解决方案有效并且更加优雅。CSS3 Flex很棒!
Daniel Bonnell

2
它在Safari中不起作用:(我想问题是弹性的
yennefer

1
@yennefer for Safari使用-webkit-前缀,或尝试使用像prefixfree.js这样的库:)
QUB3X

当容器的高度响应(以百分比为单位)时,此功能不起作用。
jenlampton

1
完美的解决方案!
Nirus

16

使用此CSS,因为您已经有了它的标记:

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
}

.img-container > img {
  margin-top:-50%;
  margin-left:-50%;  
}

这是一个工作的JsBin: http

此解决方案仅适用于正方形图像(因为上边距百分比值取决于容器的宽度,而不取决于容器的高度)。对于随机大小的图像,可以执行以下操作:

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%); /* add browser-prefixes */
}

有效的JsBin解决方案:http ://jsbin.com/ihilUnI/2/edit


抱歉,对我不起作用-这只是将图像尺寸减小到容器宽度的一半。
2013年

2
我看不到我提到的CSS怎么发生。请提供一个可以看到的工作示例,以便我改善答案。PS:我还提供了另一种解决方案:)
Tibos

11

您可以使用margin: auto绝对定位使图像水平和垂直居中。也:

  1. 通过使用伪元素可以放弃额外的标记。
  2. 通过使用负的左,上,右和下值可以显示大图像的中间部分。

.responsive-container {
  margin: 1em auto;
  min-width: 200px;       /* cap container min width */
  max-width: 500px;       /* cap container max width */
  position: relative;     
  overflow: hidden;       /* crop if image is larger than container */
  background-color: #CCC; 
}
.responsive-container:before {
  content: "";            /* using pseudo element for 1:1 ratio */
  display: block;
  padding-top: 100%;
}
.responsive-container img {
  position: absolute;
  top: -999px;            /* use sufficiently large number */
  bottom: -999px;
  left: -999px;
  right: -999px;
  margin: auto;           /* center horizontally and vertically */
}
<p>Note: images are center-cropped on &lt;400px screen width.
  <br>Open full page demo and resize browser.</p>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/400/sports/9/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/200/sports/8/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/400/sports/7/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/200/sports/6/">
</div>


谢谢!您的.sensitive-container img css是唯一对我有用的。
Diogo Garcia

4

试试这个

  .responsive-container{
          display:table;
  }
  .img-container{
          display:table-cell;
          vertical-align: middle;
   }

抱歉,这行不通,我想因为我.img-container的位置绝对正确-这对于保持方形长宽比/动态高度是必要的。
2013年

2

这是一种允许您将任何内容垂直和水平居中放置的技术!

基本上,您只需要两个容器并确保您的元素满足以下条件。

外部容器:

  • 应该有 display: table;

内部容器:

  • 应该有 display: table-cell;
  • 应该有 vertical-align: middle;
  • 应该有 text-align: center;

内容框:

  • 应该有 display: inline-block;

如果您使用此技术,只需将图像(以及您要使用的其他任何内容)添加到内容框中。

演示:

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    background: #fff;
    padding : 12px;
    border : 1px solid #000;
}

img {
   max-width : 120px;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        <img src="https://i.stack.imgur.com/mRsBv.png" />
     </div>
   </div>
</div>

另请参阅此小提琴


2

我遇到了这个线程,以寻找一种解决方案:

  • 使用给定图像宽度的100%
  • 保持图像宽高比
  • 使图像与中间垂直对齐
  • 在不完全支持flex的浏览器中工作

测试上面发布的一些解决方案时,我发现没有一个可以满足所有这些标准,因此我整理了一个简单的解决方案,这可能对需要这样做的其他人很有用:

.container {
  width: 30%;
  float: left;
  border: 1px solid turquoise;
  margin-right: 3px;
  margin-top: 3px;
}

.container:last-of-kind {
  margin-right: 0px;
}

.image-container {
  position: relative;
  overflow: hidden;
  padding-bottom: 70%;
  /* this is the desired aspect ratio */
  width: 100%;
}

.image-container img {
  position: absolute;
  /* the following 3 properties center the image on the vertical axis */
  top: 0;
  bottom: 0;
  margin: auto;
  /* uses image at 100% width (also meaning it's horizontally center) */
  width: 100%;
}
<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

JSFiddle上的工作示例


0

尝试

HTML

<div class="responsive-container">
     <div class="img-container">
         <IMG HERE>
     </div>
</div>

的CSS

.img-container {
    position: absolute;
    top: 0;
    left: 0;
height:0;
padding-bottom:100%;
}
.img-container img {
width:100%;
}

0

HTML代码

<div class="image-container"> <img src=""/> </div>

CSS代码

img
{
  position: relative;
  top: 50%;
  transform: translateY(-50%);
 }

尽管此代码段是受欢迎的,并且可以提供一些帮助,但是如果它包含有关如何解决该问题的说明,则将大大改善。否则,您的答案的教育价值将大大降低-请记住,您将来会为读者回答问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。
Toby Speight

0

进行另一个div并在div中添加“ dummy”和“ img-container”

做如下的HTML和CSS

html , body {height:100%;}
.responsive-container { height:100%; display:table; text-align:center; width:100%;}
.inner-container {display:table-cell; vertical-align:middle;}
<div class="responsive-container">
    <div class="inner-container">
		<div class="dummy">Sample</div>
		<div class="img-container">
			Image tag
		</div>
	</div>	
</div>

您可以指定所需的高度,而不是100%的“响应容器”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.