Вертикальное выравнивание текста внутри блока

Вертикальное выравнивание текста внутри ячейки таблицы всегда просто. Достаточно использовать vertical-align: middle, вот и все дела. Но как вы знаете, эта фишка не работает в блочной верстке.

Что же делать?

Допустим у нас есть горизонтальное меню в виде списка высотой 40 пикселей. А в нем ссылки:

<h1>Вертикальное выравнивание текста внутри блока</h1>
<ul>
<li><a hrеf="#">Bla</a></li>
<li><a hrеf="#">Bla</a></li>
<li><a hrеf="#">Bla</a></li>
</ul>

Можно сколько угодно раз прописать vertical-align для li, все равно ничего путевого из этого не выйдет. Текст прижмется к верхней границе списка.


Можно конечно отжимать с помощью padding‘a, но это сработает только в том случае, когда все значения прописаны в абсолютных величинах – пикселях. В случае с em это не подойдет.

Существует простое и элегантное решение, которое не всем известно. Нужно указать свойство line-height для текста, равное высоте контейнера и текст встанет ровно по серединке блока!

ul{
width: 600px;
height: 40px;
}

ul li{
float: left;
display: block;
height: 40px;
line-height: 40px;
}

В данном примере высота явно указана и для ul, так как я сделал меню горизонтальным с помощью указания float:left для li. В вертикальном меню указание высоты нужно только для контейнера текста, то есть только li.

Эта запись была опубликована в рубрике CSS. Вы можете следить за комментариями к этой записи.

Комментарии

  1. burkanov написал:

    Или давать padding в em’ах. Тоже хорошо работает.

  2. neutrino написал:

    [quote comment="315"]Или давать padding в em’ах. Тоже хорошо работает.[/quote]

    Считать тяжелее, и будут дополнительные траблы если использовать сложные бэкграунды.

  3. uggallery написал:

    “Фишка” с vertical-align: middle все-таки работает в семантической верске. Так как таблицы тоже ее часть, если используются по назначению. Я переписал бы начало, а в остальном вроде хороший материал.

    Кстати, пытался запостить сюда коммент с мобилы (Нокия, Симбиан, Опера-мини). Безуспешно. Сказало: нет такой страницы :(

  4. neutrino написал:

    < uggallery

    Дельное замечание. Как то я упустил этот момент :) Исправил.

    [quote post="91"]Кстати, пытался запостить сюда коммент с мобилы (Нокия, Симбиан, Опера-мини). Безуспешно. Сказало: нет такой страницы[/quote]

    Хм, надо будет попробовать.

  5. Stan написал:

    Нашел поздно, сам над этим бился :) Кстати, у меня все работает для вертикального списка просто с line-height=40px, без height в li.

  6. Александр написал:

    Спасибо большое! Долго над этим думал, как сделать по стандартам =)

  7. Ash написал:

    (большой) минус в сранении с таблицами: нужно явно указывать высоту.
    Помимо того, что это неудобно, так еще и противоречит духу css (imho)

  8. Curly Brace написал:

    @Ash

    Эта техника вобще “костыль”, предназначеный для удовлетворения нужд неразумных заказчиков, который противоречит духу верстки. Но, как говорится — на безрыбье и рак рыба :)

  9. elrogir написал:

    А если будет на “bla”, “bla bla bla bla bla bla bla bla bla bla bla ” и поползет на вторую строку, по все расподается :(

  10. Юлий написал:

    Сделал div 100 на 50, в нем ссылка текстовая, указал ссылке line-height: 50px и нечего, все равно к верху прилипла

  11. Curly Brace написал:

    Юлий, задайте line-height для div

  12. Log1c написал:

    А если в списке 2 элемента идин из которых занимает одну строку и второй две?
    имеем потерю текста?

  13. >>Достаточно использовать vertical-align: middle, вот и все дела. Но как вы знаете, эта фишка не работает в блочной верстке.

    прекрасно она в блочной верстке работает. но не используется исключительно благодаря гордыне «рулевых» компании микрософт и безрукости «творцов» IE (6 и 7). :(

  14. Олег написал:

    Респект автору! Все работает!!

Leave a Reply

Your email is never published nor shared. Required fields are marked *

*

You may use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>