7. Ширина и высота

На этой странице:

Вверх Свойства width и height

Свойства width и height задают ширину и высоту элемента, под которыми понимаются размеры области содержимого элемента (без рамок, внутренних и внешних отступов).

Ширина и высота элемента

Эти свойства игнорируются для строчных незамещаемых элементов.

Значение auto для свойства width вычисляется так, чтобы общая ширина элемента вместе со всеми отступами и рамками точно равнялась ширине родителя (значению его свойства width). Значение auto для свойства height вычисляется по реальной высоте содержимого элемента.

width и height
Значения: <размер> | <проценты> | auto | inherit
По умолчанию: auto
Область применения: блочные и замещаемые строчные элементы
Наследование: нет
Проценты: относительно соответствующих размеров блока-контейнера
Примечание: отрицательные значения для размеров и процентов не допускаются
Файл style.css
  
P.first
{
  width:50%;
  height:150px;
  background:#a7fbc0; 
}
      
Посмотреть
Файл index.htm
  

      

Вверх Переполнение содержимым

Если размеры элемента малы, возникает опасность переполнения его содержимым. Для управления такой ситуацией CSS предлагает свойство overflow.

По умолчанию работает значение visible: содержимое будет видимо при переполнении.

overflow
Значения: visible | hidden | scroll | auto | inherit
По умолчанию: visible
Область применения: блочные и замещаемые строчные элементы
Наследование: нет

Для иллюстрации значений свойства overflow будем использовать следующую пару HTML/CSS:

PRE 
{
  width:200px;
  height:5em;
  background:#ffca4c;
}
      

Посмотреть

Вы можете посмотреть, как браузер обрабатывает переполнение, если свойство overflow не задано.


      

visible

Посмотреть

Значение visible действуют по умолчанию, то есть работает так, как и при отсутствии указания overflow.

По стандарту содержимое в этом случае должно выходить за границы элемента.

Браузер IE-6 нарушает стандарт, растягивая область содержимого элемента.

scroll

Посмотреть

Значение scroll обеспечивает область содержимого полосами прокрутки независимо от того, переполняется она или нет.

auto

Посмотреть

Значение auto обеспечивает область содержимого полосами прокрутки только в том случае, если она переполняется.

hidden

Посмотреть

Значение hidden обрезает содержание, которое выходит за пределы области содержимого элемента.

Вверх Ограничение ширины и высоты

Если имена свойств width и height снабдить приставкой min- или max-, получим имена свойств, ограничивающие ширину и высоту элемента.

Одно из наиболее частых применений — ограничение ширины “резиновой” страницы. При уменьшении окна наступает момент, когда браузерам становится трудно выполнить вёрстку и разметка рушится: блоки наползают друг на друга или проваливаются вниз.

Браузер, при переходе через ограничение минимальной ширины, включает горизонтальную прокрутку, не пытаясь сверстать страницу в неудобных размерах.

min-width и min-height
Значения: <размер> | <проценты> | inherit
По умолчанию: 0
Область применения: все элементы, кроме незамещаемых строчных и элементов таблиц
Наследование: нет
Проценты: относительно ширины/высоты блока-контейнера
Примечание: IE поддержимает эти свойства только с версии IE-7

Одно из наиболее частых применений — ограничение ширины “резиновых” колонок текста или всей “резиновой” страницы.

Как известно, читать текст, в котором слишком длинные (или слишком короткие) строки некомфортно. Оптимальная длина строки зависит от разных параметров, таких как, размер, жирность, тип шрифта, ширина межстрочных и межсимвольных промежутков. Приблизительно можно считать, что оптимум составляет 40–60 символов, минимум — 30, а максимум — 80 символов.

max-width и max-height
Значения: <размер> | <проценты> | none | inherit
По умолчанию: none
Область применения: все элементы, кроме незамещаемых строчных и элементов таблиц
Наследование: нет
Проценты: относительно ширины/высоты блока-контейнера
Примечание: IE поддержимает эти свойства только с версии IE-7

Вверх Проблемы размеров

Архитектура блока

В этом определении заданы:

  • внутренний отступ в 10 пикселов;
  • внешний отступ в 20 пикселов;
  • чёрная сплошная рамка толщиной в 5 пикселов;
  • ширина 400 пикселов;
  • высота 300 пикселов.

Пусть блок задан при помощи кода:

<DIV class="area">
  Содержимое блока
</DIV>
         

Напишем для area такое определение:

.area
{
  padding: 10px;
  margin:  20px;
  border:  5px solid black;
  width:   400px;
  height:  300px;
}
      

По стандарту W3C

Internet Explorer версий 5 и 6

По стандарту W3C ширина и высота относятся к содержимому блока.

