Другое

Полное руководство: вертикальное выравнивание элементов в div

Узнайте, как выравнивать смешанный контент в div с помощью CSS. Полное руководство, охватывающие методы inline-block, flexbox и table-cell с кроссбраузерной совместимостью и абсолютным позиционированием.

Как можно вертикально выровнять элементы в div?

У меня есть div, содержащий два изображения и элемент h1. Все эти элементы должны быть вертикально выровнены внутри div и расположены рядом друг с другом. Кроме того, одно из изображений должно быть абсолютно позиционировано внутри div.

Какой CSS-код необходим для достижения такого вертикального выравнивания, которое будет работать во всех распространенных браузерах?

HTML-структура для справки:

html
<div id="header">
  <img src=".."></img>
  <h1>testing...</h1>
  <img src="..."></img>
</div>

Чтобы вертикально выровнять элементы в div с смешанным содержимым (изображениями и текстом), которые работают во всех распространенных браузерах, наиболее надежным подходом является использование display: inline-block в сочетании с vertical-align: middle для встроенных элементов, и абсолютное позиционирование одного изображения с помощью абсолютного позиционирования внутри родительского контейнера с относительным позиционированием.

Содержание


Метод с Inline-Block

Наиболее совместимый со всеми браузерами метод вертикального выравнивания смешанного содержимого использует display: inline-block с vertical-align: middle. Этот подход работает последовательно во всех современных браузерах и даже имеет хорошую поддержку в более старых версиях.

css
#header {
  position: relative; /* Требуется для абсолютного позиционирования */
  height: 100px; /* Установите конкретную высоту */
  text-align: center; /* Опционально: центрирует элементы inline-block */
}

#header > * {
  display: inline-block;
  vertical-align: middle;
}

#header img:first-child {
  /* Это будет выровнено с другими элементами */
}

#header h1 {
  margin: 0; /* Удалите отступ по умолчанию */
  font-size: 24px;
}

#header img:last-child {
  position: absolute;
  right: 20px;
  top: 50%;
  transform: translateY(-50%);
}

Ключевая идея здесь заключается в том, что vertical-align применяется только к встроенным, inline-block и table-cell элементам, а не к блочным элементам, таким как div источник.

Метод с Flexbox

Для современных браузеров с отличной поддержкой CSS3, flexbox предоставляет чистое и мощное решение:

css
#header {
  display: flex;
  align-items: center; /* Вертикальное выравнивание */
  justify-content: center; /* Горизонтальное центрирование */
  position: relative;
  height: 100px;
}

#header img:first-child,
#header h1 {
  margin: 0 10px; /* Добавляет пространство между элементами */
}

#header img:last-child {
  position: absolute;
  right: 20px;
  top: 50%;
  transform: translateY(-50%);
}

Метод с Table-Cell

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

css
#header {
  display: table;
  width: 100%;
  height: 100px;
  position: relative;
}

#header > * {
  display: table-cell;
  vertical-align: middle;
}

#header img:last-child {
  position: absolute;
  right: 20px;
  top: 50%;
  transform: translateY(-50%);
}

Полное решение для вашей HTML-структуры

Вот полное решение, которое отвечает вашим конкретным требованиям с кросс-браузерной совместимостью:

html
<div id="header">
  <img src="logo.png" alt="Логотип">
  <h1>тестирование...</h1>
  <img src="icon.png" alt="Иконка">
</div>
css
#header {
  position: relative;
  height: 80px; /* Установите конкретную высоту */
  background-color: #f5f5f5;
  overflow: hidden; /* Содержит абсолютно позиционированные элементы */
}

/* Выравнивание встроенных элементов по вертикали */
#header > * {
  display: inline-block;
  vertical-align: middle;
  margin: 0;
}

/* Стилизация заголовка */
#header h1 {
  font-size: 24px;
  font-weight: bold;
  color: #333;
  margin: 0 15px;
}

/* Обычное позиционирование первого изображения */
#header img:first-child {
  height: 50px;
}

/* Абсолютное позиционирование второго изображения */
#header img:last-child {
  position: absolute;
  right: 20px;
  top: 50%;
  transform: translateY(-50%);
  height: 40px;
}

Ключевые моменты этого решения:

  1. Выравнивание с inline-block: Использование display: inline-block и vertical-align: middle гарантирует правильное выравнивание всех элементов источник.

  2. Абсолютное позиционирование: Второе изображение позиционируется абсолютно внутри относительного контейнера, затем центрируется с помощью top: 50% и transform: translateY(-50%).

  3. Указание высоты: Родительский div должен иметь определенную высоту для эффективной работы вертикального выравнивания.

  4. Управление отступами: Удаление отступов по умолчанию у заголовка предотвращает проблемы с выравниванием.


Рекомендации по совместимости с браузерами

Метод с Inline-Block

  • Отличная поддержка: Работает в IE8+, Firefox, Chrome, Safari, Opera
  • IE7 и старше: Могут возникнуть проблемы с поддержкой inline-block
  • Мобильные браузеры: Полная поддержка во всех современных мобильных браузерах

Метод с Flexbox

  • Отличная поддержка в современных браузерах: IE11+, Firefox, Chrome, Safari, Opera
  • IE10 и ниже: Частичная поддержка с префиксами
  • Мобильные браузеры: Полная поддержка в iOS Safari 8.1+ и Android Chrome 4.4+

Метод с Table-Cell

  • Отличная поддержка: Работает в IE8+, всех современных браузерах
  • IE7 и старше: Хорошая поддержка
  • Мобильные браузеры: Полная поддержка

Лучшее кросс-браузерное рекомендация: Метод с inline-block обеспечивает наиболее последовательные результаты во всех браузерах, сохраняя простоту источник.


Альтернативные подходы

Метод с Line-Height (для однострочного содержимого)

Если у вас только однострочный текст, вы можете использовать line-height:

css
#header {
  height: 100px;
  line-height: 100px;
  text-align: center;
  position: relative;
}

#header h1 {
  display: inline-block;
  line-height: normal;
  margin: 0;
}

#header img {
  vertical-align: middle;
}

Метод с Grid (только для современных браузеров)

css
#header {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  height: 100px;
  position: relative;
}

#header img:last-child {
  position: absolute;
  right: 20px;
  top: 50%;
  transform: translateY(-50%);
}

Источники

  1. MDN Web Docs - vertical-align property
  2. CSS-Tricks - What is Vertical Align
  3. Stack Overflow - How to vertically align an image inside a div
  4. W3Schools - CSS vertical-align property
  5. LogRocket - CSS vertical alignment: Best practices and examples
  6. FreeCodeCamp - CSS Vertical Align – How to Center a Div, Text, or an Image

Заключение

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

  1. Используйте display: inline-block с vertical-align: middle для всех встроенных элементов
  2. Установите конкретную высоту для родительского контейнера
  3. Позиционируйте одно изображение абсолютно с помощью position: absolute с top: 50% и transform: translateY(-50%)
  4. Нормализуйте отступы у элементов заголовков для предотвращения проблем с выравниванием

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

Авторы
Проверено модерацией
Модерация