Довольно часто от веб-разработчиков можно услышать возмущенный возглас: “vertical-align не работает!”. Несмотря на то, что назначение этого свойства следует из его названия, на практике, начинающие разработчики, равно как и многие ветераны CSS, часто испытывают трудности с его применением.
В сегодняшней статье, я постараюсь раскрыть все непонятные моменты этого CSS-свойства.
Чего не делает vertical-align
Наиболее распространенное заблуждение относительно свойства vertical-align состоит в том, что оно влияет на вертикальное выравнивание всех дочерних элементов контейнера, к которому применяется. Например, если мы применим к контейнеру свойство vertical-align: top, предполагается, что все содержимое контейнера будет выровнено по верхнему краю контейнера.
Это напоминает мне старые, добрые времена табличной верстки:
<td valign="top"> Содержимое ячейки.. </td>
В этом примере табличной ячейки, свойство valign (сейчас уже запрещенное в HTML5), действительно прижмет все содержимое ячейки к верхнему краю. Возможно исходя из этого, CSS-разработчики ожидают похожего эффекта, от применения свойства vertical-align.
Но свойство vertical-align так не работает.
Как на самом деле работает vertical-align
Свойство vertical-align можно разделить на три простых правила:
- Оно применяется только к элементам со свойствами display: inline; и display: inline-block;
- Оно влияет на положение самого элемента, а не его содержимого (за исключением табличных ячеек)
- Когда оно применяется к табличной ячейке, то влияет на содержимое ячейки, а не на саму ячейку.
Другими словами, следующий код не будет иметь никакого эффекта:
div { vertical-align: middle; /* эта строка не будет работать */ }
Почему? Потому что <div> — это блочный элемент. Конечно, если вы измените у дива свойство display, на inline, или inline-block, vertical-align сразу заработает.
Правильное использование свойства vertical-align, поможет выровнять строчный элемент относительно других строчных элементов на странице. Насколько высоко или низко расположится элемент по вертикали, будет зависеть от размера соседних строчных элементов, или от свойства line-height, заданного для этой строки.
На картинке ниже, представлен пример того, как ведут себя строчные элементы, когда вы применяете свойство vertical-align:
Значения свойства – ключевые слова
Свойство vertical-align может принимать следующие значения:
- baseline (значение по умолчанию)
- bottom
- middle
- sub
- super
- text-bottom
- text-top
- top
Большинство из них вам скорее всего не понадобятся, но всегда хорошо знать из чего можно выбрать. Например, на демо-странице, текстовому полю назначено свойство vertical-align: top, благодаря чему, оно выровнено относительно самого высокого элемента в строке (большой картинки).
А если вы не хотите располагать элемент относительно изображений или других строчных элементов, можно использовать значения text-top или text-bottom, чтобы ваш элемент позиционировался относительно текста, расположенного в строке.
О значении “middle”
К сожалению, vertical-align: middle; не расположит строчный элемент по центру самого большого элемента в строке, как этого можно было бы ожидать. Вместо этого, значение middle расположит элемент относительно гипотетической строчной “x” (также называемой “x-высотой”). По-хорошему, это значение следовало бы назвать “text-middle”, для правильной идентификации его механизма.
На этой демо-странице, размер текста специально увеличен, чтобы вы могли посмотреть, как именно выравниваются элементы, при значении middle. По всему выходит, что это значение, вам будет нужно гораздо реже, чем остальные.
Цифровые значения свойства
Возможно вы не знали, но vertical-align в качестве значения может принимать абсолютные и процентные значения, все приведенные ниже примеры будут правильными:
input { vertical-align: 100px; } span { vertical-align: 50%; } img { vertical-align: -300px; }
В чем разница между абсолютными значениями и ключевыми словами, можно почитать в CSS-спецификации, или (что на мой взгляд гораздо полезнее) самостоятельно попробовать различные варианты.
Перевод статьи “Understanding CSS’s vertical-align Property”, автор Louis Lazaris
можно блоку задать свойство display: table-cell
тогда содержимое блока будет выравниваться по правилам vertical-align(middle, top etc)
вот пример от w3c еще от 2001 года http://www.w3.org/Style/Examples/007/center.htm
свойство display: table-cell не поддерживается IE 6 7 и 8 версиями
Спасибо большое за открытую и подробную информацию! Отличный пост!
Полезны уроки, но возник момент — ваш сайт тормозит на i3+3gbRAM ноутбуке. Скроллинг просто выводит из себя. Всё прыгает.
Спс за статьи.
Очень полезная и доступна выложенная информация. Хорошо что Великий Гугл дал мне почитать данную статью. Благодарность автору.
Спасибо большое, очень помогло
Хорошая статья, реально понятно и доступно описано. Мне понравилась и помогла. По больше бы, таких нормальных авторов!!!
Актуальненько, благодарю!