Вертикально выравнивать изображение внутри 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 внутри контейнера? Все мои изображения имеют переменную высоту, и контейнер не может иметь фиксированную высоту/высоту линии, потому что он реагирует... Пожалуйста, помогите!
Ответы
Ответ 1
Ниже приведена методика выравнивания встроенных элементов внутри родительского, горизонтально и вертикально в одно и то же время:
Вертикальное выравнивание
1). В этом подходе мы создаем элемент inline-block
(псевдо) в качестве первого (или последнего) дочернего элемента родителя и устанавливаем его свойство height
на 100%
чтобы взять всю высоту своего родителя.
2) Кроме того, добавление vertical-align: middle
поддерживает встроенные (-block) элементы в середине пространства строк. Таким образом, мы добавляем объявление CSS к первому ребенку и нашему элементу (изображению).
3) Наконец, чтобы удалить символ пробела между встроенными (-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 */
}
Выход
![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
для достижения того же результата. Но note, что в этом случае процентное значение на 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, используя свойства 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 */
}
Вот ОБНОВЛЕНО ДЕМО.
Ответ 2
С flexbox это легко:
FIDDLE
Просто добавьте в контейнер изображений следующее:
.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 */
}
Ответ 3
Используйте этот 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
Ответ 4
Вы можете центрировать изображение как по горизонтали, так и по вертикали, используя margin: auto
и абсолютное позиционирование. Также:
- Можно выделить дополнительную разметку с помощью псевдоэлементов.
- Можно отобразить среднюю часть изображений 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 <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>
Ответ 5
Попробуйте этот
.responsive-container{
display:table;
}
.img-container{
display:table-cell;
vertical-align: middle;
}
Ответ 6
Я нашел этот поток в поисках решения, которое:
- использует 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 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>
Ответ 7
Try
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%;
}
Ответ 8
Здесь есть метод, который позволяет центрировать ЛЮБОЙ контент как по вертикали, так и по горизонтали!
В принципе, вам просто нужны два контейнера и убедитесь, что ваши элементы соответствуют следующим критериям.
Контейнер для выхода:
- должен иметь
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>
Ответ 9
html code
<div class="image-container">
<img src=""/>
</div>
css code
img
{
position: relative;
top: 50%;
transform: translateY(-50%);
}
Ответ 10
Сделайте еще один div и добавьте оба 'dummy' и 'img-container' внутри 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>