Показать сообщение отдельно
Старый 09.10.2009, 19:11   #38 (permalink)
VedebellO
Member
 
Аватар для VedebellO
 
Регистрация: 13.05.2008
Сообщений: 719
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 278
По умолчанию

Специально для тех, кто любит заниматься сексом в гамаке и стоя: нашел ЕЩЕ БОЛЕЕ ДОЛГИЙ И ТРУДНЫЙ СПОСОБ. Зато - в духе ХХI века, все по взрослому, никаких таблиц.

Необходимость вертикального выравнивания текста (к примеру, центрирования) относительно блочного контейнера возникает достаточно редко. Как правило, подобное поведение требуется в таблицах, и собственно для таблиц существует простой универсальный инструмент – CSS-свойство vertical-align. C произвольным же блочным элементом дела обстоят немного хуже. Существует несколько путей решения проблемы (сторонники «валидной» верстки, уверен, хорошо знакомы с ними), я же решил предложить не худший и не лучший, а просто еще один вариант.
Задача: Дан блочный элемент, к примеру div с классом valign, содержащий некоторый текст.
Код:
<div class="valign">
   ... некий текст ...
</div> Необходимо выровнять текст по вертикали, к примеру, отцентрировать, относительно родителя.  Для «продвинутых» веб-обозревателей существует простое решение:
 .valign{
   display:table-cell;
   vertical-align:middle;         
}
Данный способ к браузеру от Microsoft, к сожалению, не применим, так как он поддерживает vertical-align только для табличных элементов, однако IE версии 6 и старше успешно применяет данное свойство и для inline-элементов, значит можно попытаться найти особый путь и для этого веб-проводника.
В общем виде идея выглядит так. Дополним HTML-код: обернем текст, к примеру, тегом p, а также добавим на том же уровне пустой inline-элемент (к примеру span).
Код:
<div class="valign">
   <span></span>
   <p>... некий текст ...</p>
</div>  Тогда вертикально выровнить текст внутри контейнера с классом valign можно следующим образом (только для IE):
  .valign{
   height:300px; /* определенное значение высоты */
   line-height:300px;
}

.valign p{
   vertical-align:middle; /* здесь выравниваем текст по вертикали */
   display:inline;   
   line-height:normal;
}

.valign *{
   zoom:1;  /* Важно! Устанавливаем hasLayout = true */
}
Ключевыми моментами приведенной техники являются:
  1. задание значения свойству line-height главного контейнера аналогичного значению его высоты;
  2. добавленные нами дополнительные элементы должны быть встроенными (inline) и иметь «включенным» Microsoft'овский hasLayout (делаем при помощи zoom:1.
Приведенный способ вертикального выравнивания текста вполне самодостаточный и может с успехом применятся на практике. Необходимо лишь дополнить CSS-код, сделав его более универсальным.
Код:
.valign{
   height:300px;
   *line-height:300px; /* для IE */
}

.valign, .valign p{
   display:table-cell; 
   vertical-align:middle; /* здесь выравниваем текст по вертикали */
}
/* для IE */ 
.valign p{
   *display:inline;   
   line-height:normal;
}
/* для IE */ 
.valign *{
   zoom:1;  /* Важно! Устанавливаем hasLayout = true */
}
Однако, вернемся к нашей задаче. Итак, мы имеем простое решение для браузеров с поддержкой display:table-cell; и вариант с дополнительными элементами для Internet Explorer версии 6 и выше. Так как эти дополнительные элементы мы можем добавить при помощи expression(), то указанный вариант успешно применим и для нашего случая.
Окончательно приходим к следующему решению:
Код:
.valign{
   ...
   display:table-cell; /* для не IE */
   line-height: expression(this.offsetHeight + "px"); /* для IE */ 
   behavior: expression(!this.extra ? this.extra = this.innerHTML = '<span></span><p>' + this.innerHTML + '</p>' : ''); /* для IE */
}

.valign, .valign p{
   vertical-align:middle; /* здесь выравниваем текст по вертикали */ 
}
/* для IE */ 
.valign p{
   line-height:normal;
   display:inline;   
}
/* для IE */
.valign *{
   zoom:1; /* Важно! Устанавливаем hasLayout = true */
}
VedebellO вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070