Абсолютное позиционирование (position: absolute)

Тренажер по CSS для пользователей с начальным уровнем подготовки.

Тренажер CSS

Эта серия упражнений посвящена свойству `position: absolute` в CSS. Вы научитесь изымать элементы из обычного потока документа и точно позиционировать их относительно ближайшего позиционированного родителя или начального содержащего блока. Задания охватывают основы абсолютного позиционирования, использование свойств смещения (`top`, `right`, `bottom`, `left`) и управление порядком наложения элементов с помощью `z-index`. Вы будете дописывать недостающие части CSS кода, чтобы достичь нужного визуального результата, отображаемого во фрейме.

Список тем

Основы position: absolute

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

CSS
.box {
  width: 50px;
  height: 50px;
  background-color: red;
  /* Вставьте свойство и значение для абсолютного позиционирования */
  input1: input2;
}
HTML
<div class="box"></div>
<p>Этот текст находится под блоком в нормальном потоке.</p>
Чтобы элемент позиционировался абсолютно, необходимо использовать свойство `position` со значением `absolute`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Смещение сверху и слева

Теперь, когда синий квадрат позиционирован абсолютно, сместите его на 20 пикселей сверху и на 30 пикселей слева относительно его содержащего блока (в данном случае, это `body` или начальный блок).

CSS
.box {
  width: 60px;
  height: 60px;
  background-color: blue;
  position: absolute;
  /* Задайте смещение сверху */
  input1: 20px;
  /* Задайте смещение слева */
  input2: 30px;
}
HTML
<div class="box"></div>
Используйте свойства `top` и `left` для задания смещения от верхнего и левого края содержащего блока соответственно.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Смещение снизу и справа

Расположите зеленый квадрат в правом нижнем углу его содержащего блока. Он должен отстоять на 10 пикселей от нижнего края и на 15 пикселей от правого края.

CSS
.box {
  width: 40px;
  height: 40px;
  background-color: green;
  position: absolute;
  /* Задайте смещение снизу */
  input1: 10px;
  /* Задайте смещение справа */
  input2: 15px;
}
HTML
<div class="box"></div>
Для позиционирования относительно нижнего и правого краев используйте свойства `bottom` и `right`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Относительно родителя: подготовка

Чтобы дочерний элемент (`.child`) позиционировался абсолютно относительно родительского элемента (`.parent`), родитель должен иметь позиционирование, отличное от `static`. Сделайте так, чтобы `.parent` стал позиционированным.

CSS
.parent {
  width: 200px;
  height: 150px;
  background-color: lightgrey;
  margin: 20px;
  border: 1px solid #ccc;
  /* Задайте позиционирование родителю */
  input1: input2;
}

.child {
  width: 30px;
  height: 30px;
  background-color: orange;
  /* Позиционирование дочернего элемента будет в следующем задании */
}
HTML
<div class="parent">
  <div class="child"></div>
</div>
Чаще всего для родительского элемента, относительно которого будет позиционироваться дочерний, используют `position: relative`. Это делает его позиционированным, не изменяя его положения в потоке.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Абсолютно внутри родителя

Теперь, когда родительский элемент (`.parent`) позиционирован (из предыдущего задания), спозиционируйте дочерний элемент (`.child`) абсолютно. Он должен оказаться в правом верхнем углу родителя, с отступом 5px от верхнего и правого краев.

CSS
.parent {
  width: 200px;
  height: 150px;
  background-color: lightgrey;
  margin: 20px;
  border: 1px solid #ccc;
  position: relative; /* Родитель уже позиционирован */
}

.child {
  width: 30px;
  height: 30px;
  background-color: orange;
  /* 1. Задайте абсолютное позиционирование */
  input1: input2;
  /* 2. Задайте смещение сверху */
  input3: 5px;
  /* 3. Задайте смещение справа */
  input4: 5px;
}
HTML
<div class="parent">
  <div class="child"></div>
