Блочная верстка div — основы. HTML контейнеры: верстка и форматирование Как сделать контейнер див с изменяемой высотой

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

, , .

Пример таблицы:

Пример таблицы

Этот пример отобразится в броузере так:

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

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

Тег DIV и свойство float

Основа блочной системы — это тег

, который является контейнером для контента. Внутри него также могут содержаться другие контейнеры
.

Использовать тег DIV — не сложнее, чем . Как правило, стандартная структура сайта формируется следующим образом: существует основной контейнер

(часто ему присваивается класс с названием wrapper, container, main и т.д.). Внутри этого контейнера располагаются блоки меню, контентной части, сайдбара.

По умолчанию, каждый новый блок располагается с новой строки. Для того, чтобы расположить блок слева или справа от другого (например, чтобы расположить сайдбар справа), используется свойство float. По умолчанию оно имеет значение «none», но можно также выставлять значения «left» и «right».

Рассмотрим это свойство на примере с двумя блоками.

Блок для контента
Блок для сайдбара

Этот код даст следующий результат:

Свойство clear

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

Для того, чтобы избежать этого, блочная верстка div использует свойство clear, которое должно быть задано для того блока, который мы хотим расположить с новой строки. Чаще всего для этого ему задается значение «both», но можно также задать значения «left» или «right», если мы хотим не просто расположить блок на новой строке, но и задать ему выравнивание.

Дополним вышеуказанный пример новым элементом:

Блок для контента
Блок для сайдбара
Новый блок, расположенный снизу

Результат:

Отступы в блочной верстке

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

Отступы задаются отдельно для верхней, правой, нижней и левой частей элемента. Их можно задать одной строкой путем перечисления четырех значений:

Margin: 20px 10px 0 40px

Блок с такими параметрами будет располагаться на 20 пикселей ниже вышестоящего элемента, на десять пикселей от правостоящего элемента, будет иметь нулевой отступ снизу и будет иметь отступ размером в 40 пикселей слева.

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

Можно также задавать отдельные свойства для отдельных граней с помощью margin-top, margin-bottom, margin-left, margin-right (и аналогично для padding). В таком случае, если какая-то из граней не будет указана, то отступ с ее стороны будет равен нулю или будет определен общими свойствами css, заданными для блоков на странице.

Иногда бывает необходимо произвести выравнивание большого блока документа, содержащего не только текст, но и рисунки, таблицы и т.п. Для этих целей используется элемент-контейнер DIV . Спецификация элемента DIV:

ALIGN="выравнивание">

Атрибут ALIGN определяет тип выравнивания содержимого и может иметь те же значения, что и элемент P.

Отступы

Иногда требуется отобразить блок текста с отступом. Для этого блок текста помещают в элемент-контейнер BLOCKQUOTE . Тогда содержимое этого элемента будет отображаться с небольшими отступами слева и справа, а также отделяться от остального текста пустыми строками.

Таблицы

Одним из наиболее мощных и широко применяемых в HTML средств являются таблицы. Они используются не только традиционно как метод представления данных, но и как средство форматирования Web-страниц. Документ HTML может содержать произвольное число таблиц, причем допускается вложенность таблиц друг в друга.

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

Каждая строка начинается тегом <TR > и заканчивается тегом TR >. Отдельная ячейка в строке обрамляется парой тегов <TD > и TD > или <TH > и TH >. Тег

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

Теги

и не могут появляться вне описания строки таблицы
Ячейка 1Ячейка 2Ячейка 3Ячейка 4

Спецификация тега

:

ALIGN="выравнивание"

BORDER="толщина рамки"

CELLPADDING="расстояние"

CELLSPACING="расстояние"

HEIGHT="высота"

WIDTH="ширина"

Атрибут ALIGN определяет выравнивание таблицы в окне просмотра броузера. Он может иметь одно из двух значений: LEFT (по левому краю) и RIGHT (по правому краю). По умолчанию – LEFT.

Атрибут BORDER управляет толщиной рамки. Значением этого атрибута является число. Это число определяет толщину рамки таблицы в пикселях. По умолчанию толщина рамки – 1.

Атрибут CELLPADDING определяет расстояние в пикселях между рамкой и содержимым ячейки. По умолчанию – 1.

Атрибут CELLSPACING определяет расстояние в пикселях между ячейками таблицы. По умолчанию – 2.

Атрибут HEIGHT определяет высоту таблицы в пикселях.

Атрибут VALIGN определяет вертикальное выравнивание содержимого таблицы. Он может иметь следующие значения: TOP (по верхнему краю), MIDDLE (посередине) и BOTTOM (по нижнему краю). По умолчанию – MIDDLE.

Атрибут WIDTH определяет ширину таблицы в пикселях или процентах от ширины окна броузера.

Спецификация тега

ALIGN="выравнивание"

BGCOLOR="цвет фона"

VALIGN="вертикальное выравнивание"

Атрибут ALIGN определяет выравнивание содержимого всех ячеек строки. Он может иметь одно из трех значений: LEFT (по левому краю), RIGHT (по правому краю) и CENTER (по центру). По умолчанию – CENTER.

Атрибут BGCOLOR определяет цвет фона для всех ячеек строки. Его значение можно указывать в символьной нотации или в формате RGB.

Атрибут VALIGN определяет вертикальное выравнивание содержимого всех ячеек строки. Он может иметь следующие значения: TOP (по верхнему краю), MIDDLE (посередине) и BOTTOM (по нижнему краю). По умолчанию – MIDDLE.

Спецификация тега

ALIGN="выравнивание"

BGCOLOR="цвет фона"

COLSPAN="количество ячеек"

HEIGHT="высота ячейки"

ROWSPAN=" количество ячеек "

VALIGN="вертикальное выравнивание"

WIDTH="ширина ячейки"

Атрибут ALIGN определяет выравнивание содержимого ячейки. Он может иметь одно из трех значений: LEFT (по левому краю), RIGHT (по правому краю) и CENTER (по центру). По умолчанию – CENTER.

Атрибут BGCOLOR определяет цвет фона для ячейки. Его значение можно указывать в символьной нотации или в формате RGB.

Атрибут COLSPAN позволяет объединить несколько соседних ячеек по горизонтали. Значение этого атрибута – количество объединяемых ячеек.

Атрибут HEIGHT определяет высоту ячейки в пикселях.

Атрибут ROWSPAN позволяет объединить несколько соседних ячеек по вертикали. Значение этого атрибута – количество объединяемых ячеек.

Атрибут VALIGN определяет вертикальное выравнивание содержимого ячейки. Он может иметь следующие значения: TOP (по верхнему краю), MIDDLE (посередине) и BOTTOM (по нижнему краю). По умолчанию – MIDDLE.

Атрибут WIDTH определяет ширину ячейки в пикселях.

    Вопросы для закрепления.

    1. Чем отличаются абзацы от заголовков?

      Какие бывают списки?

      Какие теги используются для изменения шрифта?Что такое «информация»?

