среда, 31 марта 2010 г.

min-width, min-height, max-width и max-height в IE 6

Про это очень много написано. В Internet Explorer 6 и ниже нет поддержки CSS-атрибутов min-* и max-*. Но, например, атрибут height часто ведет себя как min-height, позволяя растягивать контейнер вслед за контентом. Однако для абсолютно позиционированных элементов это не так и тут придется искать другое решение. Придется воспользоваться расширением CSS от Microsoft под названием expression, позволяющим создавать вычисляемые CSS-атрибуты. Всё просто: определяем, какая высота у нашего элемента и если она больше лимита, ограничиваем ее фиксированным значением.

Итак, решение для min-height:
#div1 {
    /* IE 6 */
    height: expression(this.scrollHeight < 50 ? "50px" : "auto");
    /* Other browsers */
    min-height: 50px;
}
max-height:
#div1 {
    /* IE 6: */
    height: expression(this.scrollHeight > 50 ? "50px" : "auto");
    /* Other browsers: */
    max-height: 50px;
}
min-width:
#div1 {
    /* IE 6: */
    width: expression(this.scrollWidth < 50 ? "50px" : "auto");
    /* Other browsers: */
    min-width: 50px;
}
max-width:
#div1 {
    /* IE 6: */
    width: expression(this.scrollWidth > 50 ? "50px" : "auto");
    /* Other browsers: */
    max-width: 50px;
}
Смешанное решение для min-width и max-width:
#div1 {
    /* IE 6: */
    width: expression(this.scrollWidth < 50 ? "50px" : (this.scrollWidth > 100 : "100px" : "auto"));
    /* Other browsers: */
    min-width: 50px;
    max-width: 100px;
}

height 100% и несколько background-image

Есть сложное фоновое изображение (никак не реализовать через один background-image, непременно нужно 2 или больше), например, нужно нарисовать 2 полосы по краям страницы. При растягивании страницы, полоски должны оставаться по краям, растягивается только фон посередине. Вот так:


Как вы понимаете, полоски должны продолжать идти до самого низа страницы, какой длинной бы она ни была. Для этого сразу в тело документа вставляем 2 элемента DIV (один в другом, во внутреннем вся остальная страница). Первое, что приходит на ум, это просто добавить "height: 100%" к HTML, BODY, #DIV1 и #DIV2. Это решает проблему, но только пока контент страницы меньше высоты окна. Как только появляется прокрутка, мы видим, что фоновое изображение не продолжается до конца страницы, только так, чтобы закрыть первый "экран":


А это совсем не то, что мы хотим. Только IE 6 на данном этапе отображает всё как нам нужно из-за его неверной интерпретации атрибута height. Почему же браузеры, уважающие стандарты, портят картину? Дело вот в чем: они четко воспринимают атрибут height равный 100%, задают элементам высоту окна, а весь контент, который выходит за пределы этой высоты, показывают просто "торчащим", т.е. контейнеры в данном случае не растягиваеются вслед за контентом.

Для исправления ситуации можно сделать вот что. Добавим еще 2 элемента DIV (#DIV3 и #DIV4) внутрь уже имеющихся, зададим для них такой же фон, как у двух первых, но вот высоту в 100% им задавать не будем. В итоге эти внутренние DIV'ы будут растягиваться за контентом и когда высота документа больше высоты окна, мы даже не увидим #DIV1 и #DIV2, но если контента недостаточно для заполнения всей высоты окна, эти DIV'ы будут видны. В итоге, фон будет всегда на полную страницу, что нам и требовалось.

Вот разметка:
<body>
  <div id="div1"><div id="div2"><div id="div3"><div id="div4">
    <!-- Здесь содержимое страницы -->
  </div></div></div></div>
</body>
И стили:
body, html {margin: 0; padding: 0; height: 100%;}
#div1,
#div2
   {height: 100%;}
#div1,
#div3
  {background: url('page-left.png') top left repeat-y;}
#div2,
#div4
  {background: url('page-right.png') top right repeat-y;}