Основні способи вертикального вирівнювання елементів в CSS

Одна з найпопулярніших проблем, з якими стикаються веб-дизайнери – це вертикальне центрування елементів в CSS і правильне їх відображення на девайсах з різними розмірами екрану. І складність не в тому, що це важко зробити, а в тому, що існує кілька різних способів для цього і всі вони мають право на життя. У цій статті ми розглянемо сім найпопулярніших і, що найголовніше, — робочих методів вертикального вирівнювання елементів за допомогою CSS.

 

 

7 основних способів вертикального центрування в CSS

Для тестування способів будемо використовувати блок div, в який вкладено текстовий елемент p з текстом-рибою:

 

<div class="blok first">
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo fermentum orci, in iaculis mi volutpat in. Vestibulum sit amet cursus odio. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque bibendum malesuada tellus vitae accumsan. Vivamus sed metus efficitur, vehicula mauris in, elementum massa.</p>
</div>

 

Ми надамо блоку div кілька загальних стилів, а потім всі зусилля щодо вирівнювання будемо спрямовувати на текстовий елемент. Насамперед надамо текстовому блокові фонового кольору, щоб візуально позначити розмір блоку, а також обнулимо margin і padding, що дозволить уникнути зайвих непорозумінь при верстці:

 

.blok {
  position: relative;
  background: #fff;
  margin: 25px;
  padding: 25px;
  min-height: 150px;
  font-size: 25px;
  overflow: hidden;
  color: #333;
  box-shadow: 0 5px 3px rgba(0, 0, 0, 0.25), 0 5px 3px rgba(0, 0, 0, 0.10);
  transition: all 0.15s ease;
}
.blok p {
  margin: 0;
  padding: 0;
  background-color: #eee;
}

 

 

Тепер перейдемо безпосередньо до розгляду можливих варіантів вертикального центрування:

 

 

  • 1) Абсолютне позиціонування (position: absolute;)

Найбільш очевидним способом, за допомогою якого можна помістити елемент у потрібне місце, виступає використання абсолютного позиціонування:

 

.first p {
    width: 80%;
    height: 80%;
    vertical-align: middle;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    margin: auto; 
}

 

Цей метод відмінно працює для блокових елементів і картинок, оскільки за допомогою певної висоти, ширини і, завдяки автоматичним відступами, вирівняє їх точно по центру батьківського елемента. Але у текстових елементів цей метод працює не зовсім ідеально: текст завжди буде починатися в верхньому лівому кутку абзацу, тому при різній кількості текстового контенту він не буде розташовуватися точно по центру.

Оскільки текст може мати різні розміри шрифтів, ми не зможемо точно спрогнозувати висоту абзацу у всіх випадках адаптивної верстки, і іноді трапляються випадки занадто вузького блоку з дуже високим розтягнутим текстовим блоком. З цієї причини абсолютне позиціонування не підходить для вертикального центрування всього того, чому не можна привласнити певну висоту і ширину.

 

 

  • 2) Трансформація (transform)

Як і при абсолютному позиціонуванні, для трюка із використанням трансформації також потрібно вказувати висоту його батьківського елемента, щоб браузер зміг обчислити «центральне» розташування. На відміну від абсолютного позиціонування, ця висота може бути динамічним значенням (наприклад, у відсотках або vh).

 

.second {
  height: 150px;
}
.second p {
    position: relative;
    top: 50%;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
}

 

За допомогою relative позиціонування відступ зверху буде 50% від верхньої точки батьківського елемента div, а властивість трансформації translateY також відобразить вміст контенту вертикально на рівні 50% від його висоти. Цей метод відмінно працює для елементів, у яких немає явних вказівок висоти і ширини.

 

 

  • 3) Висота лінії (line-height)

Цей метод є найкращим для тих випадків, коли елемент для вирівнювання має конкретні значення висоти. А сам елемент невеликий (наприклад, кнопки, іконки і т.п.). Для великих текстових блоків цей метод не дуже підходить.

 