Браузеры, построенные на движке Gecko (например, Mozilla Firefox), и браузер Opera точно следуют в этом вопросе стандарту W3C.

А вот браузеры Internet Explorer версий 5 и 6 трактуют ширину и высоту блока по-другому. Они считают, что заданная в определении ширина и высота относится ко всему блоку в целом, исключая внешние отступы.

Таким образом, в IE 5 и IE 6 ширина и высота содержимого блока в соответствии с заданным определением area будут равны:

  • ширина содержимого:
    400-10-10-5-5=370 пикселов;
  • высота содержимого:
    300-10-10-5-5=270 пикселов.

Эта разница приводит к краху блочной разметки в устаревших (но ещё популярных) версиях IE, если разработчик следовал стандартам.

Указанная особенность полностью относится к IE пятых версий и к версии IE6, если в декларации DOCTYPE (см. ниже на этой странице) указан стандарт Transitional (или Frameset). Модель Strict браузер IE6 обрабатывает уже по стандарту W3C.

Вверх Решение проблемы размеров

Самый простой способ избежать обозначенной проблемы — не задавать внутренние отступы и границы для блока, если для него указаны ширина или высота. Отступы и границу можно задавать для родителя или потомков. Если такое решение невозможно, то надо воспользоваться известными трюками, один из которых описан ниже.

Итак, надо объявить ширину блока в 400 пикселов. Если у блока нет внутренних отступов и рамок, то просто пишем width:400px — это будет будет работать для всех браузеров, которые понимают CSS.

Если общая ширина внутренних отступов и рамок по горизонтали составляет 50 пикселов, то для браузеров IE5 и IE6 надо указывать width:450px, а для остальных по-прежнему width:400px. Проблему решает следующий CSS-код:

.area
{
  width:400px;  /* Для хороших старых браузеров */
  \width:450px; /* Обман для IE5 и IE6 */
  w\idth:400px; /* Для всех новых хороших браузеров */
}  
      

Трюк основан на использовании символа “\” — обратной косой черты. Это допустимый символ, описанный в стандарте CSS. Он используется в качестве модификатора, меняющего специальный смысл следующего за ним знака на обычный.

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

"Фото 5\"А\" класса"  
      

Обратная косая черта отменяет специальный смысл кавычки, которая следует непосредственно за ней.

А если у символа нет специального смысла? Значит, и отменять нечего, символ остаётся прежним. Использовать обратную косую черту можно не только в записи строки, но и в записи названий свойств. Таким образом, \width и w\idth полностью эквивалентны width. Какой же смысл в приведённом трюке?

   .area
   {
01   width:400px;  /* Для хороших старых браузеров */
02   \width:450px; /* Обман для IE5 */
03   w\idth:400px; /* Для всех новых хороших браузеров */
   }  
      

Первая строка уловки — для тех браузеров, которые работают по стандарту, но не понимают модификатора (к ним относится, например, браузер Opera 5). Эти браузеры будут рассматривать символ “\”, как обычный знак, входящий в состав имени свойства, не “узнают” width и пропустят строки 2 и 3.

Вторая строка — для браузера IE5, который работает не по стандарту, не считает обратную косую черту модификатором в середине слова, но, по счастью, считает этот знак модификатором, если с него слово начинается. Таким образом, IE5 (и IE6, если он работает в режиме IE5) сначала прочитает 400px в первой строке, потом изменит это значение на 450px из второй строки, а третью строку проигнорирует.

Третья строка — для совсем хороших браузеров: тех, которые работают во всём по стандарту, в том числе правильно понимают символ обратной косой черты.

Пример построения блока

Пример блока

Пусть требуется построить блок area, изображённый на рисунке.

Решением будет следующий набор CSS-определений:

.area
{
  background:#a7fbc0; 
  margin:15px;
  border:5px solid #4d4d4d;
  padding:20px;
  width:400px;   /* Для хороших старых по стандарту */
  \width:450px;  /* Обман для IE5 */
  w\idth:400px;  /* Для всех новых хороших по стандарту */
  height:300px;  /* Для хороших старых по стандарту */
  \height:350px; /* Обман для IE5 */
  he\ight:300px; /* Для всех новых хороших по стандарту */
}
      

Посмотреть

Нельзя было записать h\eight по следующей причине. Знак “\” используется и для кодирования символов 16-ричными цифрами. Если за обратной косой чертой следует один из знаков 0–9, a, b, c, d, e, f, то это воспринимается как начало 16-ричного кода.

Вверх Декларация DOCTYPE

Полный HTML-код последнего примера имеет вид:


      

В тег <HTML> добавлен атрибут lang с указанием русского языка, но главное, перед HTML появился странный элемент DOCTYPE. Мы теперь всегда так будем начинать свои HTML-коды.

