Компоненты/Рваная маска

Рваная маска

29 сентября 2026

Фото в рамке неровной SVG-маски с чуть волнистыми краями, которое плавно приближается при наведении.

Установка

npm install clsx tailwind-merge
pnpm add clsx tailwind-merge
yarn add clsx tailwind-merge
bun add clsx tailwind-merge

Файлы

clip-path-mask.tsx
НазадКарусель с маскойДалееЦветной архив

Изображение обрезано SVG-контуром с чуть неровными, будто вырезанными ножницами краями, поэтому обычная фотография выглядит как вклеенная в коллаж. Поверх снимка лежит лёгкое затемнение, а по центру можно разместить любую надпись.

При наведении фото внутри маски медленно приближается, а сама рамка остаётся на месте. Маска масштабируется вместе с блоком и сохраняет форму на любом размере.

Вручную

Скопируйте эти файлы в components/clip-path-mask/:

Общие помощники положите в lib/ проекта:

Проверьте алиас путей. Импорты в коде выше записаны как @/components/... и @/lib/.... Нужен алиас "@/*" на папку, где лежат components/ и lib/, в tsconfig.json — или поправьте импорты под свои пути.

Использование

import { ClipPathMask } from "@/components/clip-path-mask/clip-path-mask";

export function Cover() {
return (
  <ClipPathMask imgSrc="/photos/city.webp" hoverScale={1.15}>
    <h2 className="text-4xl font-semibold text-white">Город</h2>
  </ClipPathMask>
);
}

Пропсы

Пропс
Описание
imgSrc

Адрес изображения

Тип string

children?

Содержимое по центру поверх фото

Тип ReactNode

hoverScale?

Приближение при наведении, по умолчанию 1.1

Тип number

duration?

Длительность приближения в миллисекундах, по умолчанию 400

Тип number

overlayOpacity?

Затемнение фото от 0 до 1, по умолчанию 0.15

Тип number

className?

Классы рамки

Тип string