.third {
  width: 250px;
  height: 75px;
  line-height: 75px;
  border-radius: 15px;
  margin: 0 auto;
  padding: 0;
  min-height: auto;
  text-align: center;
}

 

Для цього методу важливо використовувати в стилях вказівку такої ж висоти, як і для властивості line-height – це гарантує знаходження точного вертикального центру. Якщо потрібно ще й горизонтальне центрування, тоді не забудьте вказати для елемента text-align: center;.

 

 

  • 4) Відступи (padding)

Якщо батьківський елемент має зазначену висоту, ви завжди можете центрувати його вміст за допомогою однакових відступів.

 

.blok.fourth {
    height: 33vh;
}
.fourth p {
    padding: 16.5vh 8.25vh;
}

 

Оскільки наш батьківський елемент div має висоту 33vh, центральна точка буде 16.5vh (саме тому такий відступ зверху і знизу). Відступи зліва і справа залежать від ширини блоку. Оскільки vh – це адаптивне значення, з його використанням контент буде збільшуватися або зменшуватися при різних розмірах батьківського елемента.

Однак наступний спосіб (використання display: table;) позбавляє нас від ручних обчислень і робить це автоматично.

 

 

  • 5) Таблична властивість (display: table;)

Це дуже простий і ефективний метод центрування контенту. Не плутайте властивість table із тегом <table>!

 

.fifth {
  display: table;
}
.fifth p {
  display: table-cell;
  vertical-align: middle;
}

 

Цей метод відмінно підходить для адаптивної верстки і центрує з середини абзацу, а не з верхнього лівого кута (як у першому методі).

 

 

  • 6) Flexbox (display: flex;)

Властивість CSS display: flex; дає нам найбільш динамічний набір інструментів для верстки, і це найкращий метод при роботі зі складними структурами всередині батьківських елементів. Позиціонує елементи на зразок того, як це робить таблична властивість у попередньому методі.

 

.sixth {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

 

 

  • 7) Комбінування методів

І, нарешті, ще один, бонусний метод! Якщо у вашій верстці використовується досить складна структура з багатьма елементами, тоді, можливо, найкращим способом буде комбінування методів. Наприклад, для елементів верхнього рівня використовувати flexbox, а для елементів нижнього рівня відступи і line-height.

 

 

Нижче представлено демо всіх основних способів вертикального центрування контенту. Спробуйте погратися з різними значеннями властивостей, можливо у вас вийде щось якісно нове.

 

 

 

Який метод краще?

Вибирати вам, у кожному індивідуальному випадку. Кращий метод по простоті і реалізації – це display: table;. А для складних макетів, які вимагають більшої гнучкості – метод flexbox.

Якщо у вас є питання і/або зауваження щодо цієї статті, залишайте їх у формі коментування нижче.
 
почитати по темі: Основні трюки CSS стилів для вебмайстрів початківців

 

This post was last modified on 30/07/2017 18:23

Останні пости

Генрі Форд

Людина має два мотиви поведінки — один справжній та інший, що гарно звучить Генрі Форд…

16/07/2024

Фрідріх Ніцше

Не треба додумувати надто багато. Так ви створюєте проблеми, яких не існувало Фрідріх Ніцше  

11/07/2024

Такий різний інвертор! Вибираємо між кондиціонерами Inverter, Inverter DC та Full DC

Літо в розпалі, а значить якраз час задуматися про покупку кондиціонера. Але як не загубитися…

06/07/2024

Омар Хайям

Справжній друг — це людина, яка в очі викаже тобі все, що про тебе думає,…

30/06/2024

Корисні поради щодо вибору розсувних дверей

Варто знати, що функціональність і дизайн працюють рука об руку, коли ви використовуєте розсувні двері.…

29/06/2024

Геракліт

Єдине, що постійне, — це зміни. Немає нічого постійного окрім змін. Усе плине, усе змінюється.…

23/06/2024