Режем как боги: Магия CSS clip-path для сложных фигур
Слушай, помнишь те времена, когда дизайнер приносил макет с шестиугольными аватарками или диагональными секциями, и у тебя внутри всё сжималось? Ты сразу начинал прикидывать, сколько лишних div-ов придется наплодить и как не сойти с ума, подгоняя отступы. Забудь об этом. Мы живем в эпоху, когда браузеры научились работать с геометрией не хуже графических редакторов.
Сегодня разберем clip-path — свойство, которое позволяет обрезать элемент по любой заданной траектории, не затрагивая при этом соседние блоки и не создавая лишнего мусора в DOM. Это не просто «обрезалка», это инструмент для создания интерфейсов, которые выглядят дорого и современно.
Как мы страдали раньше
Если ты в вебе хотя бы лет пять, то наверняка помнишь эти костыльные войны. Чтобы сделать обычный треугольник или скошенный край, мы использовали:
- Border-hack: создание треугольников через нулевую ширину/высоту и прозрачные границы. Выглядело это как магия вуду, а поддерживать такой код было невозможно.
- Overflow: hidden + Transform: мы оборачивали контент в контейнер, наклоняли его через
skew, а потом возвращали контент в нормальное состояние обратным наклоном. Код превращался в математический ад. - Огромные PNG с прозрачностью: просто накладывали картинку поверх блока. Минус производительность, минус гибкость, плюс лишние килограммы трафика.
- SVG-маски: уже лучше, но подключать отдельный файл или вставлять огромный кусок XML в HTML ради одного скоса — это как стрелять из пушки по воробьям.
Как делать правильно в 2026 году
Сейчас всё решается одной строкой CSS. Свойство clip-path принимает несколько базовых функций: circle(), ellipse(), inset() и самую мощную — polygon(). Но если тебе нужно что-то совсем безумное, можно использовать функцию path(), которая принимает те же координаты, что и атрибут d в SVG.
Кстати, если ты хочешь, чтобы смена фигур происходила плавно, обязательно посмотри, как работает View Transitions API на чистом CSS. Это в сочетании с clip-path позволяет творить настоящие чудеса анимации без грамма JavaScript.
Для динамических интерфейсов я рекомендую связывать координаты полигонов с CSS-переменными. Это позволит менять форму элемента буквально на лету, просто обновляя одну цифру в стилях. О том, как грамотно организовать работу со значениями, мы уже упоминали в статье про идеальную темную тему с помощью CSS-переменных, принципы там те же — централизация и гибкость.
Готовый сниппет кода
Давай создадим стильную карточку с «откушенным» углом и сложной геометрией. Скопируй это в проект и посмотри, как аккуратно это выглядит:
.fancy-card {
width: 300px;
height: 200px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
/* Создаем сложный многоугольник:
отрезаем верхний правый угол и делаем скос снизу */
clip-path: polygon(
0% 0%,
80% 0%,
100% 20%,
100% 100%,
20% 100%,
0% 80%
);
transition: clip-path 0.3s ease-in-out;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
}
.fancy-card:hover {
/* При ховере меняем форму — плавно и красиво */
clip-path: polygon(
0% 20%,
20% 0%,
100% 0%,
100% 80%,
80% 100%,
0% 100%
);
}
Частая ошибка новичков
Главный капкан, в который попадают мидлы: clip-path обрезает всё, что находится вне области видимости, включая тени!
Если ты задашь элементу box-shadow, а потом применишь clip-path, твоя тень просто исчезнет, потому что она находится за пределами обрезаемого контура. Как это лечится? Вместо box-shadow используй фильтр filter: drop-shadow(...) на родительском элементе или на самом блоке. В отличие от обычной тени, drop-shadow учитывает обрезанную форму элемента и отрисовывает тень именно по контуру клипа.
И не забывай проверять доступность: если ты обрезаешь кнопку так, что текст становится нечитаемым или интерактивная зона оказывается слишком маленькой — это плохой UX. Режь смело, но с умом!
🔥 Больше фишек, готовых сниппетов и передовых подходов к CSS мы публикуем в нашем Telegram-канале. Подписывайтесь, чтобы не пропустить!