• Подход к позиционированию элементов css. Выравнивание по правому краю

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

    Материал данной статьи призван помочь начинающим веб-дизайнерам в освоении приемов верстки web-страниц.

    Из чего выбрать или методы

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

    • метод «Float»
    • метод «Inline-block»
    • метод «Table-cell»

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

    «Для рывка» или немного теории

    Все структурные элементы HTML можно условно разделить на:

    Инлайновые (встроенные) – типа img, span и им подобные. У нас нет возможности менять их фон и задавать им произвольные линейные размеры.

    Блочные – занимающие всю ширину родительского блока, всегда начинаются с новой строки – p, h, div .

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

    Метод «Float»

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

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

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

    Float: left (right) трансформирует блочный элемент в плавающий, выравнивает по левому (правому) краю родительского блока и устанавливает обтекание справа (слева) текстом и другими элементами.

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

    < html> < head> < meta charset= "utf-8" > < link rel= "stylesheet" media= "all" type= "text/css" href= "style.css" /> < body> < div class = "bblock" > Строим < div class = "bblock" > горизонтальный < div class = "bblock" > ряд < div class = "bblock" > из дивов

    И внешнюю таблицу стилей с следующим содержимым:

    div { float: left; /*Задаем обтекание*/ line- height: 120px; font- size: 40px; background: dodgerblue; color: white; margin- top: 60px; width: 320px; /*Фиксируем ширину блока*/ }

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

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

    float: right;

    Обратите внимание на надписи, расположенные в блоках. На первый взгляд может показаться, что пример отработал криво. Но на самом деле, браузер обработал код правильно: прочитал блоки сверху вниз, и сделал то, что мы от него просили - выровнял по правому краю. Учтите этот момент при использовании свойства float: right .

    Для того, чтобы прервать обтекание элементов с какого-то конкретного места, используйте строчку:

    < div style= "clear: both;" >

    В рассмотренном выше примере расстояния между блоками мы задавали при помощи отступа margin-right . Но что делать, если у вас при верстке страницы возникла задача: разместить блоки в ряд, центрировать их, да и еще чтобы отступы были только между ними, но никак не снаружи?

    Алгоритм действий следующий.

    < div class = "wrap" > < div class = "bblock" > Строим < div class = "bblock" > горизонтальный < div class = "bblock" > ряд < div class = "bblock" > из дивов

    Wrap { width: 1310px; /*фиксируем ширину обертки*/ margin: 0 auto; /*центрируем ее*/ background: darkgray; height: 120px; /*Задаем высоту обертки*/ } . bblock { float: left; /*Задаем обтекание*/ line- height: 120px; /*Высота строки + верт. центрирования текста*/ font- size: 40px; background: dodgerblue; color: white; width: 320px; /*Фиксируем ширину блока*/ margin- right: 10px; text- align: center; /*Центрируем текст по горизонтали*/ } . wrap : last- child { margin- right: 0px; /*Убираем поле последнего div-а*/ }

    В результате получаем такую картину:

    Ну что же, всех практических ситуаций не рассмотришь, по этому перейдем к общим особенностям.

    Важно!!!

    Метод «Inline-block»

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

    Встречайте, гвоздь программы – свойство display: inline-block .

    display: inline-block генерирует блочно-строчный элемент, который по сути является строчным, но сохраняет блочные свойства – позволяет изменять линейные размеры, задавать поля, отступы и т.д.

    Блочно-строчный элемент имеет следующие свойства:

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

    Рассмотрим пример создания простого навигационного меню, содержащего картинку и ссылку.

    < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 1 длиннее обычного < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 2 < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 3 < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 4

    Nav { display: inline- block; /*Задаем блочно-строчное отображение*/ width: 180px; /*задаем ширину блока*/ background: dodgerblue; } . string { text- align: center; /*Равняем текст по-горизонтали*/ }

    В результате получаем такую менюшку:

    Как видим, получилось кривовато... Но расстраиваться мы не намерены, по-этому применяем к нашим дивам CSS свойство vertical-align (подробнее см. ниже):

    vertical- align: top;

    Теперь наша навигационная панель выровнялась по верхней линии:

    Конечно, приведенный пример является примитивным, но я уверен, что на его основе вы сможете создать настоящий шедевр!!!

    Важно!!!

    • Для древних версий Firefox добавляем строчку:

      display: - moz- inline- stack;


      и оборачиваем элемент в дополнительную div-обертку.
    • IE 7 и более ранние версии - добавляем строчки:

      zoom: 1 ; /*задаем hasLayout*/ * display: inline; /*звездочка – хак для IE */ _height: 250px; /*в IE6 не работает min-height*/

    • Замечу, что на указанные строчки избирательно реагируют конкретные браузеры (на первую – Firefox, на остальные - IE).

    Метод «Table»

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

    Свойства display: table (table-cell , inline-table ), позволяют выполнять табличное форматирование элементов без применения HTML таблиц.

    Для горизонтального размещения блоков нам понадобится родительский элемент, имеющий свойство display: table , и дочерние элементы (ячейки), имеющие свойство display: table-cell :

    < div class = "wrap" > < div class = "bblock" > Строим < div class = "bblock" > табличный < div class = "bblock" > ряд < div class = "bblock" > из дивов

    Bblock { display: table- cell; font- size: 32px; width: 200px; height: 200px; background: gold; text- align: center; vertical- align: middle; } . wrap { display: table; border- spacing: 20px 20px; background- color: darkgray; }

    Важно!!!

    1. В отличии от методов «Inline-block» и «float», при уменьшении ширины окна веб-браузера, ячейки не перемещаются вниз.
    2. У вас нет возможности задавать свойство margin для ячеек псевдотаблицы.
    3. Кросс-браузерность. Свойства из семейства display: table* не поддерживаются IE6, IE7. Кроме того, в IE8 вы можете наблюдать динамическую ошибку рендеринга псевдотабличных элементов в виде рандомно пропадающих ячеек. Данная ошибка чаше всего проявляется при первичной прорисовке документа

    Вы все еще не понимаете как работает абсолютное позиционирование в CSS и теряете элементы на экране? Давайте разбираться в этой магии.

    Введение в позиционирование

    Когда вы устанавливаете position: absolute , на первый план выходит не сам элемент, а его родительский контейнер, ведь относительно него и осуществляется позиционирование в CSS. Сложность в том, что это не всегда непосредственный родитель элемента.

    Рассмотрим код с четырьмя дивами, вложенными друг в друга по принципу матрешки.

    < body >

    < div class = "box-1" >

    < div class = "box-2" >

    < div class = "box-3" >

    < div class = "box-4" > < / div >

    < / div >

    < / div >

    < / div >

    < / body >

    Блоки box-1 , box-2 и box-3 для красоты отцентрированы с помощью свойств margin: auto и свойств flex CSS. Блок box-4 остается в своей дефолтной позиции в потоке документа.

    body { display: flex; } .box-1, .box-2, .box-3 { display: flex; margin: auto; }

    body {

    Display : flex ;

    Box-1,

    Box-2,

    Box-3 {

    Display : flex ;

    Margin : auto ;

    Все 4 элемента имеют позиционирование по умолчанию. На данный момент верстка выглядит следующим образом:


    .box-4 без позиционирования

    Относительно чего позиционируем?

    Чтобы спозиционировать себя, элемент должен знать две вещи:

    • какой родитель станет точкой отсчета;
    • величину смещения относительно точки отсчета (сверху, снизу, справа или слева).

    Если определить position: absolute для box-4 , этот элемент покинет нормальный поток документа . Но сейчас он остается на своем месте, так как координаты смещения не заданы. Если в CSS ширина элемента не определена, она будет равна ширине его содержимого (плюс паддинги и рамка).


    .box-4 с абсолютным позиционированием без смещения

    Теперь добавим свойства top: 0 и left: 0 . Элемент должен определить, какой родительский контейнер станет точкой отсчета для этих координат. Ей становится ближайший элемент с нестатической позицией (чаще всего position: relative). box-4 начинает поочередно опрашивать своих предков. Ни box-3 , ни box-2 , ни box-1 не подходят, так как имеют позиционирование в CSS по умолчанию (unset).

    Если позиционированный предок не нашелся, элемент размещается относительно тела документа (body):


    .box-4 с абсолютным позиционированием. Родительские элементы без позиционирования

    Если установить position: relative для элемента box-1 , точкой отсчета станет он:


    .box-4 с абсолютным позиционированием. .box-1 с относительным позиционированием

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

    Как только точка отсчета нашлась, все, что выше нее в DOM-дереве, перестает иметь значение.

    Если установить position: relative также для box-2 , то box-4 будет позиционироваться относительно него, ведь этот предок ближе.


    .box-4 с абсолютным позиционированием. .box-2 с относительным позиционированием

    Аналогично и для контейнера box-3:

    При относительном позиционировании блока надо задать свойство position:relative и свойства смещения. Смещение в этом случае будет происходить не относительно "родительского" элемента (как при абсолютном позиционировании), а относительно самого блока в нормальном потоке. Это будет понятнее на примере. Пусть у нас есть html-страница с тремя div-ами:

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

    Давайте зададим в таблице стилей размеры и границы этих блоков:

    #blok1, #blok2, #blok3 { border:1px solid red; width:150px; height:50px; }

    Сейчас наша страница в браузере выглядит так:

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

    #blok1, #blok2, #blok3 { border:1px solid red; width:150px; height:50px; } #blok2{ position:relative; left:50px; top:25px; }

    Теперь наша страница выглядит так:

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

    Плавающие блоки

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

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

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

    • left - блок прижимается к левому краю, остальные элементы обтекают его с правой стороны.

    • right - блок прижимается к правому краю, остальные элементы обтекают его с левой стороны.

    • none - блок не перемещается и позиционируется согласно свойству position .
    Давайте посмотрим на примере. Пусть у нас есть html-страница со следующим кодом:

    Позиционирование блоков

    Текст блока 1

    И страница style.css со следующим кодом:

    #blok1{ border:1px solid red; width:150px; height:50px; }

    Сейчас наша страница в браузере выглядит так:

    Давайте сделаем наш блок плавающим и прижмем его к левому краю:

    #blok1{ border:1px solid red; width:150px; height:50px; float:left; }

    Теперь давайте прижмем блок к правому краю:

    #blok1{ border:1px solid red; width:150px; height:50px; float:right; }

    Теперь наша страница в браузере выглядит так:

    А что будет, если плавающих блоков на странице несколько? Давайте добавим в нашу html-страницу еще один блок:

    Позиционирование блоков

    Текст блока 1

    Текст блока 2

    Просто какие-то элементы на странице. Это может быть просто текст, ссылки, списки, картинки и т.д.

    И зададим им разные значения свойства float :

    #blok1{ border:1px solid red; width:150px; height:50px; float:left; } #blok2{ border:1px solid red; width:150px; height:50px; float:right; }

    Теперь наша страница в браузере выглядит так:

    А если у них будут одинаковые значения? Например:

    #blok1{ border:1px solid red; width:150px; height:50px; float:left; } #blok2{ border:1px solid red; width:150px; height:50px; float:left; }

    Тогда второй блок прижмется к правому краю первого блока:

    Аналогична будет ситуация при одинаковых значениях right :

    #blok1{ border:1px solid red; width:150px; height:50px; float:right; } #blok2{ border:1px solid red; width:150px; height:50px; float:right; }

    Обратите внимание: сначала к правому краю прижмется блок 1, а уже к нему прижмется блок 2.

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

    • left - блок должен располагаться ниже всех левосторонних блоков.

    • right - блок должен располагаться ниже всех правосторонних блоков.

    • both - блок должен располагаться ниже всех плавающих блоков.

    • none - никаких ограничений нет, это значение по умолчанию.

    Давайте в нашем последнем примере зададим это свойство для второго блока:

    #blok1{ border:1px solid red; width:150px; height:50px; float:right; } #blok2{ border:1px solid red; width:150px; height:50px; float:right; clear:right; }

    Теперь получилось так, как и хотелось: один блок под другим:

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

    Давайте посмотрим, как ее можно сделать с помощью плавающих блоков. Итак, код самой страницы следующий:

    Позиционирование блоков

    шапка сайта

    Контент

    блок новостей

    низ сайта

    На странице style.css зададим сначала размеры и фон для наших блоков:

    #header{ background:darkred; width:715px; height:100px; } #menu{ background:oldlace; width:190px; height:300px; } #content{ background:oldlace; width:525px; height:300px; } #footer{ background:darkred; width:715px; height:30px; } #news{ background:yellow; width:150px; height:280px; }

    Сейчас наши блоки располагаются в нормальном потоке, т.е. один под другим. Нам надо сделать блоки menu и content плавающими и левосторонними. А блок news должен прижиматься к правому краю, т.е. его мы сделаем правосторонним плавающим блоком:

    #header{ background:darkred; width:715px; height:100px; } #menu{ background:oldlace; width:190px; height:300px; float:left; } #content{ background:oldlace; width:525px; height:300px; float:left; } #footer{ background:darkred; width:715px; height:30px; } #news{ background:yellow; width:150px; height:280px; float:right; }

    Наша страница в браузере выглядит так:

    Посмотрим на наш блок новостей, видно, что он располагается ниже текста в блоке content . А ведь мы хотели, чтобы блок новостей был справа, а текст обтекал бы его слева.

    Почему же у нас так не получилось? Потому что наш блок news в html-коде располагается ниже текста и его будет обтекать только тот текст, который расположен ниже его. Чтобы исправить это надо поместить наш div="news" выше текста (т.е. до слова "контент"):

    Позиционирование блоков

    шапка сайта

    блок новостей

    Контент

    низ сайта

    Вот теперь наш блок новостей находится на своем месте:

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

    #news{ background:yellow; width:150px; height:280px; float:right; margin:10px; }

    Теперь мы добились такого же резельтата, как и при абсолютном позиционировании.

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

    Фиксированные блоки

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

    У фиксированных блоков есть один существенный недостаток: они не поддерживаются браузерами Internet Explorer. А потому использовать их пока не следует. Поэтому здесь мы лишь укажем синтаксис такого правила, если хотите попробуйте сами (например, в браузере Opera).

    #blok{ position:fixed; left:0px; top:0px; }

    Блок с идентификатором "blok" будет при прокрутке страницы оставаться на месте.

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

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

    Box-модель в CSS и типы позиционирования.

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

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

    Свойство position в CSS может принимать пять значений:

    • absolute
    • relative
    • fixed
    • static
    • inherit

    Значение static используется по умолчанию. Любой элемент с позиционированием static находится в общем потоке документа. Правила для его размещения определяются Box-моделью. Для таких элементов, свойства top , right , bottom и left будут игнорироваться. Для того, чтобы использовать эти свойства, позиционирование элемента должно быть абсолютным (absolute), относительным (relative) или фиксированным (fixed).

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

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

    Абсолютное позиционирование удаляет элемент из общего потока документа. Что касается элементов вокруг, то в этом случае они просто игнорируют искомый, как будто ему установлено свойство display: none; . Если вы не хотите чтобы пространство для такого элемента заполнялось другими элементами, то вам надо придумать другой подход.

    Вы устанавливаете расположение элемента с абсолютным позиционированием, используя свойства top , left , right и bottom . Вам достаточно указать два из них, top или bottom и left или right. Если ни одного свойства не указано, то устанавливается 0 для пары top-left.

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

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

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

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

    Представьте себе это так: некое изображение сдвигается, а на его месте остаётся "призрак", все элементы располагаются относительно этого "призрака". Это позволяет нам накладывать элементы друг на друга.

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

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

    Фиксированное позиционирование

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

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

    Второе отличие исходит из его названия. Фиксированные элементы зафиксированы на странице. Они не смещаются при её прокручивании.

    Z-index

    Страница сайта двумерна. У неё есть ширина и высота. Z-index добавляет третье измерение, глубину.

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

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

    Проблемы позиционирования.

    Рассмотрим несколько общих проблем, связанных с позиционированием, а также несколько слов об их решении.

    1. Вы не можете одновременно использовать свойство position и свойство float для одного и того же элемента. Оба эти свойства влияют на позицию элемента, поэтому использоваться будет свойство, указанное последним.

      Из комментариев:

      Одновременно можно использовать position:relative и float.

      Когда одновременно указывается position:absolute и float, то применяется не последнее указанное свойство. В этом случае, независимо от порядка следования этих стилей, применяется position:absolute, а итоговое (или вычисленное) значение свойства float устанавливается в none, независимо от начального значения, т.е. игнорируется.

    2. Внешние отступы не "схлопываются" у элементов с абсолютным позиционированием. Допустим на странице есть параграф с нижним отступом в 20px. Следом за ним размещается картинка с верхним полем 30px. Расстояние между картинкой и текстом будет не 50px (20px + 30px), а 30px (30px > 20px). Такое поведение называется collapsing margins . Два отступа комбинируются в один. У элементов с абсолютным позиционированием нет полей для "схлопывания", поэтому результат может отличаться от ожидаемого.
    3. IE и z-index. В IE6 выбор элемент происходит всегда на вершине стека, независимо от его z-index -а, z-index -ов окружающих элементов.

    В IE6 и IE7 есть ещё одна проблема с z-index -ом. IE смотрит на родительский элемент для определения в какой группе элементов находится вершина стека, остальные браузеры используют глобальный контекст. Например:

    Мы ожидаем, что параграф будет находиться выше, чем изображение, поскольку его z-index больше. Однако IE6 и IE7 располагают выше картинку, поскольку они находятся в разных стеках документа. Один стек для div , второй для img , а у картинки z-index выше, чем у div -а.

    Заключение

    Свойство position устанавливает поведение расположения элемента в соответствии с одной из схем позиционирования. Доступные значения свойства: absolute , relative , fixed , static (по умолчанию) и inherit .

    Схемы позиционирования определяют правила размещения элемента на web-странице, а также влияние на расположение соседних элементов.

    Свойство z-index может быть применено только для элементов с установленным свойством position . Оно добавляет третье измерение на странице и устанавливает порядок стека элементов.

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

    CSS рассматривает макет html-документа как дерево элементов. Уникальный элемент, у которого нет родительского элемента, называется корневым элементом. Модуль CSS-позиционирование описывает, как любой из элементов может быть размещен независимо от порядка документа (т.е. извлечен из «потока»).

    В CSS2 каждый элемент в дереве документа генерирует ноль или более блоков в соответствии с блочной моделью. Модуль CSS3 дополняет и расширяет схему позиционирования. Расположение этих блоков регулируется:

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

    Схемы позиционирования

    В CSS блок элемента может быть расположен в соответствии с тремя схемами позиционирования:

    1. Нормальный поток

    Нормальный поток включает блочный контекст форматирования (элементы с display block , list-item или table), строчный (встроенный) контекст форматирования (элементы с display inline , inline-block или inline-table), и относительное и «липкое» позиционирование элементов уровня блока и строки.

    2. Обтекание

    В обтекающей модели блок удаляется из нормального потока и позиционируется влево или вправо. Содержимое обтекает правую сторону элемента с float: left и левую сторону элемента с float: right .

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

    В модели абсолютного позиционирования блок полностью удаляется из нормального потока и ему присваивается позиция относительно содержащего блока. Абсолютное позиционирование реализуется с помощью значений position: absolute; и position: fixed; .

    Элементом «вне потока» может быть плавающий, абсолютно позиционированный или корневой элемент.

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

    Для некорневого элемента с position: static; или position: relative; его содержащий блок формируется краем области содержимого ближайшего родительского блока уровня блока, ячейки таблицы или уровня строки.

    Для некорневого элемента с position: absolute; его содержащим блоком устанавливается ближайшего родительский элемент со значением position , отличным от static следующим образом:

    • если предок — элемент уровня блока, содержащим блоком будет область содержимого плюс поля элемента padding ;
    • если предок — элемент уровня строки, содержащим блок будет область содержимого;
    • если предков нет, то содержащий блок элемента определяется как начальный содержащий блок.

    Для «липкий» блока содержащим блоком является ближайший предок с прокруткой или окна просмотра, в противном случае.

    2. Выбор схемы позиционирования: свойство position

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

    Свойство не наследуется.

    position
    Значение:
    static Блок располагается в соответствии с нормальным потоком. Свойства top , right , bottom и left не применяются. Значение по умолчанию.
    relative Положение блока рассчитывается в соответствии с нормальным потоком. Затем блок смещается относительно его нормального положения и во всех случаях, включая элементы таблицы, не влияет на положение любых следующих блоков. Тем не менее, такое смещение может привести к перекрытию блоков, а также к появлению полосы прокрутки в случае переполнения.

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

    Относительно позиционированный блок создает новый содержащий блок для абсолютно позиционированных потомков.

    Влияние position: relative; на элементы таблицы определяется следующим образом:
    Элементы с table-row-group , table-header-group , table-footer-group иd table-row смещаются относительно их обычной позиции в таблице. Если ячейки таблицы занимают несколько строк, смещаются только ячейки начальной строки.
    table-column-group , table-column не смещает соответствующий столбец и не оказывает визуального влияния.
    table-caption and table-cell смещаются относительно своего нормального положения в таблице. Если ячейка таблицы охватывает несколько столбцов или строк, то она смещается целиком.

    absolute Положение блока (и, возможно, размер) задается с помощью свойств top , right , bottom и left . Эти свойства определяют явное смещение относительно его содержащего блока. Абсолютно позиционированные блоки полностью удаляется из нормального потока, не влияя на расположение сестринских элементов.

    Отступы margin абсолютно позиционированных блоков не схлопываются.

    Абсолютно позиционированный блок создает новый содержащий блок для дочерних элементов нормального потока и потомков с position: absolute; .

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

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

    «Липкий» блок может перекрывать другие блоки, а также создавать полосы прокрутки в случае переполнения.

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

    «Липкий» блок создает новый содержащий блок для абсолютно и относительно позиционированных потомков.

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

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

    initial Устанавливает значение свойства в значение по умолчанию.
    inherit Наследует значение свойства от родительского элемента.

    Синтаксис

    Position: static; position: relative; position: absolute; position: sticky; position: fixed; position: initial; position: inherit;
    Рис. 1. Разница между статичным, относительным и абсолютным позиционированием

    3. Смещение блока: свойства top, right, bottom, left

    Элемент считается позиционированным, если свойство position имеет значение, отличное от static . Позиционированные элементы генерируют позиционированные блоки и могут быть расположены в соответствии со следующими четырьмя физическими свойствами:

    Синтаксис

    Top: 10px; top: 2em; top: 50%; top: auto; top: inherit; top: initial;

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

    Синтаксис

    Right: -10px; right: .5em; right: -10%; right: auto; right: inherit; right: initial;

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

    Синтаксис

    Bottom: 50px; bottom: -3em; bottom: -50%; bottom: auto; bottom: inherit; bottom: initial;

    Свойство bottom указывает расстояние, на которое нижний край блока смещен вверх относительно нижнего края содержащего блока. Для относительно позиционированных блоков определяет смещение относительно нижнего края самого блока.

    Синтаксис

    Left: 50px; left: 10em; left: 20%; left: auto; left: inherit; left: initial;

    Свойство left указывает расстояние, на которое левый край смещен вправо от левого края содержащего блока. Для относительно позиционированных блоков определяет смещение относительно левого края самого блока.

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

    4. Обтекание: свойство float

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

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

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

    Свойство не наследуется.

    Синтаксис

    Float: left; float: right; float: none; float: inherit;

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

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

    Свойство автоматически изменяет вычисляемое (отображаемое в браузере) значение свойства display на display: block для следующих значений: inline , inline-block , table-row , table-row-group , table-column , table-column-group , table-cell , table-caption , table-header-group , table-footer-group . Значение inline-table меняет на table .

    Свойство не оказывает влияние на элементы с display: flex и display: inline-flex . Не применяется к абсолютно позиционированным элементам.


    Рис. 3. Обтекание элементов

    5. Управление потоком рядом с плавающими элементами: свойство clear

    Свойство clear указывает, какие стороны блока/блоков элемента не должны прилегать к плавающим блокам, находящемся выше в исходном документе. В CSS2 и CSS 2.1 свойство применяется только к неплавающим элементам уровня блока.

    Свойство не наследуется.

    Синтаксис

    Clear: none; clear: left; clear: right; clear: both; clear: inherit;

    Для предотвращения отображение фона или границ под плавающими элементами используется правило {overflow: hidden;} .

    6. Определение контекста наложения: свойство z-index

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

    Рис. 1. Положение элементов вдоль оси Z

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

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

    Свойство z-index позволяет изменить способ наложения элементов друг на друга.

    Свойство не наследуется.

    Синтаксис

    Z-index: auto; z-index: 0; z-index: 5; z-index: 999; z-index: -1; z-index: inherit; z-index: initial;