Ось методика вирівнювання вбудованих елементів всередині батьків , горизонтальної та вертикальної одночасно:
Вертикальне вирівнювання
1) У такому підході ми створюємо inline-block
(псевдо-) елемент як першу (або останню) дитину батьків і встановлюємо його height
властивість 100%
приймати всю висоту свого батьківського .
2) Крім того, додавання vertical-align: middle
зберігає вбудовані (-блокові) елементи в середині простору рядка. Отже, ми додаємо, що CSS-декларація для першої дитини та наш елемент ( зображення ) і те, і інше.
3) Нарешті, для того, щоб видалити символ пробілу між вбудованими (-блоковими) елементами, ми могли встановити розмір шрифту батьківського на нуль на font-size: 0;
.
Примітка. Я використав методику заміни зображення Ніколя Галлахера в наступному.
Які переваги?
- Контейнер ( батьківський ) може мати динамічні розміри.
Не потрібно чітко вказувати розміри елемента зображення.
Ми можемо легко використовувати цей підхід для вирівнювання <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 */
}
Вихід
Чуйний контейнер
Цей розділ не збирається відповісти на питання, оскільки ОП вже знає, як створити контейнер, що реагує. Однак я поясню, як це працює.
Для того щоб змінити висоту елемента контейнера з його шириною (з урахуванням співвідношення сторін), ми могли б використовувати значення відсотка для 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
псевдоелементу для досягнення того ж результату. Але до відома , що в цьому випадку процентне значення на 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 */
}
Ось ОНОВЛЕНО ДЕМО .