4. Домашние задание:

1. Создайте таблицу, которая в первой строке содержит одну ячейку, во второй – две, в третьей – три ячейки.

2. На практике понаблюдайте эффект использования различных значений атрибута ALIGN тега .



w3 css (17)

Учитывая следующий HTML:

Я бы хотел, чтобы #copyright придерживался нижней части #container .

Могу ли я достичь этого, не используя абсолютное позиционирование? Если свойство float поддерживает значение «bottom», похоже, что это будет трюк, но, к сожалению, этого не происходит.

HTML:

content

CSS:

html, body { width: 100%; height: 100%; } .overlay { min-height: 100%; position: relative; } .container { width: 900px; position: relative; padding-bottom: 50px; } .height { width: 900px; height: 50px; } .footer { width: 900px; height: 50px; position: absolute; bottom: 0; }

В CSS ничего не называется float:bottom . Лучше всего использовать позиционирование в таких случаях:

Position:absolute; bottom:0;

Для них есть только один ребенок в контейнере, вы можете использовать подход table-cell и vertical-align который надежно работал для позиционирования одного div внизу его родителя.

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

#container { display: table; width: 100%; height: 200px; } #item { display: table-cell; vertical-align: bottom; }

Single bottom item

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

Можете ли вы расширить свой вопрос? Объясните, что именно вы пытаетесь сделать (и почему вы не хотите использовать абсолютное позиционирование)?

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

Чистый CSS, без абсолютного позиционирования, без фиксации любой высоты, кросс-браузер (IE9 +)

Поскольку обычный поток «сверху вниз», мы не можем просто просить #copyright div придерживаться нижней части своего родителя без какого-либо позиционирования какого-то рода. Но если мы хотели, чтобы #copyright div придерживался вершины его родитель, это будет очень просто - потому что это нормальный поток.

Поэтому мы будем использовать это в наших интересах. мы изменим порядок div s в HTML, теперь #copyright div находится вверху, а содержимое сразу же следует за ним. мы также делаем контент div растянутым полностью (используя псевдоэлементы и методы очистки)

теперь речь идет только о том, чтобы вернуть этот порядок обратно в представление. что легко можно сделать с помощью CSS-преобразования.

Мы вращаем контейнер на 180 градусов, а теперь: вверх-вниз. (и мы возвращаем обратно содержимое, чтобы снова выглядеть нормально)

Если мы хотим иметь scroolbar в области содержимого, нам нужно применить немного больше магии CSS. как можно показать [в этом примере содержимое находится ниже заголовка, но его та же идея]

* { margin: 0; padding: 0; } html, body, #Container { height: 100%; color: white; } #Container:before { content: ""; height: 100%; float: left; } #Copyright { background-color: green; } #Stretch { background-color: blue; } #Stretch:after { content: ""; display: block; clear: both; } #Container, #Container>div { -moz-transform: rotateX(180deg); -ms-transform: rotateX(180deg); -o-transform: rotate(180deg); -webkit-transform: rotateX(180deg); transform: rotateX(180deg); }

Element 1
Element 2

Фактически, принятый ответ @User будет работать только в том случае, если окно высока, а контент короткий. Но если контент высок, а окно короткое, оно поместит информацию об авторских правах на содержимое страницы, а затем прокручивается вниз, чтобы увидеть содержимое, оставив вас с плавающим уведомлением об авторских правах. Это делает это решение бесполезным для большинства страниц (например, эта страница).

Наиболее распространенный способ сделать это - продемонстрированный подход «CSS липкий нижний колонтитул» или немного более тонкое изменение. Этот подход отлично работает - если у вас есть фиксированный верхний нижний колонтитул.

Если вам нужен нижний колонтитул переменной высоты, который будет отображаться в нижней части окна, если содержимое слишком короткое, а внизу содержимого, если окно слишком короткое, что вы делаете?

Проглотите свою гордость и используйте стол.

Например:

* { padding: 0; margin: 0; } html, body { height: 100%; } #container { height: 100%; border-collapse: collapse; }

Lorem ipsum, etc.

Попробуйте. Это будет работать для любого размера окна, для любого количества контента для любого нижнего колонтитула любого браузера... даже IE6.

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

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

Если вы не знаете высоту дочернего блока:

#parent{background:green;width:200px;height:200px;display:table-cell;vertical-align:bottom;} .child{background:red;vertical-align:bottom;}

child

Если вы знаете, что высота дочернего блока добавляет дочерний блок, добавьте padding-top / margin-top:

#parent{background:green;width:200px;height:130px;padding-top:70px;} .child{background:red;vertical-align:bottom;height:130px;}

child

Parent { display: flex; flex-direction: column; } .child { margin-top: auto; }

