Создание сетки изображений с hover-эффектами

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

Тренажер CSS

Эта серия упражнений поможет вам отточить навыки создания адаптивных сеток изображений с использованием CSS и добавления интерактивных эффектов при наведении курсора мыши. Вы начнете с базового расположения элементов, постепенно добавляя стилизацию, эффекты прозрачности, масштабирования и плавные переходы. Задания усложняются, вводя позиционирование для создания наложений и знакомство с CSS Grid для более гибкого управления сеткой. Каждое задание требует заполнить пропущенные части CSS-кода, чтобы достичь нужного визуального результата, который будет отображаться в iframe.

Список тем

Базовая сетка Flexbox

id: 37538_css-grid-hover-1

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

CSS
.image-grid {
  input1: flex;
  input2: wrap;
  gap: 10px; /* Отступ между элементами */
  padding: 10px;
  max-width: 370px; /* Ограничение ширины для iframe */
}

.grid-item {
  width: calc(50% - 5px); /* Два элемента в ряду с учетом gap */
  box-sizing: border-box;
}

.grid-item img {
  display: block;
  width: 100%;
  height: auto;
}
HTML
<div class="image-grid">
  <div class="grid-item"><img src="https://naytikurs.ru/img/1.png" alt="Image 1"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/2.png" alt="Image 2"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/4.png" alt="Image 4"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/5.png" alt="Image 5"></div>
</div>
Для создания flex-контейнера используйте свойство `display` со значением `flex`. Чтобы разрешить перенос элементов на новую строку, примените свойство `flex-wrap` со значением `wrap`. Для добавления отступов между элементами используйте свойство `gap`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку

Эффект прозрачности при наведении

id: 37538_css-grid-hover-2

Добавьте простой hover-эффект к изображениям из предыдущего задания. При наведении курсора мыши на изображение, оно должно становиться полупрозрачным. Используйте существующую разметку и стили сетки.

CSS
.image-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 10px;
  max-width: 370px;
}

.grid-item {
  width: calc(50% - 5px);
  box-sizing: border-box;
}

.grid-item img {
  display: block;
  width: 100%;
  height: auto;
  transition: opacity 0.3s ease; /* Добавим плавности для следующего шага */
}

/* Добавьте стили для наведения здесь */
.grid-item imginput1 {
  input2: 0.7;
}
HTML
<div class="image-grid">
  <div class="grid-item"><img src="https://naytikurs.ru/img/6.png" alt="Image 6"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/7.png" alt="Image 7"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/8.png" alt="Image 8"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/9.png" alt="Image 9"></div>
</div>
Чтобы применить стили при наведении курсора, используйте псевдокласс `:hover` для селектора изображения (`.grid-item img`). Для изменения прозрачности используйте свойство `opacity` со значением от 0 (полностью прозрачный) до 1 (непрозрачный). Например, 0.7.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку

Плавный переход для hover-эффекта

id: 37538_css-grid-hover-3

Сделайте эффект изменения прозрачности из предыдущего задания плавным. Изменение `opacity` должно происходить не мгновенно, а в течение короткого промежутка времени.

CSS
.image-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 10px;
  max-width: 370px;
}

.grid-item {
  width: calc(50% - 5px);
  box-sizing: border-box;
}

.grid-item img {
  display: block;
  width: 100%;
  height: auto;
  /* Добавьте свойство transition сюда */
  input1: opacity 0.3s ease;
}

.grid-item img:hover {
  opacity: 0.7;
}
HTML
<div class="image-grid">
  <div class="grid-item"><img src="https://naytikurs.ru/img/1.png" alt="Image 1"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/2.png" alt="Image 2"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/4.png" alt="Image 4"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/5.png" alt="Image 5"></div>
</div>
Для создания плавных переходов используется свойство `transition`. Его нужно применить к *основному* состоянию элемента (не к `:hover`). Укажите свойство, которое должно анимироваться (`opacity`), продолжительность анимации (например, `0.3s`) и функцию времени (например, `ease`).
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку

Эффект масштабирования при наведении

id: 37538_css-grid-hover-4

Замените эффект прозрачности на эффект легкого увеличения изображения при наведении. Изображение должно плавно масштабироваться.

