ДокументацияCSSClip-path и маски в CSS: сложные формы и эффекты
Средний 7 мин чтения

Clip-path и маски в CSS: сложные формы и эффекты

Clip-path и CSS-маски — создание сложных форм обрезки, polygon, circle, ellipse, clip-path генератор, mask-image для декоративных эффектов.

clip-pathмаскиmaskpolygonSVG маскиобрезкаCSS

clip-path

Обрезает элемент по заданной форме. Всё за пределами формы невидимо:

.circle {
  clip-path: circle(50%);
}

.ellipse {
  clip-path: ellipse(40% 50% at 50% 50%);
}

.inset {
  clip-path: inset(20px 10px 30px 10px round 10px);
}

.polygon {
  clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
}

circle

clip-path: circle(50%);                      /* круг от центра */
clip-path: circle(100px at 25% 50%);         /* радиус 100px, центр смещён */

ellipse

clip-path: ellipse(60% 40% at 50% 50%);

inset — прямоугольник с отступами

clip-path: inset(10px);                      /* 10px со всех сторон */
clip-path: inset(10px 20px);                 /* вертикаль горизонталь */
clip-path: inset(0 round 16px);              /* с закруглением углов */

polygon — многоугольник

Координаты в % от элемента (X Y):

/* Треугольник */
clip-path: polygon(50% 0%, 100% 100%, 0% 100%);

/* Стрелка вправо */
clip-path: polygon(0% 0%, 75% 0%, 100% 50%, 75% 100%, 0% 100%);

/* Шестиугольник */
clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);

/* Звезда */
clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);

Анимация clip-path

.shape {
  clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
  transition: clip-path 0.5s ease;
}

.shape:hover {
  clip-path: polygon(50% 50%, 50% 50%, 50% 50%); /* «схлопнется» */
}

Обе формы должны иметь одинаковое количество точек — тогда анимация сработает.

Морфинг форм:

.morph {
  clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);
  transition: clip-path 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}

.morph:hover {
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}

SVG clipPath

Для сложных форм используйте SVG:

<svg width="0" height="0">
  <defs>
    <clipPath id="wave" clipPathUnits="objectBoundingBox">
      <path d="M0,0.8 C0.3,1 0.7,0.6 1,0.8 L1,1 L0,1 Z"/>
    </clipPath>
  </defs>
</svg>

<div class="wave-shape"></div>
.wave-shape {
  clip-path: url(#wave);
}

CSS-маски (mask)

Маскируют элемент изображением или градиентом. Белый = видимо, чёрный = скрыто:

.masked {
  -webkit-mask-image: url('/mask.svg');
  mask-image: url('/mask.svg');
  -webkit-mask-size: contain;
  mask-size: contain;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
}

Градиентная маска — плавное исчезновение

.fade-bottom {
  -webkit-mask-image: linear-gradient(to bottom, black 60%, transparent 100%);
  mask-image: linear-gradient(to bottom, black 60%, transparent 100%);
}

.fade-edges {
  -webkit-mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);
  mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);
}

Маска-растворение

.dissolve {
  -webkit-mask-image: url('/noise.png');
  mask-image: url('/noise.png');
  -webkit-mask-size: 200px;
  mask-size: 200px;
}

Свойства масок

.mask {
  mask-image: url('mask.svg');
  mask-mode: alpha;         /* alpha | luminance */
  mask-repeat: no-repeat;
  mask-position: center;
  mask-size: cover;
  mask-composite: add;      /* пересечение нескольких масок */
}

Короткая запись:

.mask {
  mask: url('mask.svg') center / cover no-repeat;
}

Практические примеры

Диагональная секция

.diagonal-section {
  clip-path: polygon(0 0, 100% 0, 100% 85%, 0 100%);
  padding: 4rem 0;
}

/* Обратная */
.diagonal-section-inverse {
  clip-path: polygon(0 15%, 100% 0, 100% 100%, 0 100%);
}

Карточка с фигурным краем

.card-featured {
  clip-path: polygon(0 0, 100% 0, 100% calc(100% - 24px), calc(100% - 24px) 100%, 0 100%);
}

Fade-out текст

.truncate-mask {
  -webkit-mask-image: linear-gradient(to right, black 70%, transparent);
  mask-image: linear-gradient(to right, black 70%, transparent);
  overflow: hidden;
  white-space: nowrap;
}

Reveal-анимация

.reveal {
  clip-path: inset(0 100% 0 0);
  transition: clip-path 0.8s ease;
}

.reveal.visible {
  clip-path: inset(0 0 0 0);
}

Поддержка

  • clip-path — отличная поддержка, -webkit- для старых Safari
  • mask — нужна поддержка через -webkit-mask-*, полная поддержка в современных браузерах
  • Для продакшна проверяйте на caniuse.com

Итог

  • clip-path: polygon() — основной инструмент для создания нестандартных форм
  • Анимация clip-path — плавная, требует одинаковое количество точек
  • mask-image с градиентом — плавное растворение краёв
  • SVG clipPath — для сложных кривых форм
  • Не забывайте -webkit- префиксы