Свойство clip-path создаёт область отсечения: внутри неё контент видно, а вне её - нет. Вот простой пример круга с применением clip-path.
.card { background-color: #77cce9; clip-path: circle(80px at 50% 50%); }
Когда применяется clip-path, видимой областью оказывается только синий круг. Мы не видим ничего за пределами круга. Вот анимация, которая показывает отсечение круга из примера выше:
Система координат
Прежде чем углубляться в детали clip-path, стоит упомянуть о том, как работает система координат. Начало координат - это верхний левый угол, ось x направлена вправо, а ось y - вниз.
Учитывая это, чтобы увидеть, как обрезается элемент, давайте возьмём простой пример. В нём обрезанная область - это круг размером 100 px, его центр расположен в точке 0,0 (вверху слева).
Обратите внимание, что пользователь видит только выделенную тёмно синюю область. Оставшаяся часть круга обрезана. Вопрос в том, как сделать видимым весь круг? Для этого нужно изменить точки осей x и y.
Центр круга расположен в 100 px левее и 100 px выше. Теперь, когда вы понимаете, как работает система координат, я расскажу о возможных значениях свойства clip-path.
Значения clip-path
- inset
Значение inset определяет вставляемый прямоугольник. Мы можем контролировать четыре края, точно так же, как это делается с краями или отступом. В примере ниже .card имеет свойство inset 20px со всех краёв (сверху, справа, снизу и слева).
.card { clip-path: inset(20px); }
Если нужно, подправьте inset с одного из краёв. Вот пример, как это сделать:
.card { clip-path: inset(20px 20px 50px 20px); }
Выше класс .card имеет свойство inset со значением 50px снизу.
Вопрос в том, возможна ли округлая вставка? Да! Благодаря ключевому слову round. Добавление ключевого слова слева от радиуса округляет углы, вот так: round <border-radius>.
.card { clip-path: inset(20px 20px 50px round 15px); }
Кроме того, мы даже можем настроить радиус каждой стороны отдельно. Вот пример с нулевым радиусом верхнего правого и нижнего левого углов.
.card { clip-path: inset(20px 20px 50px round 15px 0); }
- circle()
Чтобы использовать значение circle(), нам понадобится радиус и его положение. Вот пример:
.card { clip-path: circle(80px at 50% 50%); }
Радиус окружности равен 80px, и она позиционирована так: 50% на оси x, 50% на оси y.
- ellipse()
С помощью функции ellipse() мы можем установить ширину и высоту, чтобы сделать отсечение овальным
.card { clip-path: ellipse(100px 80px at center); }
- polygon()
Самое интересное для меня значение - polygon(). Можно управлять несколькими наборами значений по осям x и y.
.card { clip-path: polygon(x y, x y, x y, x y); }
Вот пример, где polygon() используется, чтобы обрезать прямоугольник. Обратите внимание, что я сопоставил каждый набор точек с его координатами на осях.
.card { clip-path: polygon(5% 5%, 95% 5%, 95% 95%, 5% 95%); }
Используя значение polygon(), можно рисовать сложные фигуры с несколькими точками.
- path()
Значение path() позволяет использовать элемент SVG, чтобы обрезать определённую область. Сейчас его поддержка браузером непоследовательна. Чтобы заставить это свойство работать в разных браузерах, нам нужно использовать встроенный SVG, а затем функцию url() как значение для clip-path.
<svg class="svg"> <clipPath id="triangle" clipPathUnits="objectBoundingBox"> <path d="M0.05,0.05 h1 v1"></path> </clipPath> </svg>
В коде CSS нужно добавить путь к clipPath при помощи url().
.card { clip-path: url("#triangle"); }