Как выровнять блоки по верхней границе?

Блоки с фиксированной высотой с inline-block. Как прижать их к верхней границе контейнера без абсолютного позиционирования?
Отслеживать
задан 14 авг 2017 в 12:47
157 1 1 серебряный знак 8 8 бронзовых знаков
vertical-align: top;
14 авг 2017 в 12:52
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
vertical-align: top; работает если display: table-cell; Можно родителю задать display: flex; align-items: flex-start; , но все зависит от того как у Вас сейчас построена сетка, если ввести flexbox просто так, может все поехать.
Отслеживать
66.5k 6 6 золотых знаков 53 53 серебряных знака 112 112 бронзовых знаков
ответ дан 16 авг 2017 в 14:28
Фомин Даниил Фомин Даниил
52 2 2 бронзовых знака
vertical-align: top; работает И для display: inline-block;
16 авг 2017 в 14:37
- html
- css
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Центрирование горизонтальное и вертикальное
В CSS есть всего несколько техник центрирования элементов. Если их знать, то большинство задач решаются просто.
Горизонтальное
text-align
Для центрирования инлайновых элементов – достаточно поставить родителю text-align: center :
.outerДля центрирования блока это уже не подойдёт, свойство просто не подействует. Например:
.outer < text-align: center; border: 1px solid blue; >.innermargin: auto
Блок по горизонтали центрируется margin: auto :
.outer < border: 1px solid blue; >.innerВ отличие от width/height , значение auto для margin само не появляется. Обычно margin равно конкретной величине для элемента, например 0 для DIV . Нужно поставить его явно.
Значение margin-left:auto/margin-right:auto заставляет браузер выделять под margin всё доступное сбоку пространство. А если и то и другое auto , то слева и справа будет одинаковый отступ, таким образом элемент окажется в середине. Детали вычислений описаны в разделе спецификации Calculating widths and margins.
Вертикальное
Для горизонтального центрирования всё просто. Вертикальное же изначально не было предусмотрено в спецификации CSS и по сей день вызывает ряд проблем.
Есть три основных решения.
position:absolute + margin
Центрируемый элемент позиционируем абсолютно и опускаем до середины по вертикали при помощи top:50% :
.outer < position: relative; height: 5em; border: 1px solid blue; >.innerЭто, конечно, не совсем центр. По центру находится верхняя граница. Нужно ещё приподнять элемент на половину своей высоты.
Высота центрируемого элемента должна быть известна. Родитель может иметь любую высоту.
Если мы знаем, что это ровно одна строка, то её высота равна line-height .
Приподнимем элемент на пол-высоты при помощи margin-top :
.outer < position: relative; height: 5em; border: 1px solid blue; >.inner Почему -0.625em ?При стандартных настройках браузера высота строки line-height: 1.25 , если поделить на два 1.25em / 2 = 0.625em .
Конечно, высота может быть и другой, главное чтобы мы её знали заранее.
Можно аналогично центрировать и по горизонтали, если известен горизонтальный размер, при помощи left:50% и отрицательного margin-left .
Одна строка: line-height
Вертикально отцентрировать одну строку в элементе с известной высотой height можно, указав эту высоту в свойстве line-height :
.outerТекстЭто работает, но лишь до тех пор, пока строка одна, а если содержимое вдруг переносится на другую строку, то начинает выглядеть довольно уродливо.
Таблица с vertical-align
У свойства vertical-align, которое управляет вертикальным расположением элемента, есть два режима работы.
В таблицах свойство vertical-align указывает расположение содержимого ячейки.
Его возможные значения:
baseline Значение по умолчанию. middle , top , bottom Располагать содержимое посередине, вверху, внизу ячейки.
Например, ниже есть таблица со всеми 3-мя значениями:
table < border-collapse: collapse; >td
top middle bottom Обратим внимание, что в ячейке с vertical-align: middle содержимое находится по центру. Таким образом, можно обернуть нужный элемент в таблицу размера width:100%;height:100% с одной ячейкой, у которой указать vertical-align:middle , и он будет отцентрирован.
Но мы рассмотрим более красивый способ, который поддерживается во всех современных браузерах, и в IE8+. В них не обязательно делать таблицу, так как доступно значение display:table-cell . Для элемента с таким display используются те же алгоритмы вычисления ширины и центрирования, что и в TD . И, в том числе, работает vertical-align :
Этот способ замечателен тем, что он не требует знания высоты элементов.
Однако у него есть особенность. Вместе с vertical-align родительский блок получает табличный алгоритм вычисления ширины и начинает подстраиваться под содержимое. Это не всегда желательно.
Чтобы его растянуть, нужно указать width явно, например: 300px :
Можно и в процентах, но в примере выше они не сработают, потому что структура таблицы «сломана» – ячейка есть, а собственно таблицы-то нет.
Это можно починить, завернув «псевдоячейку» в элемент с display:table , которому и поставим ширину:
Если дополнительно нужно горизонтальное центрирование – оно обеспечивается другими средствами, например margin: 0 auto для блочных элементов или text-align:center на родителе – для других.
Центрирование в строке с vertical-align
Для инлайновых элементов ( display:inline/inline-block ), включая картинки, свойство vertical-align центрирует сам инлайн-элемент в окружающем его тексте.
В этом случае набор значений несколько другой:
Это можно использовать и для центрирования, если высота родителя известна, а центрируемого элемента – нет.
Допустим, высота внешнего элемента 120px . Укажем её в свойстве line-height :
Работает во всех браузерах и IE8+.
Свойство line-height наследуется, поэтому надо знать «правильную» высоту строки и переопределять её для inner .
Центрирование с vertical-align без таблиц
Если центрирование должно работать для любой высоты родителя и центрируемого элемента, то обычно используют таблицы или display:table-cell с vertical-align .
Если центрируются не-блочные элементы, например inline или inline-block , то vertical-align может решить задачу без всяких таблиц. Правда, понадобится вспомогательный элемент (можно через :before ).
.before < display: inline-block; height: 100%; vertical-align: middle; >.innerЦентрированный
Элемент
- Перед центрируемым элементом помещается вспомогательный инлайн-блок before , занимающий всю возможную высоту.
- Центрируемый блок выровнен по его середине.
Для всех современных браузеров и IE8 можно добавить вспомогательный элемент через :before :
.outer:before < content: ''; display: inline-block; height: 100%; vertical-align: middle; >.inner < display: inline-block; vertical-align: middle; >/* добавим горизонтальное центрирование */ .outer Центрированный
Элемент
В пример выше добавлено также горизонтальное центрирование text-align: center . Но вы можете видеть, что на самом деле внутренний элемент не центрирован горизонтально, он немного сдвинут вправо.
Это происходит потому, что центрируется весь текст, а перед inner находится пробел, который занимает место.
- Убрать лишний пробел между div и началом inner , будет .
- Оставить пробел, но сделать отрицательный margin-left у inner , равный размеру пробела, чтобы inner сместился левее.
.outer:before < content: ''; display: inline-block; height: 100%; vertical-align: middle; >.inner < display: inline-block; vertical-align: middle; margin-left: -0.35em; >.outer Центрированный
Элемент
Центрирование с использованием модели flexbox
Данный метод поддерживается всеми современными браузерами.
Центрированный
Элемент
- Не требуется знания высоты центрируемого элемента.
- CSS чистый, короткий и не требует дополнительных элементов.
- Не поддерживается IE9-, IE10 поддерживает предыдущую версию flexbox.
Итого
Обобщим решения, которые обсуждались в этой статье.
Для горизонтального центрирования:
- text-align: center – центрирует инлайн-элементы в блоке.
- margin: 0 auto – центрирует блок внутри родителя. У блока должна быть указана ширина.
Для вертикального центрирования одного блока внутри другого:
Если размер центрируемого элемента известен, а родителя – нет
Родителю position:relative , потомку position:absolute; top:50% и margin-top:- . Аналогично можно отцентрировать и по горизонтали.
Если нужно отцентрировать одну строку в блоке, высота которого известна
Поставить блоку line-height: . Нужны конкретные единицы высоты ( px , em …). Значение line-height:100% не будет работать, т.к. проценты берутся не от высоты блока, а от текущей line-height .
Высота родителя известна, а центрируемого элемента – нет.
Поставить line-height родителю во всю его высоту, а потомку поставить display:inline-block .
Высота обоих элементов неизвестна.
- Сделать элемент-родитель ячейкой таблицы при помощи display:table-cell (IE8) или реальной таблицы, и поставить ему vertical-align:middle . Отлично работает, но мы имеем дело с таблицей вместо обычного блока.
- Решение со вспомогательным элементом outer:before и инлайн-блоками. Вполне универсально и не создаёт таблицу.
- Решение с использованием flexbox.
Как выровнять элементы inline-block по верхней границе контейнера
Многие разработчики сталкиваются с проблемой выравнивания элементов inline-block. Проблема в том, что когда высота нескольких div отличается, div с наименьшей высотой не выравнивается по верхней границе контейнера. Мы покажем решение этой проблемы с помощью CSS свойств.
1. Создайте HTML
- Создайте с классом "container".
- Создайте два других span внутри "container". Первый div имеет название "small-box", а второй называется "big-box".
div span >span> span >span> div>
2. Создайте CSS
- Задайте height и width для классов.
- Добавьте color, width и style к border.
- Задайте background для блоков и установите display в значение inline-block, которое отображает элемент в виде блока с внутренней стороны, а с внешней стороны он отображается как строчный элемент.
.container < border: 1px solid #666666; width: 350px; height: 150px; > .small-box< display: inline-block; width: 40%; height: 30%; border: 1px solid #666666; background: #1c87c9; > .big-box < display: inline-block; border: 1px solid #666666; width: 40%; height: 50%; background: #8ebf42; >
Пример
html> html> head> title>Заголовок документа title> style> .container < border: 1px solid #666666; width: 350px; height: 150px; > .small-box< display: inline-block; width: 40%; height: 30%; border: 1px solid #666666; background: #1c87c9; > .big-box < display: inline-block; border: 1px solid #666666; width: 40%; height: 50%; background: #8ebf42; > style> head> body> div class="container"> span class="small-box"> span> span class="big-box"> span> div> body> html>
Нашей проблемой является выравнивание .small-box по верхней границе контейнера.
Ключевое слово "top" свойства vertical-align поможет нам в этом вопросе.
Свойство vertical-align указывает вертикальное выравнивание строчного элемента. Значение "top" выравнивает верхний край элемента с верхней линией блока.
Необходимо применить его к .small-box только для того, чтобы он начинался сверху контейнера:
.small-box< vertical-align: top; >
Теперь наша проблема решена с помощью использования только одного CSS свойства. Давайте посмотрим код полностью.
Пример
html> html> head> title>Заголовок документа title> style> .container < border: 1px solid #666666; width: 350px; height: 150px; > .small-box< display: inline-block; width: 40%; height: 30%; border: 1px solid #666666; background: #1c87c9; vertical-align:top; > .big-box < display: inline-block; border: 1px solid #666666; width: 40%; height: 50%; background: #8ebf42; > style> head> body> div class="container"> span class="small-box"> span> span class="big-box"> span> div> body> html>
Рассмотрим пример, где высота одного из элементов div больше, чем высота остальных элементов .
Пример, где произошла ошибка:
Пример
html> html> head> title>Заголовок документа title> style> #box-one < background-color: #1c87c9; > #box-two < background-color:#8ebf42; > #box-three < background-color: #cccccc; > #box-four < background-color: #666666; > .normal < height:100px; width:100px; display:inline-block; > .big < height:200px; width:200px; display:inline-block; > ul < display:block; > ul li< display:inline; > style> head> body> ul> li> span id="box-one" class="normal">Blue span> li> li> span id="box-two" class="normal">Green span> li> li> span id="box-three" class="normal">Grey span> li> li> span id="box-four" class="big"> Как выровнять верхние границы всех цветных div. span> li> ul> body> html>
Нам просто необходимо заменить свойство display на свойство float со значением "left". Мы используем свойство float , которое в большинстве случаев используется вместе со свойством clear. Оно указывает, с каких сторон могут находиться плавающие элементы. В этом примере мы установили clear в "both". Это означает, что плавающие элементы запрещены с правой и левой стороны.
Пример
html> html> head> title>Заголовок документа title> style> #box-one < background-color: #1c87c9; > #box-two < background-color:#8ebf42; > #box-three < background-color: #cccccc; > #box-four < background-color: #666666; > .normal < height:100px; width:100px; display:inline-block; > .big < height:200px; width:200px; display:inline-block; > ul < display:block; clear:both; content:""; display: table; > ul li< float:left; list-style-type:none; > style> head> body> ul> li> span id="box-one" class="normal">Blue span> li> li> span id="box-two" class="normal">Green span> li> li> span id="box-three" class="normal">Grey span> li> li> span id="box-four" class="big"> Как выровнять верхние границы всех цветных div. span> li> ul> body> html>
В следующем примере можно увидеть выравнивание элементов уровня inline-block, используя ключевое слово "flex" свойства display, которое используется с расширением -Webkit-.
Пример
html> html> head> title>Заголовок документа title> style> div< color:#ffffff; display:flex; display: -webkit-flex; align-items:flex-start; -webkit-align-items:flex-start; > #box-one < background-color: #1c87c9; > #box-two < background-color:#8ebf42; > #box-three < background-color: #cccccc; > #box-four < background-color: #666666; > .normal < height:100px; width:100px; display:inline-block; > .big < height:200px; width:200px; display:inline-block; padding:10px; > style> head> body> div> span id="box-one" class="normal">Blue span> strong id="box-two" class="normal">Green strong> span id="box-three" class="normal">Grey span> span id="box-four" class="big"> Как выровнять верхние границы всех цветных div. span> div> body> html>
vertical - align
Выравниваем элемент по вертикали без флексов и гридов.
Время чтения: меньше 5 мин
Открыть/закрыть навигацию по статье
Контрибьюторы:
Обновлено 10 июля 2023
Кратко
Скопировать ссылку "Кратко" Скопировано
Свойство vertical - align выравнивает текстовые элементы по вертикали относительно друг друга.
Для простого текста это не особо актуально, то вот для строчно-блочных ( inline - block ) элементов это свойство может быть очень полезным.
Пример
Скопировать ссылку "Пример" Скопировано
Пусть у нас на странице есть три строчно-блочных элемента. Для объяснения работы свойства vertical - align они будут разной высоты:
div class="parent"> div class="element small">div> div class="element medium">div> div class="element big">div> div>
.element display: inline-block; width: 50px; height: 50px; background-color: white;> .medium height: 100px;> .big height: 150px;>.element display: inline-block; width: 50px; height: 50px; background-color: white; > .medium height: 100px; > .big height: 150px; >