CSS
.image-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 10px;
  max-width: 370px;
}

.grid-item {
  width: calc(50% - 5px);
  box-sizing: border-box;
  overflow: hidden; /* Скрываем выходящие за рамки части изображения */
}

.grid-item img {
  display: block;
  width: 100%;
  height: 120px; /* Зададим фиксированную высоту */
  object-fit: cover; /* Масштабируем изображение с сохранением пропорций */
  /* Обновите transition, чтобы включить transform */
  transition: input1 0.3s ease;
}

.grid-item img:hover {
  /* Примените масштабирование здесь */
  input2: scale(1.1);
}
HTML
<div class="image-grid">
  <div class="grid-item"><img src="https://naytikurs.ru/img/6.png" alt="Image 6"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/7.png" alt="Image 7"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/8.png" alt="Image 8"></div>
  <div class="grid-item"><img src="https://naytikurs.ru/img/9.png" alt="Image 9"></div>
</div>
Для масштабирования элемента используется функция `scale()` внутри свойства `transform`. Примените `transform: scale(1.1);` (или другое небольшое значение больше 1) к изображению в состоянии `:hover`. Не забудьте добавить `transform` в список свойств для `transition` в основном состоянии изображения, чтобы масштабирование было плавным.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку

Добавление наложения (Overlay)

id: 37538_css-grid-hover-5

Подготовьте основу для более сложного hover-эффекта. Добавьте полупрозрачное темное наложение (overlay) поверх каждого изображения. Изначально оно должно быть скрыто (полностью прозрачно).

CSS
.image-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 10px;
  max-width: 370px;
}

.grid-item {
  width: calc(50% - 5px);
  box-sizing: border-box;
  overflow: hidden;
  input1: relative; /* Контекст позиционирования для overlay */
}

.grid-item img {
  display: block;
  width: 100%;
  height: 120px;
  object-fit: cover;
  transition: transform 0.3s ease;
}

.grid-item .overlay {
  input2: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.6); /* Темное полупрозрачное наложение */
  input3: 0; /* Изначально скрыто */
  transition: opacity 0.3s ease;
  display: flex; /* Для выравнивания контента в будущем */
  align-items: center;
  justify-content: center;
}

.grid-item:hover img {
  transform: scale(1.1);
}

/* Стиль для показа overlay при наведении будет в следующем задании */
HTML
<div class="image-grid">
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/1.png" alt="Image 1">
    <div class="overlay"></div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/2.png" alt="Image 2">
    <div class="overlay"></div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/4.png" alt="Image 4">
    <div class="overlay"></div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/5.png" alt="Image 5">
    <div class="overlay"></div>
  </div>
</div>
В HTML добавьте `div` с классом `overlay` внутрь каждого `.grid-item`. Для позиционирования наложения поверх изображения используйте `position: absolute;` для `.overlay` и `position: relative;` для родительского `.grid-item`. Растяните наложение на весь родительский элемент (`top: 0; left: 0; width: 100%; height: 100%;`). Задайте ему темный фон (`background-color`) с некоторой прозрачностью (например, `rgba(0, 0, 0, 0.5)`). Изначально скройте его, установив `opacity: 0;`. Добавьте `opacity` в `transition` для `.overlay`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку

Показ наложения при наведении

id: 37538_css-grid-hover-6

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

CSS
.image-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 10px;
  max-width: 370px;
}

.grid-item {
  width: calc(50% - 5px);
  box-sizing: border-box;
  overflow: hidden;
  position: relative;
}

.grid-item img {
  display: block;
  width: 100%;
  height: 120px;
  object-fit: cover;
  transition: transform 0.3s ease;
}

.grid-item .overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.6);
  opacity: 0;
  transition: opacity 0.3s ease;
  display: flex;
  align-items: center;
  justify-content: center;
}

.grid-item:hover img {
  transform: scale(1.1);
}

/* Добавьте правило для показа overlay при наведении */
input1 .overlay {
  input2: 1;
}
HTML
<div class="image-grid">
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/6.png" alt="Image 6">
    <div class="overlay"></div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/7.png" alt="Image 7">
    <div class="overlay"></div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/8.png" alt="Image 8">
    <div class="overlay"></div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/9.png" alt="Image 9">
    <div class="overlay"></div>
  </div>
