Липкое позиционирование (position: sticky)

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

Тренажер CSS

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

Список тем

Основы position: sticky

Сделайте так, чтобы элемент с классом `sticky-element` становился "липким" при прокрутке страницы. Он должен прилипать к самому верху области просмотра.

CSS
.container {
  height: 600px; /* Для создания прокрутки */
  padding-top: 50px;
  border: 1px solid #ccc;
}

.sticky-element {
  input1: input2;
  input3: 0;
  background-color: lightblue;
  padding: 15px;
  border: 1px solid blue;
  text-align: center;
}

.content {
  height: 800px; /* Дополнительный контент для прокрутки */
  padding: 20px;
  background-color: #f0f0f0;
}
HTML
<div class="container">
  <div class="sticky-element">Я липкий элемент</div>
  <div class="content">
    Прокрутите вниз, чтобы увидеть эффект...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
  </div>
</div>
Чтобы элемент стал "липким", используйте свойство `position` со значением `sticky`. Также необходимо указать смещение (например, `top`, `bottom`, `left` или `right`), чтобы определить точку "прилипания". В данном случае, чтобы элемент прилипал к верху, используйте `top: 0;`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкий элемент со смещением сверху

Заставьте элемент с классом `sticky-header` прилипать к верху страницы, но не вплотную, а с отступом в 20px от верхнего края области просмотра.

CSS
body {
  height: 1000px; /* Для создания прокрутки */
}

.sticky-header {
  input1: sticky;
  input2: 20px;
  background-color: lightcoral;
  padding: 10px;
  text-align: center;
  border-bottom: 2px solid darkred;
}

.main-content {
  padding: 20px;
  margin-top: 30px;
}
HTML
<div class="sticky-header">Липкий заголовок с отступом</div>
<div class="main-content">
  Основное содержимое страницы.
  <br><br>Прокручивайте вниз...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
</div>
Используйте `position: sticky` и свойство `top`. Значение `top` определяет расстояние от верхнего края области просмотра (или родителя с прокруткой), к которому прилипнет элемент. Установите `top: 20px;`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкий элемент внутри контейнера с прокруткой

Элемент с классом `sticky-item` должен прилипать к верху своего родительского контейнера (`scroll-container`), когда контейнер прокручивается, а не к верху всей страницы.

CSS
.scroll-container {
  height: 300px;
  width: 90%;
  overflow: auto; /* Включаем прокрутку для контейнера */
  border: 2px solid green;
  margin: 20px auto;
}

.sticky-item {
  input1: input2;
  input3: 0;
  background-color: lightgreen;
  padding: 10px;
  border-bottom: 1px solid darkgreen;
  text-align: center;
}

.container-content {
  height: 500px; /* Контент длиннее контейнера */
  padding: 15px;
}
HTML
<div class="scroll-container">
  <div class="sticky-item">Липкий внутри контейнера</div>
  <div class="container-content">
    Прокрутите этот контейнер...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
  </div>
</div>
Примените `position: sticky` и `top: 0;` к элементу `sticky-item`. Важно помнить, что `sticky` работает относительно ближайшего родительского элемента с прокруткой (у которого `overflow` установлено в `scroll`, `auto` или `overlay`). В данном HTML родитель `scroll-container` уже имеет `overflow: auto;`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Прилипание к низу области просмотра

Сделайте так, чтобы элемент с классом `sticky-footer` прилипал к нижнему краю области просмотра при прокрутке страницы вверх.

CSS
body {
  height: 1000px; /* Для создания прокрутки */
  display: flex;
  flex-direction: column;
}

.content-wrapper {
  flex-grow: 1; /* Занимает все доступное пространство */
  padding: 20px;
}

.sticky-footer {
  input1: sticky;
  input2: 0;
  background-color: gold;
  padding: 15px;
  text-align: center;
  border-top: 2px solid orange;
  margin-top: auto; /* Прижимает футер книзу, если контента мало */
}
HTML
<div class="content-wrapper">
  Основное содержимое страницы.
  <br><br>Прокручивайте вверх и вниз...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
</div>
<div class="sticky-footer">Липкий футер</div>
Используйте `position: sticky` и свойство `bottom` со значением `0`, чтобы элемент прилипал к нижнему краю.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Горизонтальное прилипание

В контейнере с горизонтальной прокруткой сделайте первый столбец (`sticky-column`) липким к левому краю контейнера.

CSS
.horizontal-scroll-container {
  width: 95%;
  overflow-x: auto; /* Включаем горизонтальную прокрутку */
  border: 1px solid purple;
  margin: 20px auto;
  background: #f9f9f9;
  white-space: nowrap; /* Предотвращаем перенос элементов */
}