-
text - top — верхняя часть элемента выравнивается по верхнему краю родителя:

Помимо ключевых слов можно использовать числовые значения.
Если указать значение в любых доступных единицах измерения, то положительное значение сдвинет элемент вверх относительно базовой линии, а отрицательно — вниз.
Если указать числовое значение в процентах, то за 0% берётся нижняя граница текста без выносных элементов. То есть аналогично baseline . Процент рассчитывается от line - height родительского элемента.
Подсказки
Скопировать ссылку "Подсказки" Скопировано
Свойство vertical - align применяется к элементам, которые нужно выровнять, а не к родительскому элементу.
На всякий случай: вертикально — это сверху вниз. Слева направо — это горизонтально
Свойство очень пригождается когда нужно выровнять картинку или эмодзи относительно текста.
На практике
Скопировать ссылку "На практике" Скопировано
Алёна Батицкая советует
Скопировать ссылку "Алёна Батицкая советует" Скопировано
Свойство vertical - align каверзное. Многие начинающие разработчики пытаются применить его к родительскому элементу, по аналогии с text - align . И ничего не выходит. Просто запомни, что его нужно применять к тому элементу, который хочется выровнять.
С появлением флексбоксов выравнивание по вертикали производится при помощи align - items . Поэтому на свойство vertical - align стоит обратить внимание, только если работаешь с вёрсткой на строчно-блочных элементах.