</div>
Используйте селектор `.grid-item:hover .overlay`. Внутри этого правила измените свойство `opacity` наложения на `1`, чтобы сделать его видимым. Плавность перехода уже должна быть настроена свойством `transition` у селектора `.overlay`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку

Добавление текста на наложение

id: 37538_css-grid-hover-7

Добавьте текст внутрь элемента наложения (`.overlay`). Текст должен быть белого цвета и центрирован внутри наложения как по горизонтали, так и по вертикали.

CSS
.image-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 10px;
  max-width: 370px;
}

.grid-item {
  width: calc(50% - 5px);
  box-sizing: border-box;
  overflow: hidden;
  position: relative;
}

.grid-item img {
  display: block;
  width: 100%;
  height: 120px;
  object-fit: cover;
  transition: transform 0.3s ease;
}

.grid-item .overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.6);
  opacity: 0;
  transition: opacity 0.3s ease;
  /* Свойства для центрирования текста */
  display: flex;
  input1: center; /* Вертикальное центрирование */
  input2: center; /* Горизонтальное центрирование */
  /* Свойство для цвета текста */
  input3: white;
  font-family: sans-serif;
  text-align: center; /* Доп. выравнивание для многострочного текста */
}

.grid-item:hover img {
  transform: scale(1.1);
}

.grid-item:hover .overlay {
  opacity: 1;
}
HTML
<div class="image-grid">
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/1.png" alt="Image 1">
    <div class="overlay">Эффект 1</div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/2.png" alt="Image 2">
    <div class="overlay">Эффект 2</div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/4.png" alt="Image 4">
    <div class="overlay">Эффект 3</div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/5.png" alt="Image 5">
    <div class="overlay">Эффект 4</div>
  </div>
</div>
В HTML добавьте текстовое содержимое внутрь каждого `div.overlay`. Чтобы стилизовать текст, добавьте правило для `.grid-item .overlay`. Установите `color: white;`. Горизонтальное и вертикальное центрирование уже должно работать благодаря `display: flex; align-items: center; justify-content: center;` у `.overlay`, добавленным в предыдущих шагах. Если их нет, добавьте эти свойства.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку

Создание сетки с помощью CSS Grid

id: 37538_css-grid-hover-8

Перестройте сетку изображений, используя CSS Grid вместо Flexbox. Создайте сетку с двумя колонками равной ширины. Сохраните отступы между элементами.

CSS
.image-grid {
  /* Используйте CSS Grid */
  input1: grid;
  /* Определите две равные колонки */
  input2: repeat(2, 1fr);
  gap: 10px;
  padding: 10px;
  max-width: 370px;
}

.grid-item {
  /* width больше не нужен, его определяет grid */
  overflow: hidden;
  position: relative;
}

.grid-item img {
  display: block;
  width: 100%;
  height: 120px;
  object-fit: cover;
  transition: transform 0.3s ease;
}

.grid-item .overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.6);
  opacity: 0;
  transition: opacity 0.3s ease;
  display: flex;
  align-items: center;
  justify-content: center;
  color: white;
  font-family: sans-serif;
  text-align: center;
}

.grid-item:hover img {
  transform: scale(1.1);
}

.grid-item:hover .overlay {
  opacity: 1;
}
HTML
<div class="image-grid">
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/6.png" alt="Image 6">
    <div class="overlay">Grid 1</div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/7.png" alt="Image 7">
    <div class="overlay">Grid 2</div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/8.png" alt="Image 8">
    <div class="overlay">Grid 3</div>
  </div>
  <div class="grid-item">
    <img src="https://naytikurs.ru/img/9.png" alt="Image 9">
    <div class="overlay">Grid 4</div>
  </div>
</div>
Для контейнера `.image-grid` установите `display: grid;`. Чтобы определить колонки, используйте свойство `grid-template-columns`. Для двух равных колонок можно использовать значение `1fr 1fr` или `repeat(2, 1fr)`. Свойство `gap` будет работать так же, как и во Flexbox, для создания отступов.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Показать подсказку
НайтиКурс.Ру