Вертикальное выравнивание изображения внутри div с адаптивной высотой


у меня есть следующий код, который устанавливает контейнер, который имеет высоту, которая изменяется с шириной при изменении размера браузера (для поддержания квадратного соотношения сторон).

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 внутри контейнера? Все мои изображения имеют переменную высоту, и контейнер не может иметь фиксированную высоту/высоту линии, потому что он реагирует... Пожалуйста, помогите!

10 125

10 ответов:

вот способ выравнивания встроенных элементов внутри родитель, горизонтально и вертикально одновременно:

Вертикальное Выравнивание

1) при таком подходе, мы создаем inline-block (псевдо-)элемент как первый (или последний) дочерний элемент родитель и height свойство 100% взять всю высоту его родитель.

2) кроме того, добавление vertical-align: middle сохраняет встроенные элементы (- block) В середине пространства строк. Итак, мы добавляем это объявление CSS в первый-ребенок и наш элемент (the изображения) и другое.

3) наконец, чтобы удалить символ пробела между inline (- block) элементы, мы могли бы установить размер шрифта родитель времени font-size: 0;.

Примечание: я Николя Галлахера техника замены изображений в следующем.

Какие преимущества?

  • контейнера (родитель) могут иметь динамические размеры.
  • нет необходимости явно указывать размеры элемента изображения.

  • мы можем легко использовать этот подход к выровнять a <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 */
}

выход

Vertically align an element in its container

Отзывчивый Контейнер

этот раздел не будет отвечать на вопрос, поскольку OP уже знает, как создать отзывчивый контейнер. Однако, я объясню, как это работает.

для того, чтобы сделайте высота элемента контейнера изменяется с его ширина (соблюдая соотношение сторон), мы могли бы использовать процентное значение для top / bottom padding собственность.

A процент сверху / снизу заполнение или поля относительно ширины содержащего блока.

например:

.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.
демо #2(через :after псевдо-элемент)

добавлять контент

используя padding-top свойства вызывает огромное пространство в верхней или нижней части содержания, внутри контейнер.

чтобы исправить это, мы должны обернуть содержимое элементом обертки, удалите этот элемент из обычного потока документов с помощью абсолютное позиционирование, и, наконец, разверните обертку (бу с помощью top,right,bottom и left свойства), чтобы заполнить все пространство своего родителя,контейнер.

вот так:

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

здесь ОБНОВЛЕНО ДЕМО.

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

используйте этот 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

это решение работает только для квадратных изображений (потому что процентное значение margin-top зависит от ширины контейнера, а не от высоты). Для изображений произвольного размера вы можете сделать следующее:

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

решение рабочая JsBin: http://jsbin.com/ihilUnI/2/edit

вы можете центрировать изображение, как по горизонтали, так и по вертикали, используя 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>

попробуйте это

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

я наткнулся на эту тему в поисках решения, которое:

  • использует 100% ширины данного изображения
  • сохраняет соотношение сторон изображения
  • сохраняет изображение вертикально выровненным по середине
  • работает в браузерах, которые не полностью поддерживают шлейф

тестирование некоторые из решений, опубликованных выше, я не нашел ни одного, чтобы соответствовать всем этим критериям, поэтому я собрал этот простой, который может быть полезен для других людей, которым нужно сделать то же самое:

.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

попробовать

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%;
}

вот метод, который позволяет центрировать любой контент как по вертикали, так и по горизонтали!

в принципе, вам просто нужно два контейнера и убедитесь, что элементы должны отвечать следующим критериям.

контейнер outher:

  • должно быть display: table;

внутренний контейнер :

  • должно быть display: table-cell;
  • должно быть vertical-align: middle;
  • должны были text-align: center;

поле содержание :

  • должно быть display: inline-block;

если вы используете этот метод, просто добавьте свое изображение (вместе с любым другим контентом, который вы хотите использовать) в поле содержимого.

Demo:

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>

см. также эта скрипка!

HTML-код

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

css код

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

сделайте еще один div и добавьте как "манекен", так и "img-контейнер" внутри div

сделать 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% для "отзывчивого контейнера" вы можете дать высоту, которую вы хотите.,