Вертикальное выравнивание изображения внутри 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 ответов:
вот способ выравнивания встроенных элементов внутри родитель, горизонтально и вертикально одновременно:
Вертикальное Выравнивание
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 */ }
выход
Отзывчивый Контейнер
этот раздел не будет отвечать на вопрос, поскольку 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
и абсолютное позиционирование. Также:
- можно отбросить дополнительную разметку с помощью псевдо-элементов.
- можно отобразить среднюю часть больших изображений с помощью отрицательных значений слева, сверху, справа и снизу.
.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>
попробуйте это
.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% для "отзывчивого контейнера" вы можете дать высоту, которую вы хотите.,