Как сделать эффект волны между карточками при наведении мыши
Эффект, когда при наведении мыши между двумя карточками граница превращается в волну, часто используется в современных веб-дизайнах для привлечения внимания. Этот приём основан на комбинации CSS-свойств: псевдоэлементов, анимации и clip-path. В этой статье мы подробно разберём, как реализовать такой визуальный эффект на чистом CSS без JavaScript.
Принцип работы эффекта волны
Основная идея заключается в том, чтобы при наведении курсора на область между двумя карточками (или на одну из них) создать иллюзию волнообразной границы. Это достигается за счёт наложения дополнительного слоя с волнообразным контуром, который анимируется или появляется по триггеру :hover. Ключевые технологии: CSS-псевдоэлементы (::before, ::after), clip-path для создания волны и transition для плавности.
Пошаговая реализация на CSS
1. Базовая разметка HTML
Создадим две карточки внутри контейнера. Важно, чтобы между ними был небольшой отступ, который будет служить областью для эффекта.
<div class="card-container">
<div class="card">Карточка 1</div>
<div class="card">Карточка 2</div>
</div>2. Стилизация контейнера и карточек
Зададим карточкам фиксированную ширину, отступы и фоновый цвет. Контейнер сделаем флекс-контейнером для выравнивания.
.card-container {
display: flex;
gap: 20px; /* Расстояние между карточками */
}
.card {
width: 200px;
height: 300px;
background: #f0f0f0;
border-radius: 10px;
position: relative;
overflow: hidden;
}3. Создание волны с помощью clip-path
Для имитации волны добавим псевдоэлементу волнообразный контур. Используем clip-path: polygon() с несколькими точками, создающими синусоиду.
.card::after {
content: '';
position: absolute;
top: 0;
left: 100%; /* Смещаем за правый край карточки */
width: 40px;
height: 100%;
background: #ff6b6b;
clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%, 20% 80%, 40% 90%, 60% 70%, 80% 85%, 100% 60%, 80% 40%, 60% 55%, 40% 35%, 20% 50%, 0% 30%);
transition: transform 0.3s ease;
opacity: 0;
}4. Анимация при наведении
При наведении на контейнер или на каждую карточку будем показывать псевдоэлемент и перемещать его в зону между карточками.
.card-container:hover .card::after {
opacity: 1;
transform: translateX(-20px); /* Сдвигаем волну в промежуток */
}Если нужно, чтобы волна появлялась только при наведении между карточками, можно использовать дополнительный элемент-триггер с абсолютным позиционированием между ними и реагировать на его :hover.
Альтернативный подход с SVG
Для более сложных волн (с плавной анимацией) лучше использовать SVG-фильтры или встроенный SVG-путь. Например, можно задать background-image: url("data:image/svg+xml,...") с волнообразным паттерном и анимировать его через background-position.
Советы по оптимизации и совместимости
- Браузеры:
clip-pathподдерживается всеми современными браузерами, но для старых версий используйте-webkit-clip-path. - Производительность: Избегайте анимации свойств, вызывающих перерисовку (layout). Используйте
transformиopacity. - Адаптивность: Размеры волны лучше задавать в
vwили%, чтобы эффект работал на мобильных устройствах.
Таким образом, эффект волны между карточками реализуется с помощью CSS-псевдоэлементов и clip-path. Этот метод не требует JavaScript и легко адаптируется под любые макеты. Экспериментируйте с формой волны, цветом и скоростью анимации для достижения уникального визуального стиля.