Дело в том, что браузер должен знать, на каком языке написана страница, чтобы правильно отобразить её на экране (или другом устройстве). Для этого в первой строке кода необходимо записывать конструкцию DOCTYPE.

DOCTYPE является ключевым компонентом в совместимости страниц, кроме того, выбор DOCTYPE влияет на поведение вашей Web-страницы в различных браузерах.

Джеффри Зельдман, «Web-дизайн по стандартам»

Очень сильно влияет! Ваша визуальная разметка, выполненная средствами CSS по стандартам W3C, может потерпеть крах на экране, если DOCTYPE не будет записан.

Элемент DOCTYPE предназначен для указания соответствия кода документа одному из стандартов W3C. Браузер, в зависимости от стандарта, по-разному интерпретирует элементы на странице.

Элемент DOCTYPE — это, скорее даже не элемент, а описание (декларация), имеющее свой собственный синтаксис.

Декларацию DOCTYPE помещают перед элементом HTML, она начинается с восклицательного знака и записывается прописными буквами.

Варианты DOCTYPE для HTML 4.01 приводятся ниже.

Предусмотрено 3 стандарта языка HTML 4.01:

Вариант Strict

Код не содержит элементов и атрибутов, помеченных W3C как «устаревшие» или «не одобряемые» (например: CENTER, FONT, S, U, align, background, bgcolor, color, size).

Декларация записывается в виде:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
          "http://www.w3.org/TR/html4/strict.dtd">
      

Вариант Transitional

Код может содержать устаревшие теги, вариант введён в целях совместимости со старыми версиями HTML.

Декларация записывается в виде:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
      

Вариант Frameset

Аналогичен Transitional, но содержит также элементы для создания наборов фреймов.

Декларация записывается в виде:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
          "http://www.w3.org/TR/html4/frameset.dtd">
      

Какой вариант DOCTYPE выбрать?

Вариант Frameset отбрасываем сразу, так как фреймы — это рудимент прошлого века, и использовать их мы не собираемся.

В переходной период, когда браузеры не на 100% поддерживают стандарты, ничего другого не остаётся для практики, как выбрать переходной стандарт Transitional.

Таким образом, код любой нашей странички должен иметь такой вид:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
<HTML lang="ru">
...
</HTML>
      

Атрибут lang со значением ru определяет русский язык в качестве базового языка на страничке.

Информация о языке, определённая атрибутом lang, может быть использована Пользовательским Агентом (ПА) для управления представлением различными путями.

Вот некоторые ситуации, где предоставленная автором информация о языке может быть полезной:

Цель атрибута lang — создать ПА условия для более понятного представления содержимого на базе принятой для данного языка культурной практики.

Спецификация HTML 4.01

Вверх Вёрстка потоком

Давайте посмотрим, как браузер выполняет вёрстку страницы на экране по умолчанию. Алгоритм, описанный ниже, называют вёрсткой потоком или просто потоком.

Вёрстка блоков

Элемент HTML визуально совпадает с окном браузера. В него вложен элемент BODY, который по умолчанию имеет отступы от границ родителя (то есть от границ окна).

Внутри BODY располагается цепочка блочных элементов. Даже если разработчик записал строчный элемент или неразмеченный фрагмент текста, он будет помещён в специально созданный блочный (безымянный) элемент автоматически.

По умолчанию браузер выводит блочные элементы друг за другом сверху вниз. При этом ширина блочного элемента совпадает с доступной шириной родителя (его свойством width), а высота определяется по содержимому.

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

Если в блоке есть смесь блочных и строчных элементов (на уровне прямых потомков), то все строчные элементы (а также неразмеченный текст) собираются в безымянные блоки и строятся по описанному выше алгоритму построения блоков.

Вёрстка строк

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

Строки по умолчанию выравниваются со стороны, принятой для текущего языка (слева для русского).

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

Вверх Значение auto

Построим страницу с тремя абзацами. Для второго абзаца укажем ширину, высоту, отступы и рамку и посмотрим, как результат согласуется с алгоритмом работы потока.

Файл style.css
  
.area
{
  background:#a7fbc0; 
  margin:15px;
  border:5px solid #4d4d4d;
  padding:20px;
  width:300px;   
  \width:350px;  
  w\idth:300px;  
  height:100px;  
  \height:150px; 
  he\ight:100px; 
}
      
Посмотреть
Файл index.htm
  

      
Вёртстка потоком

Создаётся впечатление, что второй абзац выпадает из потока: его ширина не равна ширине родителя BODY.

Впечатление неверное: мы забыли про внешние отступы. Да, но отступ справа совсем не похож на 15 пикселов, он существенно больше!

Вёртстка потоком