</div>
Задайте дочернему элементу `position: absolute`, а затем используйте `top` и `right` для смещения относительно краев родительского элемента.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Перекрытие элементов: z-index

Два квадрата (`.red` и `.blue`) позиционированы абсолютно и перекрываются. Сделайте так, чтобы синий квадрат (`.blue`) оказался поверх красного квадрата.

CSS
.box {
  width: 70px;
  height: 70px;
  position: absolute;
}

.red {
  background-color: red;
  top: 20px;
  left: 20px;
  /* z-index по умолчанию auto (или 0) */
}

.blue {
  background-color: blue;
  top: 40px;
  left: 40px;
  /* Задайте z-index больше, чем у красного блока */
  input1: 1;
}
HTML
<div class="box red"></div>
<div class="box blue"></div>
Используйте свойство `z-index` для управления порядком наложения позиционированных элементов. Элемент с большим значением `z-index` будет отображаться поверх элемента с меньшим значением.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Отрицательный z-index

Сделайте так, чтобы красный квадрат (`.red`) оказался позади обычного текста (`<p>`). Текст не позиционирован.

CSS
p {
  position: relative; /* Создаем контекст наложения для параграфа */
  z-index: 0; /* Чтобы быть уверенным, что он выше отрицательного z-index */
  background: rgba(255,255,255,0.7); /* Небольшой фон для наглядности */
  padding: 5px;
}

.red {
  width: 100px;
  height: 50px;
  background-color: red;
  position: absolute;
  top: 10px;
  left: 10px;
  /* Задайте отрицательный z-index */
  input1: -1;
}
HTML
<p>Этот текст должен быть поверх красного квадрата.</p>
<div class="red"></div>
Элементы с отрицательным значением `z-index` могут отображаться позади непозиционированных элементов в том же контексте наложения. Задайте красному квадрату отрицательный `z-index`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Иконка в углу контейнера

Разместите иконку (элемент `<img>` с классом `.icon`) в левом нижнем углу серого контейнера (`.container`). Отступы от краев должны быть 8px.

CSS
.container {
  width: 180px;
  height: 120px;
  background-color: #eee;
  border: 1px solid #ccc;
  margin: 20px;
  /* 1. Сделайте контейнер позиционированным */
  input1: relative;
}

.icon {
  width: 24px; /* Размер иконки не меняем */
  height: 24px;
  /* 2. Сделайте иконку абсолютно позиционированной */
  input2: absolute;
  /* 3. Задайте смещение снизу */
  input3: 8px;
  /* 4. Задайте смещение слева */
  input4: 8px;
}
HTML
<div class="container">
  <img src="https://naytikurs.ru/img/7.png" class="icon" alt="icon">
</div>
Убедитесь, что контейнер `.container` позиционирован (например, `position: relative`). Затем задайте иконке `position: absolute` и используйте свойства `bottom` и `left` для точного размещения.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Растягивание на всю высоту родителя

Сделайте так, чтобы синий элемент (`.side`) занимал всю высоту родительского контейнера (`.container`), находясь у левого края. Ширина элемента `.side` уже задана.

CSS
.container {
  width: 250px;
  height: 150px;
  background-color: lightyellow;
  border: 1px solid #ccc;
  margin: 20px;
  /* 1. Родитель должен быть позиционирован */
  input1: relative;
}

.side {
  width: 40px; /* Ширина задана */
  background-color: lightblue;
  /* 2. Абсолютное позиционирование */
  input2: absolute;
  /* 3. Привязка к верхнему краю */
  input3: 0;
  /* 4. Привязка к нижнему краю */
  input4: 0;
  /* 5. Привязка к левому краю */
  input5: 0;
}
HTML
<div class="container">
  <div class="side"></div>
  <p style="padding-left: 50px;">Основной контент...</p>
</div>
Чтобы абсолютно позиционированный элемент растянулся по высоте родителя, задайте ему `top: 0;` и `bottom: 0;`. Не забудьте, что родитель должен быть позиционирован.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Растягивание на всю ширину родителя

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

