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

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

Тренажер CSS

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

Список тем

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

Создайте простую сетку изображений. Используйте 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`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

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

Добавьте простой 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-эффекта

Сделайте эффект изменения прозрачности из предыдущего задания плавным. Изменение `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`).
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

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

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

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)

Подготовьте основу для более сложного 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`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

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

Теперь сделайте так, чтобы наложение, созданное в предыдущем шаге, плавно появлялось при наведении курсора на элемент сетки (`.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`.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку

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

Добавьте текст внутрь элемента наложения (`.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

Перестройте сетку изображений, используя 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, для создания отступов.
Заполнить ответами все поля
Результат
Сообщения
Выполнить
Отметить решенным
Показать подсказку
НайтиКурс.Ру