.item {
  display: inline-block; /* Располагаем элементы в строку */
  width: 150px;
  height: 150px;
  margin: 10px;
  background-color: #eee;
  border: 1px solid #ccc;
  text-align: center;
  line-height: 150px;
  vertical-align: top;
}

.sticky-column {
  input1: input2;
  input3: 0;
  background-color: plum;
  border: 1px solid purple;
  z-index: 1; /* Чтобы был поверх других элементов при прокрутке */
}
HTML
<div class="horizontal-scroll-container">
  <div class="item sticky-column">Липкий столбец</div>
  <div class="item">Элемент 2</div>
  <div class="item">Элемент 3</div>
  <div class="item">Элемент 4</div>
  <div class="item">Элемент 5</div>
  <div class="item">Элемент 6</div>
</div>
Примените `position: sticky` к элементу `sticky-column`. Чтобы он прилипал к левому краю при горизонтальной прокрутке, используйте свойство `left` со значением `0`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Несколько липких элементов

Сделайте оба заголовка разделов (`section-title`) липкими. Каждый заголовок должен прилипать к верху области просмотра, когда до него доходит прокрутка.

CSS
body {
  height: 1200px; /* Для создания прокрутки */
}

.section {
  margin-bottom: 20px;
  border: 1px dashed #aaa;
  padding-top: 10px;
}

.section-title {
  input1: sticky;
  input2: 0;
  background-color: teal;
  color: white;
  padding: 8px 15px;
  margin-bottom: 10px;
}

.section-content {
  padding: 0 15px 15px 15px;
  height: 300px; /* Содержимое секций */
}
HTML
<div class="section">
  <h2 class="section-title">Заголовок Раздела 1</h2>
  <div class="section-content">
    Содержимое первого раздела...
  </div>
</div>

<div class="section">
  <h2 class="section-title">Заголовок Раздела 2</h2>
  <div class="section-content">
    Содержимое второго раздела...
  </div>
</div>

<div class="section">
  <h2 class="section-title">Заголовок Раздела 3</h2>
  <div class="section-content">
    Содержимое третьего раздела...
  </div>
</div>
Примените `position: sticky` и `top: 0;` к общему классу `section-title`. Когда один липкий элемент достигает другого липкого элемента с тем же смещением, он "выталкивает" предыдущий.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкий заголовок сайта

Создайте стандартный липкий заголовок для сайта. Элемент `header` должен оставаться видимым и прикрепленным к верху страницы при прокрутке.

CSS
body {
  height: 1500px; /* Длинная страница для прокрутки */
  margin: 0;
}

header {
  input1: input2;
  input3: 0;
  background-color: #333;
  color: white;
  padding: 15px;
  text-align: center;
  width: 100%; /* Растягиваем на всю ширину */
  box-sizing: border-box; /* Учитываем padding в ширине */
  z-index: 100; /* Чтобы был поверх другого контента */
}

main {
  padding: 20px;
}
HTML
<header>
  <h1>Липкий Заголовок Сайта</h1>
</header>

<main>
  <p>Начало основного контента...</p>
  <img src="https://naytikurs.ru/img/1.png" alt="Example Image 1" style="max-width:100%; height:auto;">
  <p>Прокручивайте вниз...</p>
  <br><br>...
  <br><br>...
  <br><br>...
  <img src="https://naytikurs.ru/img/2.png" alt="Example Image 2" style="max-width:100%; height:auto;">
  <br><br>...
  <br><br>...
  <br><br>...
  <p>Конец контента.</p>
</main>
Примените `position: sticky` и `top: 0;` к элементу `header`. Убедитесь, что у него есть фон, чтобы контент под ним не просвечивал.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкая боковая панель

В макете с двумя колонками сделайте боковую панель (`sidebar`) липкой. Она должна оставаться на месте при прокрутке основного контента (`main-content`), прилипая к верху с небольшим отступом.

CSS
.container {
  display: flex;
  align-items: flex-start; /* Важно для sticky внутри flex */
  gap: 20px;
  width: 95%;
  margin: 10px auto;
}

.main-content {
  flex-grow: 1;
  height: 1000px; /* Длинный контент для прокрутки */
  background-color: #f0f0f0;
  padding: 15px;
}

.sidebar {
  width: 120px;
  flex-shrink: 0;
  input1: sticky;
  input2: 10px; /* Отступ сверху */
  background-color: lightskyblue;
  padding: 15px;
  border: 1px solid dodgerblue;
}