Внешний отступ справа изменён на auto. Для языков с чтением справа налево, в auto был бы преобразован левый внешний отступ. Браузер обязан уложить элемент в поток, даже ценой нарушения CSS-указаний.

Конечно, больше! Он такой, что общая ширина абзаца (со всеми отступами и рамками) в точности равняется ширине родителя BODY по алгоритму потока.

Да, но мы задали все внешние отступы равными 15 пикcелов: margin:15px! Это так, но чтобы уложить абзац в поток, браузер проигнорировал наш правый отступ, заменив его на auto. Так он поступает при вёрстке документов, в которых тексты читаются слева направо.

Был продемонстрирован пример, в котором браузер заменяет заданный внешний отступ справа на auto, чтобы уложить элемент в поток. Однако значение auto можно явно указывать в CSS-правилах для внешних отступов и размеров. Рассмотрим работу значения auto отдельно по горизонтали и вертикали.

Горизонтальное форматирование

Горизонтальным форматированием блока можно управлять при помощи семи свойств:

Только 3 свойства из 7 могут принимать значение auto

Только 3 свойства из 7 могут принимать значение auto:

  • margin-left
  • width
  • margin-right

Алгоритмы работы этих свойств при значении auto основаны на общем правиле горизонтального форматирования потока.

Сумма размеров горизонтальных компонентов блока в потоке всегда равна значению width родителя.

Если одному из свойств margin-left, width или margin-right задано значение auto, а для остальных — определённые значения, то свойство, заданное, как auto, определяет размер, необходимый для размещения блока по ширине родителя.

На этом правиле основан способ выравнивания блока по отношению к родителю.

margin-right:auto

Выравнивание слева:

.block {width:350px;margin-right:auto;}
          

margin-left:auto

Выравнивание справа:

.block {width:350px;margin-left:auto;}
          

width:auto

Блок с автоматическим свойством width растягивается до пределов заданных отступов.

Растягивание содержимого блока до заданных отступов:

.block 
{ 
  width:auto; 
  margin-left:50px;
  margin-left:150px;
}
          

margin-left:auto; margin-right:auto

Если оба отступа установлены в auto, для них устанавливается одинаковый размер, и блок центрируется.

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

.block
{
  width:350px;
  margin-left:auto;
  margin-right:auto;
}
          

Браузеры IE пятых версий не центрируют блок таким образом. Эту ошибку IE5.* можно компенсировать другой ошибкой этих браузеров: по указанию text-align:center браузеры IE5.* центрируют не только текст (как требует стандарт), но и блоки.

В этом гипертекстовом документе для центрирования BODY относительно HTML применён следующий трюк:

HTML
{
  text-align: center; /* Центрирование BODY для IE5 */
}

/* Определения для блока BODY, вложенного в блок HTML */
BODY
{
  margin: 10px auto;  /* Выравнивание BODY по центру (по стандарту)*/
  text-align: left;   /* Восстановление выравнивание текста слева */
}
          

Посмотрим теперь, как будут вычисляться размеры, если присвоить значение auto одному из отступов и ширине.

Правый внешний отступ и ширина установлены в auto

В данном случае в нуль обращается отступ margin-right.

Запишем определение:

.block
{
  width:auto;
  margin-left:50px;
  margin-right:auto;
}
          

Отступ со значением auto обращается в нуль, а width принимает значение, необходимое, чтобы блок заполнил ширину родителя.

Если значение auto принимают все три свойства, оба отступа обращаются в нуль, а ширина становится максимальной.

Наконец, если всем трём свойствам заданы определённые значения, то свойству margin-right принудительно присваивается auto для языков с написанием слева направо. Для языков с написанием справа налево в auto устанавливается свойство margin-left.

Примеры
Файл style.css
  
.area
{
  background:#a7fbc0; 
  margin:15px;
  margin-left:auto;
  border:5px solid #4d4d4d;
  padding:20px;
  width:300px;   
  \width:350px;  
  w\idth:300px;  
  height:100px;  
  \height:150px; 
  he\ight:100px; 
}
      
Посмотреть
Файл index.htm
  

      

Файл style.css

  
.area
{
  ...
  margin:15px auto;
  ...
}
      
Посмотреть

Файл index.htm

HTML-код остался прежним.

Вертикальное форматирование

Вертикальным форматированием блока можно управлять при помощи семи свойств, задающих размеры:

Только 3 свойства из 7 могут принимать значение auto

Только 3 свойства из 7 могут принимать значение auto:

  • margin-top
  • height
  • margin-bottom

Алгоритмы работы этих свойств при значении auto основаны на общем правиле вертикального форматирования потока.

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

Если для свойств margin-top или margin-bottom задано значение auto, им автоматически присваивается нулевое значение.

Размер блока со значением height:auto определяется таким образом, чтобы его высоты как раз хватило для размещения содержимого.