static relative absolute fixed
Только совместно с ним применяются свойства (искл. position: static;)
top bottom right left z-index
Одновременно могут присутствовать
margin transform float (искл. position: absolute; и position: fixed;)
<style type="text/css">
.primer {
border: 4px solid #456;
width: 200px;
background: #fff; position: fixed; position: static; position: relative; position: absolute; margin: 15px -15px -15px 15px; -moz-transform: translate(15px, 15px); -webkit-transform: translate(15px, 15px); -o-transform: translate(15px, 15px); -ms-transform: translate(15px, 15px); z-index: 100; float: left; top: 15px; bottom: 15px; right: 15px; left: 15px;}
</style>
<div class="primer"></div>
<style type="text/css">
.primer1 {
border: 4px solid #087e11;
width: 200px;
background: #e1e1e1; z-index: 200; position: relative;
}
</style>
<div class="primer1"></div>Введение
Элементы на веб-странице занимают определённое пространство. По аналогии с корабликами в игре "Морской бой". Между кораблями должны быть пустые клеточки - margin.

Для того, чтобы один элемент поместить поверх другого, нужно задать отрицательное значение для margin. Но тогда содержимое тегов будет накладываться друг на друга. С помощью свойств position и transform они как бы приподнимаются на уровень 2.
В естественном порядке нижние теги в коде показаны над верхними. Благодаря z-index на уровне 2 можно самим определить видимый элемент.

Статического позиционирование - position: static;
position: static используется по умолчанию и отменяет действие relative, absolute и fixed. Значения свойств top, bottom, right, left игнорируются. При отсутствии transform не учитывается и z-index.
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; margin: 0px -60px -30px 60px; z-index: 3; }
.svetlyi2 { background-color: #fff; width: 250px; z-index: 2; margin: 0px -30px -30px 30px; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; z-index: 1; }
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Относительное позиционирование - position: relative;
Тому блоку, которому мы присвоим position: relative будет отдан приоритет. Содержимое нижнего элемента скрывается.
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; margin: 0px -60px -30px 60px; position: relative;}
.svetlyi2 { background-color: #fff; width: 250px; margin: 0px -30px -30px 30px; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; }
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Для того, чтобы расположить блок Б поверх В, но ниже А, недостаточно присвоить и ему position: relative, поскольку в коде он стоит ниже блока А, а значит будет его перекрывать.
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; margin: 0px -60px -30px 60px; position: relative; }
.svetlyi2 { background-color: #fff; width: 250px; margin: 0px -30px -30px 30px; position: relative; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; }
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Нужно задать для элемента Б ещё и z-index меньше, чем у блока А.
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; margin: 0px -60px -30px 60px; position: relative; z-index: 2; }
.svetlyi2 { background-color: #fff; width: 250px; margin: 0px -30px -30px 30px; position: relative; z-index: 1; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; }
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Вместо margin при относительном позиционировании иногда лучше использовать свойства top, bottom, right, left. Точкой отсчёта для них является исходное положение элемента. При этом блок Б продолжает располагаться так, словно блок А находится на прежнем месте - он оставляет для него пустое пространство. Поэтому можно не колдовать с пустым div (подробнее).
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; top: 30px; left: 60px; position: relative; z-index: 2; }
.svetlyi2 { background-color: #fff; width: 250px; margin: 0px -30px -30px 30px; position: relative; z-index: 1; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; }
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Полная аналогия со свойством transform:translate css
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; transform: translate(60px, 30px); z-index: 2; }
.svetlyi2 { background-color: #fff; width: 250px; margin: 0px -30px -30px 30px; position: relative; z-index: 1; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; }
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Для встроенных элементов
Встроенные элементы margin не смещает вниз и вверх (подробнее). Только top, bottom
<style type="text/css">
.temnyi { background-color: #666; width:500px; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; top: 30px; position: relative; }
.svetlyi2 { background-color: #fff; width: 250px; }
</style>
<div class="temnyi">
<span class="svetlyi2">Б</span><span class="svetlyi1">А</span><span class="svetlyi2">Б</span>
</div>или<style type="text/css">
.temnyi { background-color: #666; width:500px; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; transform: translate(0px, 30px); }
.svetlyi2 { background-color: #fff; width: 250px; }
</style>
<div class="temnyi">
<span class="svetlyi2">Б</span><span class="svetlyi1">А</span><span class="svetlyi2">Б</span>
</div>Абсолютное и фиксированное позиционирование
Уже были подробно рассмотрены: position: absolute; и position: fixed;
Казалось бы, что блок с position: absolute должен находиться выше position: relative, но это нет так, тут действует естественный порядок. А значит z-index позволит между ними выбрать приоритетный элемент.
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; margin: 0px -60px -30px 60px; position: relative; }
.svetlyi2 { background-color: #fff; width: 250px; margin: 0px -30px -30px 30px; position: absolute; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; }
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Блок В игнорирует исходное положение блока Б, поскольку при position: absolute и position: fixed элемент перестаёт влиять на соседние теги ни посредством своей ширины/высоты, ни посредством float: left.
<style type="text/css">
.temnyi { background-color: #666; width:500px; text-align: center; font-size: 250%;}
.svetlyi1 { background-color: #ccc; width: 250px; margin: 0px -60px -30px 60px; position: relative; z-index: 2; }
.svetlyi2 { background-color: #fff; width: 250px; margin: 0px -30px -30px 30px; position: absolute; z-index: 1; }
.svetlyi3 { background-color: #f5f5dc; width: 250px; margin-top: 20px;}
</style>
<div class="temnyi">
<div class="svetlyi1">А</div>
<div class="svetlyi2">Б</div>
<div class="svetlyi3">В</div>
</div>Итоговая таблица
| отличительные свойства | position: static; | position: relative; transform: translate(); | position: absolute; | position: fixed; |
| наложение | элементы лучше не помещать друг на друга | элементы имеет приоритет видимости над static. Другие значения равнозначны. Видимым будет тот, кто ниже находится в коде, либо обладает большим значением z-index | ||
| точка отсчёта top, right, bottom и left | игнорируются | исходное положение элемента | край родительского элемента | край окна браузера |
| элементы вокруг | учитывают текущее положение элемента | учитывают исходное положение элемента | игнорируют положение элемента | |
| width: 100%; это ширина | элемента (для встроенного)/родительского элемента (для блочного) | родительского элемента с position не в значении static | окна браузера | |
| при прокрутки страницы элемент | перемещается | "прилипает" к заданному месту окна браузера | ||
А теперь для закрепления материала пощёлкайте по кнопкам в начале статьи, подумайте почему произошли именно такие изменения.
Нижние в коде блоки показаны над верхними блоками, но не перекрывают их. [w3.org]
<div class="raz"> <div>navy</div> <div>blue</div> <div>DodgerBlue</div> </div>
inline-элементы находятся над блочными элементами. И если в коде они ниже, то перекрывает блоки.
<div class="dva"> <div>navy</div> <div>blue</div> <div>DodgerBlue</div> </div>
Плавающие элементы находятся над нижестоящими элементами (искл. inline-элементы).
<div class="tri"> <div>navy</div> <div>blue</div> <div>DodgerBlue</div> </div>
11 комментариев: