На Главную

Вертикальное выравнивание в CSS, часть 2.

February 23rd, 2007 by Yuriy Drozdov

Как и обещал, продолжаю. Если брать метод, описанный в Что такое vertical-align и с чем его едят?, то он хорош только в том случае, если контейнер (в нашем случае был div) имеет достаточную ширину и вся строка поместится в один линейный блок. Если строка не влазит в ширину контейнера, она разбивается на несколько линейных блоков. И каждый линейный блок наследует line-height. Получаем в этом случае, мягко говоря, не совсем то, что ожидали.

css выравнивание по центру

Вертикальное выравнивание по стандарту CSS можно выполнить так:

HTML:
  1.  
  2. div#valign { display: table-cell; vertical-align: middle }
  3.  
  4. </style>
  5.  
  6. <div id="valign">Строка выравненная по вертикали </div>

Например, в Firefox 2 это выглядит вот так (я добавил к свойствам border:solid red 1px; height: 100px;):

css выравнивание по центру in Firefox 2

Выставим ширину для div, так чтобы строка не помещалась без разбиения на несколько линейных блоков. Получаем:

Вертикальное выравнивание в css

Наивный читатель подумает что это уже все, задача вертикального выравнивания решена. Но, к сожалению, в IE отсутствует поддержка значения table-cell для свойства display. Поэтому, применить выше описанный метод для вертикального выравнивания в нем нельзя.

Для того, чтобы вертикальное выравнивание коснулось и браузера Internet Explorer немного изменим HTML код и CSS, а также воспользуемся условными комментариями. CSS код представлен ниже:

CSS:
  1. #outer{
  2.   height:100px;
  3.   width:150px;
  4.   display:table;
  5.   border:solid #f00 1px;
  6. }
  7. #container {
  8.   display:table-cell;
  9.   vertical-align:middle;
  10. }

Представленный выше код применяется для браузеров, корректно поддерживающих стандарты CSS. С помощью условных комментариев, делаем код работоспособным в Internet Explorer. Вставляем следующее.

HTML:
  1. <!––[if IE ]>
  2. <style type="text/css">
  3.   #container {top:50%;position: absolute;}
  4.   #inner {top:-50%;position:relative;}
  5. </style>
  6. <![endif]––>

И, собственно, сам HTML выглядит так:

HTML:
  1. <div id="outer">
  2.  <div id="container">
  3.    <div  id="inner">Строка выравненная по вертикали</div>
  4.  </div>
  5. </div>

Внизу можно увидеть весь код в деле:

Строка выравненная по вертикали

Автор: Yuriy Drozdov

Похожие статьи:

RSS комментариев | Trackback URI

21 Комментариев

Comment by Sam
2007-02-26 12:11:46

Чтобы не портить валидность:
* html #container {top:50%;position: absolute;}
* html #inner {top:-50%;position:relative;}

Comment by y.drozdov
2007-02-26 15:59:17

Спасибо за комментарий. Но код и так валидный. A * html - это CSS хак, который уже не поддерживается IE7(подробнее об этом хаке и других на блоге MSDN - http://blogs.msdn.com/ie/archive/2005/10/12/480242.aspx). Рекомендуют вместо этого использовать условные комментарии.Что я и сделал.

 
 
Comment by kastorskiy Subscribed to comments via email
2007-04-11 11:47:42

если содержимое блока inner достаточно большое по высоте (половина высоты окна броузера), то появляется вертикальный скроллбар :(

Comment by y.drozdov
2007-04-13 16:51:42

Да, только что попробовал имеет место для IE, чтобы убрать скролбар ставим overflow:hidden для #outer

 
 
Comment by kastorskiy Subscribed to comments via email
2007-04-13 17:19:10

Да, имеет месо именно для ИЕ.
Мне нужно центровать относительно в окна броузера. И кол-во контента зарание неизвестно, и возможен случай, когда контент не будет вмещаться в окно. Тогда overflow:hidden не подходит. Хотя я счас слабо соображаю, и сейчас не проверю, т.к. убегаю. Может я не прав.

 
Comment by kastorskiy Subscribed to comments via email
2007-04-17 14:36:10

Короче, попробовал, если контент влазит в окно, то overflow:hidden подоходит, в случае же, если контент может не вмещаться в окно, то этот метод для ИЕ не подходит.

Comment by y.drozdov
2007-04-17 14:50:23

а у #outer и #container какая высота стоит?

Comment by kastorskiy Subscribed to comments via email
Comment by kastorskiy Subscribed to comments via email
2007-04-17 15:00:40

А, нет, соврал, у #outer стоит 100%, а у #container не задана

(Вложеность комментариев заканчивается на этом уровне)
 
Comment by y.drozdov
2007-04-17 15:44:14

Видимо прийдется ждать когда ие начнет поддерживать свойство display:table-cell

(Вложеность комментариев заканчивается на этом уровне)
 
 
 
 
 
2007-10-24 15:51:42

[...] Про вертикальное выравнивание я уже писал, можно почитать тут и тут. Написать снова меня натолкнула статья Артема Курапова - Element alignment. [...]

 
Comment by gum
2007-12-27 11:38:24

Так как же все это обединить ?… на страничке… что бы, допустим, небольшая картинка внедренная в HTML, находилась точно по центру, горизонтальному и вертикальному, вне зависимости от масштабирования окна браузера FF и IE7
___

Кого-нибудь не затруднить набросать примерный полный код HTML страницы… пожалуйста….

И с наступающим:)

Comment by y.drozdov
2007-12-27 13:55:57

Посмотрите исходный код страницы http://sribna.com, вот Вам и пример :)
Спасибо, Вас тоже с наступающим!

 
 
Comment by gum
2007-12-27 15:45:26

Спасибо…
я здесь нашел неплохой наглядный пример
http://xhtml.ru/2005/05/24/vertical_centerbox/

 
Comment by master Subscribed to comments via email
2008-02-06 12:58:09

что за привычка, постоянно рассматривать один див. хех,
это что ж получается у тебя страница состоит из одного дива?
а если див зафлотирован или еще что-то?..
вообщем это больше похоже на бестолковые заметки, чем на полезный совет! ЗРЯ ПИСАЛ МНОГА БУКАФ! КГ/АМ!

Comment by Yuriy Drozdov
2008-02-06 13:03:11

В данном примере 3 дива. Причем последний див может служить контейнером для других элементов. Чтобы свести задачу к рассмотрению именно вертикального выравнивания и не усложнять лишними элементами, используются только дивы.

Comment by master Subscribed to comments via email
2008-03-25 18:19:12

где можно применить это выравнивание?? покажите мне сайт где сделано!!!
или это только для того чтобы вешать надпись “сайт на реконструкции” в центре экрана :D

 
 
 
Comment by OZet
2008-03-25 13:48:15

А если к #container применить например float:left то вообще выравнивание перестает работать

Comment by Yuriy Drozdov
2008-03-25 19:07:48

Применяйте float:left к диву обертке, т.е. к #outer

 
 
Comment by Александр Subscribed to comments via email
2008-09-05 13:38:52

не знаю как у вас а у меня дыннй код в ИЕ работает криво а конкретно текст не по середине дива располагается а выше него как я думаю влияет какраз вот эта строчка в css
#inner {top:-50%;position:relative;}

 

Извините, комментарии закрыты.