.sidebar h3 {
  margin-top: 0;
}
HTML
<div class="container">
  <aside class="sidebar">
    <h3>Липкий Сайдбар</h3>
    <ul>
      <li>Ссылка 1</li>
      <li>Ссылка 2</li>
      <li>Ссылка 3</li>
    </ul>
     <img src="https://naytikurs.ru/img/4.png" alt="Example Image 4" style="max-width:100%; height:auto;">
  </aside>
  <main class="main-content">
    <h2>Основной контент</h2>
    <p>Прокручивайте эту область...</p>
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <p>Конец основного контента.</p>
  </main>
</div>
Примените `position: sticky` к элементу `sidebar`. Установите `top` с нужным значением отступа (например, `10px`). Важно, чтобы родительский контейнер (`container`) был достаточно высоким, чтобы вместить и основной контент, и сайдбар при прокрутке. `align-items: flex-start;` у flex-контейнера помогает правильно позиционировать `sticky` элемент.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкие заголовки таблицы

Сделайте заголовки (`<th>`) таблицы липкими, чтобы они оставались видимыми при вертикальной прокрутке содержимого таблицы.

CSS
.table-container {
  max-height: 250px; /* Ограничиваем высоту для прокрутки */
  overflow-y: auto; /* Включаем вертикальную прокрутку */
  border: 1px solid #ccc;
  width: 95%;
  margin: 15px auto;
}

table {
  width: 100%;
  border-collapse: collapse;
}

th, td {
  border: 1px solid #ddd;
  padding: 8px;
  text-align: left;
}

th {
  input1: input2;
  input3: 0;
  background-color: #f2f2f2; /* Фон для заголовков */
  font-weight: bold;
}
HTML
<div class="table-container">
  <table>
    <thead>
      <tr>
        <th>Заголовок 1</th>
        <th>Заголовок 2</th>
        <th>Заголовок 3</th>
      </tr>
    </thead>
    <tbody>
      <tr> <td>Данные 1.1</td> <td>Данные 1.2</td> <td>Данные 1.3</td> </tr>
      <tr> <td>Данные 2.1</td> <td>Данные 2.2</td> <td>Данные 2.3</td> </tr>
      <tr> <td>Данные 3.1</td> <td>Данные 3.2</td> <td>Данные 3.3</td> </tr>
      <tr> <td>Данные 4.1</td> <td>Данные 4.2</td> <td>Данные 4.3</td> </tr>
      <tr> <td>Данные 5.1</td> <td>Данные 5.2</td> <td>Данные 5.3</td> </tr>
      <tr> <td>Данные 6.1</td> <td>Данные 6.2</td> <td>Данные 6.3</td> </tr>
      <tr> <td>Данные 7.1</td> <td>Данные 7.2</td> <td>Данные 7.3</td> </tr>
      <tr> <td>Данные 8.1</td> <td>Данные 8.2</td> <td>Данные 8.3</td> </tr>
    </tbody>
  </table>
</div>
Примените `position: sticky` и `top: 0;` к элементам `th`. Чтобы `sticky` работал внутри таблицы, обычно требуется, чтобы таблица или ее контейнер имели установленную высоту и `overflow: auto;` или `overflow: scroll;`. Также не забудьте задать фон для `th`, чтобы текст под ними не просвечивал.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкий элемент и z-index

Сделайте элемент `sticky-element` липким к верху. Ниже есть другой элемент (`overlapping-element`), который может перекрыть липкий элемент при прокрутке. Убедитесь, что липкий элемент всегда остается поверх другого элемента.

CSS
body {
  height: 1000px; /* Для прокрутки */
}

.sticky-element {
  input1: sticky;
  input2: 0;
  background-color: salmon;
  padding: 15px;
  text-align: center;
  border-bottom: 2px solid darkred;
  input3: 10; /* Устанавливаем z-index */
}

.content {
  padding: 20px;
}

.overlapping-element {
  background-color: rgba(0, 0, 255, 0.7);
  color: white;
  padding: 30px;
  margin-top: -20px; /* Небольшое перекрытие для демонстрации */
  position: relative; /* Чтобы z-index мог сравниваться */
  z-index: 1; /* Ниже, чем у sticky-element */
}
HTML
<div class="sticky-element">Липкий элемент (должен быть сверху)</div>
<div class="content">
  <div class="overlapping-element">Это другой элемент</div>
  <p>Прокручивайте вниз...</p>
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
  <br><br>...
