138

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

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?我所有的图像都有可变的高度,容器不能有固定的高度/行高,因为它是响应式的......请帮忙!

4

10 回答 10

385

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

垂直对齐

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

2)此外,添加vertical-align: middle将内联(-block)元素保持在行空间的中间。因此,我们将 CSS 声明添加到first-child我们的元素图像)中。

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

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

有什么好处?

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

  • 我们也可以轻松地使用这种方法来垂直对齐<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变化(考虑纵横比),我们可以为 top/bottom属性使用百分比值。

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

例如:

.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伪元素以实现相同的结果。但请注意,在这种情况下,百分比值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
Demo #2 (使用:after伪元素)

添加内容

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

为了解决这个问题,我们用包装元素包装内容,使用绝对定位从文档正常流程中删除该元素,最后扩展包装(使用topright和属性)以填充其父级的整个空间,容器。_bottomleft

开始了:

.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 */
}

这是更新的演示

于 2013-08-29T16:37:10.667 回答
49

使用 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 */
}
于 2014-08-18T12:59:23.533 回答
16

使用这个 css,因为你已经有了它的标记:

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

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

这是一个有效的 JsBin:http: //jsbin.com/ihilUnI/1/edit

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

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

工作 JsBin 解决方案:http: //jsbin.com/ihilUnI/2/edit

于 2013-08-29T16:37:33.763 回答
11

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

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

.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>

于 2014-05-20T13:25:32.353 回答
4

试试这个

  .responsive-container{
          display:table;
  }
  .img-container{
          display:table-cell;
          vertical-align: middle;
   }
于 2013-08-29T16:35:13.803 回答
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>

另见这个小提琴

于 2016-01-21T02:24:54.507 回答
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上的工作示例

于 2017-08-03T09:59:45.250 回答
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%;
}
于 2013-08-29T17:13:23.030 回答
0

html代码

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

CSS代码

img
{
  position: relative;
  top: 50%;
  transform: translateY(-50%);
 }
于 2017-05-04T02:08:23.530 回答
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% 的“响应容器”,

于 2017-06-03T18:29:14.783 回答