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

Позиционирование в 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 смотрит на родительский элемент для определения в какой группе элементов находится вершина стека, остальные браузеры используют глобальный контекст. Например:

<div style="z-index: 0"> <p style="z-index: 10"></p> </div> <img style="z-index: 5" />

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

Заключение

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

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

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

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

Опубликовано: 12.01.2010 Просмотров 74422 Ссылка на оригинал Tweet it!
15 comments  

Ирина

2010.04.16 17:14

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

basilkot

2010.04.16 17:45

  • Спасибо :)

Kvisaz.ru

2010.08.04 06:56

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

CSS горазло гибче в позицировании, чем я думал 10 лет :)

Чем я только думал эти 10 лет?!
 

Сергей

2010.11.13 23:03

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

basilkot

2010.11.13 23:28

  • Спасибо за ценное замечание, поправил в статье.

Ир

2010.12.10 23:48

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

Александр

2010.12.30 12:05

 Здравствуйте
Подскажите пожалуйста как в этом скрипте

<object height="120" align="middle" width="240" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param value="sameDomain" name="allowScriptAccess"/><param value="true" name="allowFullScreen"/><param value="http://navyfield.ru/file/banner/navy2_240x120.swf?path=http://navyfield.ru/?partner=1208" name="movie" /><param value="high" name="quality" /><param value="always" name="allowScriptAccess"/><embed height="120" align="middle" width="240" allownetworking="external" allowscriptaccess="always" type="application/x-shockwave-flash" allowfullscreen="true" quality="high" src="http://navyfield.ru/file/banner/navy2_240x120.swf?path=http://navyfield.ru/?partner=1208"/></object>

вставить вот это позиционирование
style="position: relative; left: 50px; top: 12px;
 

basilkot

2010.12.30 12:18

  • Например вставить его для объекта-обёртки:

    <style>
    .object-wrapper {position: relative; left: 50px; top: 12px;}
    </style>

    <div class="object-wrapper">
    <object ...>
    ...
    </object>
    </div>

Александр

2010.12.30 17:17

 Спасибо !!
Получилось
Но возникла следующая проблема, нужно такие две картинки разместить одна за другой горизонтально, ну и чтобы каждую картинку тоже можно было бы позиционировать.
И еще не могу понять почему в этом коде не меняется размер картинки height="120" align="middle" width="240"
Возможно потому что это Flash
 

jeka

2011.07.22 15:55

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

не = на
 

basilkot

2011.07.22 16:05

  • спасибо, исправил

and878

2012.02.17 18:33

 а подскажите код как в ccs фиксировать png изображения в разных местах сайта поверх всех слоев!? и выводить в шаблонах DLE! Cпасибо!!
 

Karmahem

2012.04.02 22:43

 Хорошая статья. Спасибо. Все понятно обсалютно. Только по z0index вопросов много. Но это отдельная тема и наверняка не маленькая.
 

basilkot

2012.04.02 23:25

  • тема следующей статьи) статья большая и оч. интересная, немного терпения)

Илья

2012.08.22 17:35

 Статья пролила свет на мое непонимание
 

Сергей Савельев

2012.09.14 19:22

 Если блоку задано относительное позиционирование и внутри него имеется блок с абсолютной позицией, как обязан вести себя последний? В Chrome и Firefox его позиция зависит от родительского и если у его родителя left = 10px и у него самого left = 10px, то реальная позиция относительно левого края равна 20px, но не в IE. Так вот вопрос который меня волнует, как сделать то же самое в IE?
 

jin

2012.10.14 13:21

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

Катя

2013.03.20 04:02

 Извините за беспокойство, что отнимаю у Вас время, но я никак не могу разобраться. Нужна Ваша помощь.
Размещаю окно поиска в блоге с помощью css. Переместила его возле страниц. Все нормально, работает. Стоит открыть сообщение блога, как окно поиска слетает со своего места и перемещается куда-то вниз. Как мне закрепить его на положенном месте, чтобы он никуда не перемещался?
 

basilkot

2013.03.20 19:25

  • Катя, напишите мне через обратную связь, я вам постараюсь помочь по почте.

Андрей

2014.02.20 13:06

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

basilkot

2014.02.20 16:44

  • Андрей, напишите мне на почту [email protected], попробую помочь при возможности.

Влад

2015.02.27 20:31

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

Оставить после себя комментарий

user

2016.12.03

Отправить сообщение:

Email

Сообщение

Бонус на первый депозит в слоте Грейт Пигсби Мегавейс дарит тебе онлайн казино Вавада! Переходи по ссылке и получай 100 бесплатных вращений на депозит до 1000$!