CSS
.container {
  width: 300px;
  height: 200px;
  background-color: #f0f0f0;
  border: 1px solid #ccc;
  margin: 20px;
  /* 1. Родитель должен быть позиционирован */
  input1: relative;
}

.header {
  height: 30px; /* Высота задана */
  background-color: orange;
  /* 2. Абсолютное позиционирование */
  input2: absolute;
  /* 3. Привязка к верхнему краю */
  input3: 0;
  /* 4. Привязка к левому краю */
  input4: 0;
  /* 5. Привязка к правому краю */
  input5: 0;
}
HTML
<div class="container">
  <div class="header"></div>
  <p style="padding-top: 40px;">Контент под шапкой...</p>
</div>
Чтобы абсолютно позиционированный элемент растянулся по ширине родителя, задайте ему `left: 0;` и `right: 0;`. Не забудьте, что родитель должен быть позиционирован.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Центрирование по горизонтали (простой способ)

Отцентрируйте фиолетовый блок (`.centered`) по горизонтали внутри его родителя (`.container`). Ширина блока `.centered` известна (80px). Родитель уже позиционирован.

CSS
.container {
  width: 250px;
  height: 100px;
  background-color: lightgreen;
  border: 1px solid #ccc;
  margin: 20px;
  position: relative; /* Родитель позиционирован */
}

.centered {
  width: 80px;
  height: 40px;
  background-color: purple;
  color: white;
  text-align: center;
  line-height: 40px;
  /* 1. Абсолютное позиционирование */
  input1: absolute;
  /* 2. Смещение левого края на 50% ширины родителя */
  input2: 50%;
  /* 3. Отрицательный отступ влево на половину ширины элемента */
  input3: -40px;
  /* Для наглядности можно добавить top */
  top: 20px;
}
HTML
<div class="container">
  <div class="centered">Центр</div>
</div>
Для центрирования по горизонтали абсолютно позиционированного элемента с известной шириной, можно задать `left: 50%;` и отрицательный `margin-left`, равный половине ширины элемента. В данном случае ширина 80px, значит `margin-left` должен быть -40px.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Всплывающая подсказка

Создайте простую всплывающую подсказку (`.tooltip-text`), которая появляется над текстом (`.tooltip-container`) при наведении. Подсказка должна быть спозиционирована абсолютно относительно контейнера.

CSS
.tooltip-container {
  display: inline-block; /* Чтобы контейнер был по размеру текста */
  border-bottom: 1px dotted black;
  cursor: help;
  margin: 50px;
  /* 1. Позиционируем контейнер */
  input1: relative;
}

.tooltip-text {
  width: 120px;
  background-color: black;
  color: #fff;
  text-align: center;
  border-radius: 6px;
  padding: 5px 0;
  /* 2. Абсолютное позиционирование */
  input2: absolute;
  z-index: 1;
  /* 3. Позиция над текстом (можно добавить небольшой отступ) */
  input3: 125%; /* 100% + отступ */
  /* 4. Горизонтальное центрирование */
  left: 50%;
  margin-left: -60px; /* Половина ширины (120px / 2) */

  /* Скрытие по умолчанию */
  visibility: hidden;
  opacity: 0;
  transition: opacity 0.3s;
}

/* Показ при наведении */
.tooltip-container:hover .tooltip-text {
  visibility: visible;
  opacity: 1;
}
HTML
<div class="tooltip-container">
  Наведи на меня!
  <span class="tooltip-text">Текст подсказки</span>
</div>
Контейнеру `.tooltip-container` задайте `position: relative`. Тексту подсказки `.tooltip-text` задайте `position: absolute`, `bottom: 100%` (чтобы она была над текстом), `left: 50%` и `transform: translateX(-50%)` для центрирования (или используйте `margin-left`). Изначально скройте подсказку (`visibility: hidden; opacity: 0;`) и показывайте при наведении на контейнер (`.tooltip-container:hover .tooltip-text`).
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку
НайтиКурс.Ру