Parent { height: 100px; border: 5px solid #000; display: flex; flex-direction: column; } .child { height: 40px; width: 100%; background: #f00; margin-top: auto; }

Align to the bottom

Решение выше, вероятно, более гибкое, однако, это альтернативное решение:

Parent { display: flex; } .child { align-self: flex-end; }

Parent { height: 100px; border: 5px solid #000; display: flex; } .child { height: 40px; width: 100%; background: #f00; align-self: flex-end; }

Align to the bottom

В качестве дополнительной заметки вы можете добавить префиксы поставщиков для дополнительной поддержки.

Кроме того, если есть положения с использованием position:absolute; или position:relative; , вы всегда можете попробовать padding родительский div или поместить margin-top:x; , В большинстве случаев это не очень хороший метод, но в некоторых случаях он может пригодиться.

Просто потому, что это вообще не упоминалось, что обычно хорошо работает в таких ситуациях, как ваше:

Вам нужно было бы форматировать div-copyright, аналогично другому контейнеру (такая же общая ширина, центровка и т. Д.), И все в порядке.

Единственный раз, когда это может быть не идеальным, - это когда ваш контейнер-div объявлен с height:100% , и пользователю потребуется прокрутить вниз, чтобы увидеть авторское право. Но даже вы можете работать (например, margin-top:-20px - когда высота вашего элемента авторского права составляет 20 пикселей).

  • Абсолютное позиционирование
  • Нет табличного макета
  • Никаких сумасшедших css, которые выглядят по-разному в каждом другом браузере (ну, по крайней мере, IE, вы знаете)
  • Простое и четкое форматирование

Кроме того: я знаю, что OP попросил решение, которое «... прилипает к дну« контейнера »div ...» , а не что-то под ним, но давайте, люди ищут хорошие решения здесь, и это это один!

Div of style, position:absolute;bottom:5px;width:100%; работает, но для этого потребовалась более ситуация с прокруткой.

Window.onscroll = function() { var v = document.getElementById("copyright"); v.style.position = "fixed"; v.style.bottom = "5px"; }

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

Мне нужно было создать навигационную панель, которая имела бы фактические ссылки в правом нижнем углу и случайные элементы брата, при этом гарантируя, что сам бар растягивается должным образом, не нарушая макет. Я использовал элемент «shadow», чтобы занять пространство ссылок на панели навигации и добавил его в конце дочерних узлов контейнера.

filler

#container{width:100%; float:left; position:relative;} #copyright{position:absolute; bottom:0px; left:0px; background:#F00; width:100%;} #container{background:gray; height:100px;}

Попробуй это;

Создайте еще один контейнер div для элементов выше #copyright . Только над авторским правом добавьте новый div:

Он заставит нижний колонтитул находиться под всем остальным, как в случае использования относительного позиционирования (bottom:0px;).

Да, вы можете сделать это без absolute позиционирования и без использования table s (которая винт с разметкой и т. Д.).

DEMO
Это проверено для работы с IE> 7, chrome, FF и является очень простой возможностью добавить к существующему макету.

Some content you don"t want affected by the "bottom floating" div
supports not just text
Some other content you want kept to the bottom
this is in a div
#container { height:100%; border-collapse:collapse; display: table; } .foot { display: table-row; vertical-align: bottom; height: 1px; }

Он эффективно делает то, что float:bottom , даже учитывая проблему, указанную в ответе @Rick Reilly!

Использование свойства translateY и top

Просто установите дочерний элемент на позицию: относительный и перемещайте его вверх: 100% (это высота 100% родителя) и придерживайтесь нижней части родительского объекта путем преобразования: translateY (-100%) (это -100% высоты ребенок).

  • вы не берете элемент из потока страницы
  • он динамичен

Но все же просто обходной путь:(

Copyright{ position: relative; top: 100%; transform: translateY(-100%); }

Не забывайте префиксы для более старого браузера.

Создано 29.08.2010

Вступление

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

При подготовке этого материала использовалась книга:
"CSS. Профессиональное применение веб-стандартов"
Энди Бадд, Камерон Молл, Саймон Коллизон
Вильямс 2009

"HTML и XHTML. Подробное руководство."
Чак Муссиано, Билл Кеннеди
Символ 2008
А так же другие материалы.

Схема DTD

В самом начале раздела, в вводной статье, я писал - "вводим новые понятия и элементы по мере необходимости..." И вот эта необходимость настала.
Поговорим о высоком. Схема DTD (Document Type Definition - определение типа документа) представляет собой набор правил, читаемых компьютером и определяющих, что разрешено и не разрешено в конкретном документе (x)HTML. Браузеры используют эти правила при синтаксическом разборе веб-страницы, чтобы проверить, действительна ли она. Код документа должен быть не только синтаксически правильным, но и действительным (valid), т.е. соответствовать стандартам W3C (World Wide Web Consortium). Если код недействителен, браузер попытается интерпретировать разметку самостоятельно по ему одному известным правилам (нестандартный режим). Результат может быть непредсказуемым, скорее всего плачевным...
DTD предоставляется браузеру в объявлении DOCTYPE . Браузер выбирает режим вывода в зависимости от... В общем, нам достаточно знать следующее:

Если документ (x)HTML плохо сформирован или не содержит объявления DOCTYPE , он будет выведен в нестандартном режиме!

Объявление DOCTYPE представляет из себя 2 строки кода на языке SGML (Standard Generalized Markup Language - стандартный обобщенный язык разметки), размещенные в начале документа. Это объявление "заверяет" браузер, что Ваш документ намерен соответствовать указанному в нем стандарту. Если до этого мы начинали документ с тега html , то теперь будем начинать вот так:

Объявление DOCTYPE и тег html ...

Почему раньше мы обходились без всяких объявлений? По мере продвижения вперед, код разметки усложняется и количество использемых стилевых правил увеличивается. Примеры, приведенные в последующих главах, без объявления DOCTYPE в разных браузерах могут работать не корректно. Чтобы не быть голословным, я подскажу (*) в каком примере можно увидеть различия в реализации кода, отключив объявление DOCTYPE .

Тег

Подготовка

Многие браузеры на основе своих таблиц стилей присваивают значения по умолчанию многим элементам страницы. Поэтому перед тем как писать код, рекомендуется сбросить эти значения. Для этого в папке css создадим файл reset.css , а в html-документе добавим на него ссылку.

Код файла reset.css /* сброс значений по умолчанию*/ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } body { line-height: 1; } table { border-collapse: collapse; border-spacing: 0; }

Как прописано в стандартах и скучных учебниках, тег div (division) разбивает документ на отдельные части, разделы. Вот так вот скупо, тоска.... Видимо это писалось еще во времена тотальной табличной верстки, когда он был не очень популярен - как-то без него обходились.
А выглядит он вот так:

Контейнер div

На примере этого тега, о котором, в общем-то писать действительно нечего, кроме того, что это блочный элемент, как параграф или загловок, мы рассмотрим наиболее важные концепции CSS. При использовании его с атрибутами class и id , тег div является основным строительным материалом для блочной верстки страниц в современном веб-дизайне.

Код HTML

Контейнер div

На примере... (текст)..

код CSS /** код просто посмотрите, глубоко не вникая пока... **/ .smpl-div{ margin:10px 20px; padding:16px; background:#565; color:#fff; border:3px solid orange; width:80%; }

Ну еще можно добавить, что в него можно вложить все! Заголовки, параграфы, таблицы, формы, другие теги div ... вобщем все, или почти все. Дескриптор div используется для группирования блочных элементов на основе их функционального назначения, логически связанных.
Наша задача сделать код более чистым и осмысленным, поэтому применение слишком большого количесва тегов div в презентационных целях, признак того, что код плохо структурирован и чрезмерно усложнен.

На этом лирическое отступление заканчиваем и переходим к наверно САМОЙ СЕРЬЕЗНОЙ главе раздела HTML&CSS

Модель контейнеров

Область содержимого

Модель контейнеров управляет размещением и выводом элементов на странице. В рамках этой модели каждый элемент страницы рассматривается, как прямоугольный контейнер, обладающий определенными параметрами. У контейнера может быть содержимое (это то, что мы в него положили) или он может быть пустым. Дальше я буду все объяснять очень подробно! Это важно .

Эксперемент #1 Создадим 2 контейнера - один с текстом, другой пустой. Цвет фона для них сделаем #a55. /* Стили CSS */ .test_num1{ background-color:#a55; /* цвет фона */ }

СОДЕРЖИМОЕ. Текст.

Из полученного делаем выводы:

  • Без указания каких либо параметров контейнер с содержимым имеет высоту, достаточную для вмещения содержимого, и занимает максимально возможную ширину (ширина родительского элемента)
  • Пустой контейнер мы не видим вообще!!! Он просто "схлопнулся" по высоте. (в браузере IE6 - видим....)
Эксперемент #2 Явно задаем размеры контейнеров: /* Стили CSS */ .test_num2{ background-color:#a55; /* цвет фона */
width:80px; /* ширина*/ height:60px; /* высота*/ }

СОДЕРЖИМОЕ. Текст.

Выводы:

  • Пустой контейнер с явно заданными размерами выводится нормально
  • Первый сюрприз. Браузер IE6 отображают контейнеры по другому, нежели все остальные... Специально задав недостаточную ширину, ожидалось, что содержимое выйдет за пределы блока. Так оно и случилось во всех браузерах, кроме IE6, который проигнорировал заданное значение width и увеличил ширину блока до размеров содержимого. Со свойством height то же самое, увеличивает размер контейнера по вертикали. Привыкайте.
  • Обещаная подсказка (*) : Если вы сейча отключите объявление DOCTYPE, то сможете увидеть, что все версии браузеров IE увеличивают ширину контейнера и увеличат высоту, если текста будет больше (Opera, кстати, тоже увеличит высоту)
  • При необходимости, когда ширины контейнера не хватает, текст переносится на следующую строку по пробелу.
  • Свойсто CSS overflow , отвечает за способы отображения содержимого, если оно не вмещается. Что это такое - посмотрите, пожалуйста, в справочнике. Поэксперементируйте, добавляя разные значения свойства overflow в класс test_num2 , и посмотрите, что из этого получится

Отступы и рамки

В соответствии справилами CSS, свойства width и height устанавливают размер не контейнера, а области содержимого. По сути, мы имее дело с ЧЕТЫРЬМЯ(!) контейнерами, где содержимое является так называемым "ядром" (core content area) и помещается еще в 3 контейнера. Каждый из них имеет параметр, соответствующий значению одноименного свойства CSS (ни одно из этих свойств не является обязательным). В разных источниках используются разные термины для описания этих свойств. Схематически модель контейнеров можно представить так.

margin: 20px

border: 10px

padding: 30px

padding - внутренний отступ, или внутренняя полоска, или подложка. Обрамляет содержимое, отделяя его от границ контейнера. Заливается цветом фона вместе с содержимым.

border - рамка. Имеет цвет, толщину и стиль используемых линий. Чаще используются в декоративных целях.

margin - внешний отступ, или внешняя полоска, или поле. Прозрачная полоска за пределами рамки. Используется для задания промежутков между элементами страницы.

Добавление padding , border и margin не изменяет размеры области содержимого, но изменяет общий размер контейнера.

Вычисляем ширину контейнера:
width + 2 *(padding + border + margin) = 40+2*(30+10+20) = 160px
Высота вычисляется аналогично (height вместо width ) и, в нашем случае, равна ширине.

А теперь простыми словами и более подробно

Свойства padding и border

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

Рассмотрим пример:
Создаем контейнер div с заданой шириной, внутренним отступом и рамкой. В качестве содержимого вставляем параграф, тоже с рамкой и внутренним отступом. Применяем фон к параграфу, отличный от фона контейнера div , чтобы визуально видеть внутреннюю полоску.

/* класс для контейнера div */ div.smplBox{ width:520px ; border: 4px solid #565; /* для содержащегося в классе параграфа p */ div.smplBox p{ padding: 4px 8px; /* подложка – сверху/снизу-справа/слева */ border: 7px solid #565; /* рамка */ background: #f8f278; /* цвет фона */ }

Вычисляем общую …

Вычисляем общую ширину контейнера на основании имеющихся занчений свойств.

Так как высота не задана явно, она будет увеличиваться по мере заполнения контейнера содержимым.
Общая ширина контейнера = ширина содержимого +
отступ справа +отступ слева + толщина рамки*2

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

520+10+30+4*2 = 568px

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

Так как внутренних отступов нет,
Общая ширина контейнера = ширина содержимого + толщина рамки*2

Width= 568- 1*2 = 566px

Где 568 – ширина первого контейнера, а 1 – толщина рамки нашего контейнера.

/* используем тот же класс ?! … */ div.smplBox{ width:520px ; /* ширина области содержимого*/ padding: 5px 10px 20px 30px; /* подложка: сверху-справа-снизу-слева */ border: 4px solid #565; /* рамка – толщина сплошная цвет */ background: #ddd; /* цвет фона*/ } /* переопределяющий класс для второго контейнера */ div.smplBox-reset{ width:566px ; /* ширина области содержимого (568-2) с запасом для рамки*/ padding: 0; /* подложка: обнуляем */ border-width: 1px; /* толщина рамки – переопределяем толщину */ } /* обнуляем свойства для параграфа p */ div.smplBox-reset p{ padding: 0; border: 0; }

Вычисляем общую …

Повидимому, здесь необходимо сделать некоторые пояснения:
Значения некоторых свойств для 1-го и 2-го контейнеров совпадают, например цвет фона, стиль и цвет рамки. Поэтому мы можем воспользоваться этим классом, а потом ПЕРЕОПРЕДЕЛИТЬ (!) несовпадающие свойства. Этот прием достаточно часто используется веб-дизайнерами.
Фишка в том - как мы его переопределили. Оказывается, к одному селектору можно применять несколько классов, указывая их для атрибута class через пробел! Причем, если в этих классах есть одинаковые свойства, то последнее переопределяет предыдущие. Соответственно, для контекстного селектора p действуют те же правила.
И еще, мы не стали переопределять полностью свойство border , а сделали это только для значения толщины рамки, использовав для этого свойство border-width .

Свойство margin

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

margin: 30px 20px;

Поля первого блока:
верхнее, нижнее - 30px
правое, левое - 20px

Ширина и высота блока, а так же рамка в данном примере значения не имеют.

Второй блок окружен полями - 50px;
Все достаточно просто, визуально разница в отступе от левого края хорошо заметна. Интерес представляет расстояние между блоками...
Логично было бы предположить, что расстояние между блоками, нижнее поле одного из которых равно 30px, а верхнее поле другого 50px, будет равно сумме этих полей, т.е. 80px. Но это не так. Смежные вертикальные полоски сливаются, принимая ширину большей из них. В нашем случае зазор между блоками будет 50px. Это очень полезное правило, позволяющее убирать не нужные вертикальные зазоры между абзацами, например. По горизонтали поля не сливаются.

Сейчас мы более подробно остановимся на этом очень важном для понимания моменте - слияние внешних полосок.

Html-код со встроенными стилями

Cлияние смежных вертикальных полей родительского и дочернего элементов.

Cлияние смежных вертикальных полей родительского и дочернего элементов.

Из вышепреведенного примера видно, что нижнее поле блока div , равное 15px, и верхнее поле блока p - 20px, "схлопнулись" и дали результирующее поле размером 20px. При этом горизонтальные поля остались на месте. (в браузере IE6 - нет...)
А теперь, если родительскому блоку div добавить рамку border:1px solid #111 , или внутренний отступ padding:5px , верхнее и нижнее поля вернутся на место! (проверьте самостоятельно)

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

Так же сливаются верхние и нижние вертикальные поля пустого элемента, а если пустых элементов несколько и они расположены друг над другом, то все их верикальные внешние полоски сольются в одну!

margin: 0px 20px;

Для свойства margin можно задавать ОТРИЦАТЕЛЬНЫЕ значения. Их можно использовать для наслоения элементов друг на друга. Для второго блока мы задали поля 50px, а потом переопределили значение для верхнего поля
-30px; . Еще отрицательные значения иногда используют для сокрытия элемента. Задав достаточно большой отрицательный отступ, например -2000px, мы смещаем элемент за пределы страницы, т.е. делаем его невидимым. Попробуйте самостоятельно.

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

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

Старайтесь не задавать без необходимости свойство padding элементам с явно указанными размерами. Лучше применить его к родительскому или дочернему блоку

Установите, пожалуйста, на свой компьютер второй браузер (Opera, Mozilla, Safari, GoogleChrome,IE6-8). Один из них должен быть IE!
О кроссбраузерности мы будем говорить позже, а пока хотя бы фиксируйте для себя различия в поведении браузеров. По этой ссылке вы можете скачать IETester

Блохи и грабли

  • Грабли, говорите.... Да они пофсюду!!!
  • Если что-то не идет, хотя должно по идее... - внимательно проверьте, а еще лучше просто скопируйте по-новой объявление DOCTYPE
  • К сожалению браузеры IE5 и IE6 считают размеры контейнера по своему. Они считают свойство width равным сумме области содержимого и отступов, как внеш. так и внутренних.
  • Наибольшее количество проблем возникает в браузерах Internet Explorer, для которых иногда приходится писать параллельный код CSS. Уже скоро:)

Плавающие элементы. Свойство FLOAT

Создано 28.08.2010

Понимание этой, достаточно не простой концепции, поможет нам …. в общем, если вы хотите чтобы элементы на странице вели себя предсказуемо …. Блин! Как же написать-то???

Итак: что плавает, как плавает и зачем плавает.
Плавают элементы, определенные тегами, для которых задано свойство float .

Float: left | right | none; /* Прим. если значение none - то элемент не плавающий */

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

Для примера берем рисунок и 2 параграфа с текстом. Помещаем все это в контейнер div . Контейнеру задаем рамку, для наглядности. Задаем для рисунка обтекание слева…. Не однозначный момент.…

Слева – это не значит, что содержимое будет обтекать наш рисунок слева, наоборот – справа! Иными словами, рисунок будет слева по отношению к последующему содержимому. Уф.… Как сложно иногда бывает описывать простые вещи. Вот так это выглядит.

А вот так это записывается: /*** код css ***/ .test-float { border:1px solid yellow; /* рамка контейнера (для наглядности)*/ } .test-float img { float:left; /* обтекание слева */ height:120px; /* высота рисунка */ margin:4px; /* внешние отступы со всех сторон */ }

первый параграф

второй параграф

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

Clear: both | left | right;

Соответственно отменяет обтекание: любое | слева | справа (в подавляющем большинстве случаев применяется значение both ). Ага, забыл ответить на свой же вопрос – "зачем плавает".

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

Так вот, свойство clear позволяет отменить обтекание. Для чего нам его отменять? Представьте себе, что в предыдущем примере у нас не 2 абзаца обтекают рисунок, а 1 абзац и 1 нумерованный список, причем список достаточно длинный. И если часть списка начнет обтекать рисунок снизу, а не с боку, то выглядеть это будет достаточно противно…. Представили? Поэтому лучше после первого параграфа очистить плавающие элементы, чтобы последующее содержимое начиналось ниже рисунка.
В нашем примере нужно просто очистить второй параграф, для этого добавим класс clear в нашу таблицу css, а потом укажем этот класс в качестве атрибута второго параграфа.

Clear {clear: both;} /*---------------------*/ .......

второй параграф

Это всего лишь одна, причем не самая важная, причина, по которой мы применяем очистку. По большому счету в данном случае можно было обойтись и без очистки, просто задав для второго параграфа (или любого другого элемента на его месте) значение margin-top , достаточное для того, чтобы вытеснить параграф ниже рисунка.

Главная причина в том, что плавающий элемент оказывает влияние на все последующие элементы страницы, что при определенных условиях может вызвать непредсказуемые последствия. В одном из примеров (*) мы вернемся к этому.

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

/* класс для плавающих блоков */ .float-box{ float:left;/* обтекание слева, делаем элемент плавающим */ background-color:#abc; border:1px solid yellow; margin:8px;/* отступы со всех сторон */ width:80px;/* ширина */ text-align:center;/* выравнивание по центру */ } /* очищает обтекание и переопределяет ширину */ .test-box1{ width:150px;/* увеличиваем ширину блока */ float:none;/* делаем блок не плавающим */ } /* контейнер-обертка */ .local_wrapper{ border:1px solid black; }

Пример 1

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

Пример 2

К двум блокам добавляем через пробел второй класс:
class="float-box test-box1 " тем самым переопределяя значение свойства float и width . Все три блока заключены в контейнер-оболочку

Блоки div#2 и div#3 делаем обычными, они тут же перестают видеть блок div#1, которого нет в общем потоке, и спокойно занимают его место. Происходит наслоение контейнеров. (В браузере IE7 и ниже - все друг друга видят и никто ничье место не занимает.... Вот так)

Пример 3

Опять все три блока плавающие. Заключены в контейнер-оболочку. Увеличиваем ширину блока div#3.

div#3 - не поместился по горизонтали и был перенесен вниз. Но "зацепился" за div#1 (мы специально сделали контейнеры разной высоты) и пристыковался к его левой кромке. Вот, кстати, подходящий пример (*) того, как изменение размера плавающего элемента может разрушить страницу.

Если внимательно сравнить последний пример с предыдущим, то можно заметить, что расстояние по вертикали между блоками div#2 и div#3 разное. В прошлый раз мы сделали эти блоки обычными и, как мы помним из модели контейнеров, их внешние поля слились. У плавающих элементов слияния внешних полосок НЕ ПРОИСХОДИТ! Таким образом зазор по вертикали стал равен margin-bottom + margin-top , а не большему из них, как в обычной жизни... Не стоит про это забывать.

Ну и еще один сюрприз. Контейнер-обертка схлопнулся (горизонтальная черта над блоками - слившиеся верхняя и нижняя линии рамки), т.к. все содержащиеся в нем блоки плавающие, а значит их нет в общем потоке и отношение к ним соответствующее - как к пустому месту (опять же браузеры IE7 и ниже живут по своим законам...). Что делать?
Есть 3 варианта решения этой проблемы.

  1. Сделать содержащий контейнер-обертку тоже плавающим, задав для него свойство float . Тогда он будет относится к вложенным блокам как к "своим"
  2. Установить контейнеру-обертке для свойства overflow значение hidden . Это трюк. И, как большинство трюков, в некоторых ситуациях имеет побочные эффекты, о которых мы поговорим в главе "Позиционирование"
  3. Очистка с помощью свойства clear . Для этого должен быть элемент, которому это свойство можно было бы присвоить, например параграф p или блок div , в конце концов просто горизонтальная линия hr

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

Плавающие элементы значительно усложняют разметку страницы, поэтому не стоит этим злоупотреблять.

Часто проблема заключается в том, что нам негде разместить свойство clear . С этой целью иногда даже создаются пустые элементы, исключительно с целью очистки. Создание пустых элементов - может оказаться не самым безобидным занятием... В этом плане неожиданно полезным может оказаться невзрачный тег br . Не занимая лишнего места с его помощью можно очистить обтекание.

Clear {clear: both;}

Блохи и грабли

  • Вечная проблема - сползание блоков, которым надлежит распологаться горизонтально, вниз. Почему? Суммарный размер ширины блоков + отступы + рамки превышает ширину содержащего блока или страницы
  • Браузер IE6 это отдельная, долгая и безумно печальная история (IE7 тоже, кстати, при благоприятных условиях может запросто разрушить вашу страницу). Пока мы на этом подробно останавливаться не будем

Позиционирование

Создано 02.09.2010

Мы рассмотрели две важных концепции модели визуального форматирования: модель контейнеров и плавающие элементы. Третий "краеугольный камень" верстки страниц на основе таблиц CSS - позиционирование.
В этой главе, как и в двух предыдущих, мы говорим о блочных элементах . Остановимся на этом подробнее.

Блочные и строчные контейнеры

Строчные контейнеры (span, strong, i и другие..) выводятся в строке горизонтально. Блочные контейнеры (p, h1, div ... ) выводятся вертикально один над другим, если значение свойства float не определяет их как плавающие. Деление элементов на блочные и строчные достаточно условно, потому что задав определенное значение свойству элемента display , мы можем изменить тип генерируемого контейнера и переопределить элемент как:

  • блочный - {display: block;}
  • строчный - {display: inline;}
  • ни контейнер ни его содержимое не выводится и не занимает места на странице - {display: none;}
  • другие значения свойства смотрите в справочнике...

По умолчанию браузер выводит элементы документа последовательно, единым потоком. Изменить порядок следования мы можем с помощью свойства position (по умолчанию имеет значение static ).

Относительное позиционирование

Относительное позиционирование заключается в смещении элемента в потоке, относительно его начального положения.

div#2
position: relative;


margin-top: -30px;
margin-left: 30px;

Позиция элемента вычисляется с помощью свойств top, bottom, left, right .

Относительное позиционирование. CSS /* отсчет относительно изначальной позиции ! */ position: relative; left: 50px; top: 20px;

Абсолютное позиционирование

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

Контейнер, свойству position которого присвоено значение absolute , смещается вверх и занимает верхний левый угол ближайшего позиционированного элемента, у которого position: absolute | relative .

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

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

Абсолютное позиционирование. CSS /* отсчет относительно соответствующего угла позиционированного родительского контейнера ! */ position: absolute; right: 10px; top: 10px;

Можно сверстать страницу исключительно из абсолютно позиционированных элементов! И все бы хорошо, если бы не необходимость явно задать ВСЕ размеры. Иначе при увеличении размеров шрифта, или добавлении текста, в общем изменении размера контейнера, блоки будут наслаиваться и страница, вероятно, разрушится.

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

Фиксированное позиционирование. CSS /* отсчет относительно соответствующего угла экрана */ position: fixed; left: 0px; bottom: 200px;

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

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

При наслоении контейнеров на переднем плане находится тот контейнер, у которого больше z-index. Свойство может принимать в качестве значений любые целые числа (в том числе отрицательные). Если известно, что элемент всегда должен находиться на поверхности, лучше задать значение побольше, с запасом, например: z-index: 2000;

Блохи и грабли

  • Помните плавающие элементы? Чтобы предотвратить схлопывание содержащего контейнера, мы тогда задавали для него свойство overflow: hidden , и упоминали о возможных побочных эффектах. Так вот, если с помощью задания соответствующей позиции мы сместим какой либо блок (его часть) за границы содержащего контейнера, то "выступающую часть" просто обрежет .
  • При абсолютном позиционировании в браузере IE6 родительскому элементу нужно явно задавать размеры, иначе блок будет позиционирован относительно страницы... Косяк браузера
  • Часто забывают, что родительский элемент должен быть явно позиционирован! (при абс.поз.)

Практикум

Создано 19.10.2010

Подготовка

Создаем папку practicum (корневой каталог), внутри нее создаем папку css .
- В корневом каталоге создаем документ practicum1.html
- В папку css создаем файл practicum_css .css
- В начало документа вставляем объявление DOCTYPE (пока просто вставляем, более подробно мы разберем его позже)
- Структурируем документ, определяя основные теги: html, head, body
- Пишем что-нибудь внятное в теге title , а в разделе head ссылаемся на нашу таблицу стилей в папке css

Чтобы протестировать документ и правильность подключения таблицы стилей, задаем для тега body цвет фона #ccc , вставляем в документ параграф с произвольным текстом и обновляем документ. Все.

Постановка задачи

С относительным позиционированием мы уже разобрались. Все было достаточно просто и понятно. Гораздо интереснее - как я это "нарисовал"... Похоже относительным позиционированием здесь дело не обошлось....

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

1-й этап

Родительский контейнер

/* задаем ширину и рамку */ #wrapper{ width:610px; border:1px solid yellow; }

Не очень красиво, когда блоки прикасаются к внешнему контейнеру, поэтому стоит задать отступы. И сразу вопрос: что использовать, padding для родительского блока или margin для внутренних? При явно заданных размерах родителя, предпочтительнее, наверное, будет использовать второй вариант, потому что иначе размер родительского блока увеличится на величину соответствующих внутренних отступов. К тому же мы все равно будем использовать margin для зазоров между блоками.

Удобнее сначала для всех блоков задать общие свойства, а уже потом, при необходимости, для групп элементов или в индивидуальном порядке какие-то из них переопределить. Например, для всех блоков задать внешний отступ справа и сверху, и затем только для первого определить отступ слева, чтобы он не прижимался к содержащему контейнеру.
Для параграфов задаем внутренние отступы и очищаем элементы от обтекания. Для блоков у нас задано обтекание слева, поэтому давайте применим очистку слева: clear: left . Для чего - станет понятно чуть позже.

параграф 1

/* Общие свойства. Потом переопределим. */ #wrapper div{ border:1px solid red; margin:2px 10px 0 0; background-color:#484f6c; float:left; width:100px; height:100px; } #wrapper p{ padding:2px; clear:left; }

Параграф 1

2-й этап

Правый блока (5) . Увеличиваем высоту, убираем фон и прижимаем к правому краю. Для этого создаем идентификатор #rightBox . Если мы просто пропишем в таблице css идентификатор #rightBox и применим его к правому блоку, то с удивлением обнаружим, что ничего не изменилось! Типичная ошибка, связаная со специфичностью. Дело в том, что к блоку применимы сразу два стилевых правила: #wrapper div и #rightBox . Первое из них более специфично, т.к. использует контекстный селектор. Чтобы все-таки переопределить первое правило, записываем идентификатор применительно к элементу div, выглядеть это будет вот так: div#rightBox . Теперь правила имеют одинаковую специфичность и применено будет то, которое записано последним. Если в результате перестановки правил в таблице стилей нужное нам правило окажется ближе к началу страницы, то оно опять не сработает.... Чтобы наше правило было определяющим, вне зависимости раньше или позже оно прописано в таблице, нужно сделать его более специфичным, например записывать так:

/* правый блок (5) */ #wrapper div#rightBox{ background:transparent; float:right; height:180px; width:137px; }

Параграф 1

Параграф 2

Второй блок (2) . Убираем фон, рамку делаем пунктирной. Класс - #old_position

/* второй блок (2) */ #wrapper div.old_position{ background:transparent; border-style:dashed; }

Четвертый блок (4) . Устанавливаем относительное позиционирование. Смещаем вниз-влево. Идентификатор - #test_box . Вопрос - на сколько нужно сместить блок (4) влево (от начальной позиции), чтобы имитировать сдвиг блока (2) вправо на 50px?
Расчет.
Сначала вычислим расстояние от левого края блока (4):
отступ слева + 3 блока с правым отступом и удвоенной рамкой

2 + 3 * (100 + 10 + 2)= 338px

Потом вычислим положение сдвинутого вправо псевдоблока (2):
отступ слева + 1 блок с правым отступом и удвоенной рамкой + псевдосдвиг

2 + (100 + 10 + 2) + 50 = 164px

В результате получаем реальный сдвиг:
338 - 164 = 174px

#wrapper #test_box{ position:relative; right:174px; top:30px; }

Параграфы . Почему на 1-ом этапе мы задали для параграфов clear:left ? Потому что нам нужно, чтобы они обтекали только правый блок (5). Можете поэкспериментировать: уберите очистку и сделайте ширину блоков меньшего размера. Текст параграфа "устремится" в образовавшийся зазор между блоками (4) и (5). Насчет блока (4): мы помним, что хоть визуально он и смещен, но продолжает занимать первоначальную позицию в потоке.
Второй параграф очищаем полностью и отменяем обтекание. Иногда, чтобы не создавать специально идентификатор или класс, проще прописать правило непосредственно в документе, в атрибуте соответствующего тега.

Параграф 1

Параграф 2

3-й этап

Рисуем указатели величины сдвига . Для этого помещаем внутри блока (2) еще один блок с таким же атрибутом class="old_position" . Чем повторять те же свойства в еще одном классе, правильнее применить уже существующий класс, а потом, путем добавлением к атрибуту нового класса или идентификатора, добавить недостающие свойства и переопределить имеющиеся. Еще раз напомню, что если мы планируем использовать какой-либо набор свойств многократно, то их нужно оформлять как класс, если однократно, то лучше как идентификатор.
Переопределять свойства будем в идентификаторе #pointer . Переопределяем цвет рамки, убираем верхнюю и левую рамку и добавляем размеры блока (вернее тоже переопределяем, но те, которые были установлены еще во #wrapper div )

/* внутри блока (2) */ div#pointer{ border-color:black; border-width:0 1px 1px 0; height:29px; width:49px; margin:0; }

left:50px top:30px

Параграф 1

Параграф 2

left:50px top:30px

Параграф 1

Параграф 2

Надписи, указывающие величину сдвига . Размещаем их внутри блока #pointer , применяем абсолютное позиционирование и смещаем в заданную позицию уже снаружи (за счет величины сдвига, превышающей размеры родителя, который никак на это не реагирует, потому что не видит абсолютно позиционированные элементы). Надписи заключаем в теги span , в качестве атрибута которых указываем класс caption . Мы помним, что плавающий или абсолютно позиционированный строчный тег автоматически становится блочным! Почему в данном случае удобнее применить тег span , а не div . Этим мы избавляем себя от необходимости переопределять ранее установленные для тегов div свойства, такие как рамка, фон и пр....
Если мы сейчас проверим, что у нас получилось, то, увы, не найдем своих надписей. Почему? Абсобютно позиционированные элементы находятся в не позиционированном родительском блоке! Значит они будут смещены относительно верхнего левого угла страницы. Вот там их и ищите.
Устанвливаем для родителя position:relative .

Два блока внутри блока (5) . Здесь совсем просто. Для определения стилевых правил используем конструкцию #rightBox div . Отменяем обтекание, устанавливаем размеры и отступы. Индивидуальные правила для каждого блока задаем прямо в атрибутах тегов.

/* внутри блока (5) */ #rightBox div{ width:50px; height:30px; float:none; margin:5px; }

4-й этап

Вставляем текст параграфов и названий блоков. В правом блоке (5) уменьшаем размер шрифта, а в блоках #4.1 и #4.2 выравниваем текст по правому краю.

/* добавляем размер шрифта, выравнивание текста */ #rightBox div{ ... font-size:75%; text-align:right; } #rightBox p{ font-size:75%; }

left:50px top:30px

Параграф под блоком, смещенным за счет внешнего отступа:
margin-top: -30px;
margin-left: 30px;

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

Cравнивая с блоками #4.1 и #4.2, размещенными справа, где блок #4.2 смещен вверх за счет отрицательного внешнего отступа, видим, что во втором случае элемент реально смещается, освобождая пространство для следующего за ним параграфа

Последние штрихи. Прозрачность . Иногда в презентационных целях можно тот или иной элемент сделать полупрозрачным. Регулировать прозрачность можно, используется свойство opacity , которому присваивается значение от 0 до 1 (1-не прозрачно). В браузерах IE свойство opacity не работает, и для этих же целей используется свойство filter , которому значение прозрачности присваивается следующим хитрым способом:
filter:alfa(opacity=80) , соотвестственно, от 0 до 100

Какой же способ применить нам? Оба. В CSS браузер игнорирует код, который не понимает, поэтому во всех браузерах, кроме IE, будет проигнорировано свойство filter , а в IE наоборот - opacity

/* добавляем прозрачность */ #wrapper #test_box{ ... opacity:0.8; filter:alpha(opacity=80); /** для браузеров IE **/ }

Порядок наложения позиционированных элементов друг на друга определяет z-index . Чем больше z-index (целые числа), тем выше элемент по оси Z. Отрицательные числа применять можно, но не желательно... не все браузеры любят...
Чтобы блок #4.1 был сверху, нужно присвоить ему больший z-index (по умолчанию - auto, т.е. последующие выводятся выше, чем предыдущие). Чтобы наложившийся блок не закрывал текст, делаем выравнивание по правому краю. Уменьшаем размер шрифта.

div#4.1

Оптимизация

В окончательном варианте документ будет выглядеть так:

Practicum 1

div#1
left:50px top:30px
div#3
div#2
div#4.1
div#4.2

Параграф под блоком, смещенным за счет внешнего отступа: margin-top: -30px; margin-left: 30px;

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

Cравнивая с блоками #4.1 и #4.2, размещенными справа, где блок #4.2 смещен вверх за счет отрицательного внешнего отступа, видим, что во втором случае элемент реально смещается, освобождая пространство для следующего за ним параграфа

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

/* В начале страницы обычно указывают */ /* назначении таблицы CSS */ #wrapper{ border:1px solid yellow; text-align:left; width:610px; } #wrapper div{ background-color:#484f6c; border:1px solid red; float:left; position:relative;/* делаем общим для всех DIV */ margin:2px 10px 0 0; width:100px; height:100px; } #wrapper p{ clear:left; padding:2px; } div#rightBox{ background:transparent; float:right; height:180px; width:137px; } #wrapper div.old_position{ background:transparent; border-style:dashed; } #wrapper #test_box{ /* position:relative; -убираем */ right:174px; top:30px; opacity:0.8; filter:alpha(opacity=80); /** for IE **/ } div#pointer{ border-color:black; border-width:0 1px 1px 0; margin:0; width:49px; height:29px; } span.caption,div#rightBox{ font-size:75%; /* делаем общим для группы селекторов */ } span.caption{ position:absolute; } #rightBox div{ float:none; /* font-size:75%; -убираем */ margin:5px; text-align:right; width:50px; height:30px; } #rightBox p{ /* font-size:75%; -убираем */ }

Прозрачность наследуется. Если элемент сделан полупрозрачным, то все дочерние элементы и текст тоже будут полупрозрачными. И вы не сможете сделать их непрозрачными, переопределив значение свойства.

Добиться определенного результата можно разными способами. Рассмотренный выше пример продемонстрировал всего лишь один из этих способов.

Классы и специфичность. С одной стороны, мы стараемся не плодить классы и идентификаторы, а за счет использования контекстных селекторов обходиться существующими. С другой, при большом уровне вложенности элементов (по принципу "матрешки"), специфичность может сильно усложнить стилевые правила и тем самым снизить читабельность кода. Нужно находить разумный компромисс. В нашем случае конструкцию #wrapper div вполне можно было бы заменить классом .className , указав его в атрибуте каждого блока (1) - (5), с последующим переопределением. Или вообще, вполне оправдано определить для каждого блока свой идентификатор, а общие значения свойств задать с помощью правила, использующего множественные селекторы.

Вы можете попробовать сделать это самостоятельно. Экспериментируйте.

Влад Мержевич

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

,

,

И др.

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

Пример 1. Использование блочных элементов

Блочные элементы

Lorem ipsum dolor sit amet...

Ut wisi enim ad minim veniam

В данном примере абзац (тег

) вставляется внутрь контейнера

, а ссылка (тег ) — в заголовок

. Кстати, ошибкой будет поступить наоборот — добавить

в контейнер (

Ut wisi

), поскольку тег
не относится к блочным элементам.

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

Ширина блочных элементов

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

в коде документа присутствует один, то он занимает всю свободную ширину окна браузера и ширина блока будет равна 100%. Стоит поместить один тег
внутрь другого, как ширина внутреннего тега начинает исчисляться относительно его родителя, т.е. внешнего контейнера.

Некоторые браузеры достаточно свободно трактуют понятие ширины, хотя в спецификации CSS четко указано, что ширина складывается из суммы следующих параметров: ширины самого блока (width ), отступов (margin ), полей (padding ) и границ (border ). В примере 2 показано создание слоя, в котором присутствуют все эти компоненты.

Пример 2. Ширина слоя

Ширина

Lorem ipsum dolor sit amet...

В результате данного примера получим слой шириной 342 пиксела. На рис. 1 показано, из чего складывается ширина слоя.

Рис 1. Ширина блочного элемента

В том случае когда в коде не указан, браузер Internet Explorer за ширину всего блока принимает значение свойства width .

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

Для получения универсального результата существует несколько подходов. В примере 3 продемонстрировано создание трех слоев, ширина которых определяется в процентах.

Пример 3. Ширина слоя в процентах

Ширина

Lorem ipsum dolor sit amet...

Lorem ipsum dolor sit amet...

Lorem ipsum dolor sit amet...

Результат примера показан на рис. 2.

Рис. 2. Отображение ширины слоев в браузере

Ширина первого слоя в данном примере (layer1 ) установлена как 100%, что приводит к отображению горизонтальной полосы прокрутки. Для второго слоя (layer2 ) ширина также задана 100%, но поля определяются для внутреннего абзаца (тег

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

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

Высота

С высотой блочных элементов дело обстоит аналогично ширине. Браузер за высоту слоя принимает значение свойства height и добавляет к нему еще значение margin , padding и border . Если высота слоя не установлена явно, то она вычисляется автоматически исходя из объема содержимого.

Допустим, для слоя установлена высота в пикселах, а содержимое слоя однозначно превышает указанную высоту (пример 4).

Пример 4. Высота слоя

Высота

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis te feugifacilisi.

Результат данного примера продемонстрирован на рис. 3.

Рис. 3. Высота блока в разных браузерах

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

Цвет фона

Цвет фона элемента проще всего устанавливать через универсальное свойство background . Фоном при этом заливается область, которая определяется значениями width , height и padding (рис. 4).

Рис. 4. Область слоя, которая заполняется фоновым цветом

Таким образом, margin не принимает участия в формировании цветной области.

Границы

Из-за разницы в подходах браузеров при формировании блочных элементов наблюдается и различие при отображении границ. Браузер Internet Explorer 7 проводит рамку внутри блока, а Firefox — снаружи. Но если использовать фоновую заливку, то увидим совершенно противоположную картину (рис. 5). А все потому, что Firefox (Opera) цвет фона устанавливает по внешнему краю границы, а Internet Explorer — по внутренней. Начиная с версии 8.0 Internet Explorer поменял стиль отображения рамки, она проводится внутри блока, как и в Firefox.

а. Internet Explorer 7

б. Firefox, Internet Explorer 8+

Рис. 5. Отображение рамки в браузерах

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

Пример 5. Пунктирная рамка

Рамка

Lorem ipsum dolor sit amet...

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

Резюме

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

Спецификация CSS определяет, что высота и ширина элемента определяется не только значениями height и width , но к ним еще плюсуется значение полей, отступов и границ. Браузеры в этом плане делятся на две части: одни поддерживают в этом вопросе спецификацию, другие же ее игнорируют и поступают по-своему. Это создает трудности разработчикам, которые желают делать универсальные веб-страницы. Можно только посоветовать ограниченно использовать свойства width и height , поскольку по умолчанию браузер применяет аргумент auto , который заставляет настраивать размеры элемента автоматически.