</div>
Примените `position: sticky` и `top: 0;` к `sticky-element`. Чтобы он гарантированно отображался поверх `overlapping-element`, добавьте свойство `z-index` с положительным значением (например, `z-index: 10;`). Помните, что `z-index` работает только для позиционированных элементов (включая `sticky`).
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкий элемент в группе

Внутри каждого раздела (`group`) есть заголовок (`group-header`). Сделайте так, чтобы каждый заголовок прилипал к верху, но только в пределах своего родительского раздела `group`.

CSS
body {
  height: 1200px;
}

.group {
  margin-bottom: 30px;
  padding-top: 10px;
  border: 1px solid navy;
  background-color: #eef;
}

.group-header {
  input1: sticky;
  input2: 0;
  background-color: navy;
  color: white;
  padding: 10px;
  margin-bottom: 10px;
}

.group-content {
  height: 250px;
  padding: 10px;
}
HTML
<div class="group">
  <h3 class="group-header">Заголовок Группы 1</h3>
  <div class="group-content">
    Содержимое группы 1...
    <img src="https://naytikurs.ru/img/5.png" alt="Example Image 5" style="max-width:100%; height:auto;">
  </div>
</div>

<div class="group">
  <h3 class="group-header">Заголовок Группы 2</h3>
  <div class="group-content">
    Содержимое группы 2...
  </div>
</div>

<div class="group">
  <h3 class="group-header">Заголовок Группы 3</h3>
  <div class="group-content">
    Содержимое группы 3...
    <img src="https://naytikurs.ru/img/6.png" alt="Example Image 6" style="max-width:100%; height:auto;">
  </div>
</div>
Примените `position: sticky` и `top: 0;` к элементам `group-header`. Поскольку `sticky` позиционируется относительно ближайшего родителя с прокруткой или просто ближайшего блочного родителя в потоке, заголовок будет оставаться липким только пока виден его родительский `group`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкий элемент и родительский overflow

Элемент `sticky-note` должен прилипать к верху страницы. Однако его родитель `wrapper` имеет свойство `overflow: hidden`, что мешает `sticky` работать должным образом. В этом задании просто примените `position: sticky` и `top` к `sticky-note`, чтобы увидеть, как `overflow` родителя влияет на него (он не будет прилипать к окну браузера).

CSS
body {
  height: 1000px; /* Для прокрутки */
}

.wrapper {
  overflow: hidden; /* Это свойство мешает sticky работать относительно viewport */
  padding: 20px;
  margin: 30px 10px;
  background-color: #eee;
  border: 1px solid #ccc;
}

.sticky-note {
  input1: input2;
  input3: 0;
  background-color: yellow;
  padding: 15px;
  border: 1px solid orange;
  text-align: center;
}

.wrapper-content {
  height: 300px;
  margin-top: 15px;
}
HTML
<div class="wrapper">
  <div class="sticky-note">Липкая заметка (внутри overflow:hidden)</div>
  <div class="wrapper-content">
    Содержимое внутри родителя...
    <br><br>...
    <br><br>...
  </div>
</div>
<p style="height: 500px; padding: 10px;">Контент вне родительского блока wrapper...</p>
Примените `position: sticky` и `top: 0;` к элементу `sticky-note`. Обратите внимание, что из-за `overflow: hidden` (или `scroll`, `auto`) у родителя `wrapper`, элемент `sticky-note` будет прилипать только к краям этого родителя, а не к краям окна браузера. В этом задании не требуется исправлять поведение, только применить `sticky`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

Липкий элемент с учетом padding родителя

Родительский элемент `padded-container` имеет внутренний отступ `padding-top`. Сделайте `sticky-element` липким так, чтобы он прилипал к верху `padded-container`, но оставался внутри области padding.

CSS
body {
  height: 1000px;
}

.padded-container {
  padding-top: 30px; /* Верхний отступ у родителя */
  border: 2px solid steelblue;
  background-color: #e0f0ff;
  margin: 20px 10px;
}

.sticky-element {
  input1: sticky;
  input2: 0;
  background-color: lightsteelblue;
  padding: 10px;
  text-align: center;
  border: 1px solid navy;
  margin-bottom: 15px; /* Отступ снизу от контента */
}

.container-content {
  height: 500px;
  padding: 10px;
}
HTML
<div class="padded-container">
  <div class="sticky-element">Липкий внутри padding</div>
  <div class="container-content">
    Содержимое контейнера...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
    <br><br>...
  </div>
</div>
Примените `position: sticky` к `sticky-element`. Чтобы он прилипал к верху контейнера, но учитывал его padding, установите `top: 0;`. Липкий элемент будет прилипать к краю "padding box" своего контейнера.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку
НайтиКурс.Ру