понедельник, 28 января 2008 г.

Кроссбразерный width: 100%

Есть макет сайта. "Резиновый", на всю ширину экрана. В макете форма. В форме есть текстовое поле. Для текстового поля заданы отступы (padding) и бордюр. И разумеется нужно чтобы это текстовое поле имело ширину 100%. И ширина текстового поля также должна меняться при изменении размеров окна браузера. Очевидное решение:

<style type="text/css" media="all">
.text {
border: 1px solid #999;

background-color: #F2F2F2;
padding: 9px;

font-size: 12px;

font-family: Arial, Helvetica, sans-serif;

color: #333;
width: 100%;
}
</style>

<input type="text" style="text" value="100% по ширине"/>


в современных браузерах (Firefox, Opera, IE6) не работает. А не работает потому, что в дело вступает блочная модель.

Блочные модели

Блочная модель браузера определяет как будет вычисляться размеры блочного элемента - с учетом отступов и бордюров (традиционная блочная модель) или без них, то есть по размеру контента (блочная модель W3C). Чтобы было понятней взгляните на Рис. 1.


Рис. 1. Различия традиционной и W3C блоных моделей.

Все современные браузеры придерживаются модели W3C. Соответсвенно ширина элемента (от одного края бордюра до другого) для которого задано width: 100% будет равен ширине родительского контейнера плюс ширина бордюра и отступов элемента, то есть больше чем нам нужно.

Если бы мы делали сайт для ABC, то ничего страшного. Но мы-то хотим делать нормальные сайты. А значит проблему надо решать.

Эту проблему можно обойти переключившись на традиционную блочную модель.

Переключение блочных моделей

В спецификации CSS3 для переключения блочной модели описан следующий синтаксис:

box-sizing: border-box
box-sizing: content-box

Первое определение соотвествует традиционной блочной модели, второе - блочной модели W3C. Такой синтаксис поддерживается Opera.

Примечание: box-sizing не работает в комбинации с min-width, max-width, min-height, max-height.

В Firefox поддерживается несколько иной вариант определений:

-moz-box-sizing: border-box;
-moz-box-sizing: content-box;

-moz-box-sizing: padding-box;


Первые два определения аналогичны указаным в спецификации CSS3. Третье определение задает блочную модель при которой размер элемента определяется по контенту и отступам (padding).

Для того чтобы переключить блочную модель в IE6 нужно переключить браузер в quirks mode. В этом особом режиме работы браузера (в отличии от strict mode) поддерживаются некоторые ошибки более ранних версий, и в частности традиционная блочная модель. В IE6 есть правило: если doctype переключающиму браузер в strict mode предшествует xml-пролог, то страница отображается в quirks mode. Это правило позволяет создавать валидные (касаемо doctype) страницы оставаясь при этом в quirks mode. Итак "волшебный" xml-пролог, который должен быть помещен в первую строку документа перед doctype имеет вид:

<?xml version="1.0" encoding="windows-1251"?>

Примечание: Это правило не поддерживается IE7.

Окончательное решение

Объединив подходы к переключению болных моделей мы получили окончательное решение, которое работает в Firefox, Opera и IE6.

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>100% по ширине</title>

<style type="text/css" media="all">

body {

font-family: Arial, Helvetica, sans-serif;
font-size: 12px;

background-color: #FFF;

padding: 20px 50px;

color: #000;

}


h1 {

font-size: 24px;
}


.text {

border: 1px solid #999;

background-color: #F2F2F2;

padding: 9px;

font-size: 12px;

font-family: Arial, Helvetica, sans-serif;

color: #333;

}

.width100 {
box-sizing: border-box;

-moz-box-sizing: border-box;

width: 100%;

}

</style>

</head>


<body>

<h1>100% по ширине</h1>

<input type="text" class="text width100" value="100% по ширине"/>

</body>

</html>


Источники:

Box model tweaking
http://www.quirksmode.org/css/box.html

Quirks mode and strict mode
http://www.quirksmode.org/css/quirksmode.html

Спецификации CSS3
http://www.w3.org/TR/css3-ui/

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

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.