Свойство CSS `clip-path`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна во всех браузерах с января 2021 года.
Свойство clip-path CSS создаёт область отсечения, которая определяет, какая часть элемента должна отображаться. Части внутри этой области отображаются, а части за её пределами скрыты.
Попробуйте
clip-path: circle(40%);
clip-path: ellipse(130px 140px at 10% 20%);
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
clip-path: path("M 0 200 L 0,75 A 5,5 0,0,1 150,75 L 200 200 z");
clip-path: rect(5px 145px 160px 5px round 20%);
clip-path: xywh(0 5px 100% 75% round 15% 0);
<section class="default-example" id="default-example">
<div class="example-container">
<img
class="transition-all"
id="example-element"
src="/shared-assets/images/examples/balloon-small.jpg"
width="150" />
We had agreed, my companion and I, that I should call for him at his house,
after dinner, not later than eleven o'clock. This athletic young Frenchman
belongs to a small set of Parisian sportsmen, who have taken up "ballooning"
as a pastime. After having exhausted all the sensations that are to be found
in ordinary sports, even those of "automobiling" at a breakneck speed, the
members of the "Aéro Club" now seek in the air, where they indulge in all
kinds of daring feats, the nerve-racking excitement that they have ceased to
find on earth.
</div>
</section>
section {
align-items: flex-start;
}
.example-container {
text-align: left;
padding: 20px;
}
#example-element {
float: left;
width: 150px;
margin: 20px;
}
Синтаксис
/* Keyword values */
clip-path: none;
/* <clip-source> values */
clip-path: url("resources.svg#c1");
/* <geometry-box> values */
clip-path: margin-box;
clip-path: border-box;
clip-path: padding-box;
clip-path: content-box;
clip-path: fill-box;
clip-path: stroke-box;
clip-path: view-box;
/* <basic-shape> values */
clip-path: inset(100px 50px);
clip-path: circle(50px at 0 100px);
clip-path: ellipse(50px 60px at 10% 20%);
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
clip-path: path(
"M0.5,1 C0.5,1,0,0.7,0,0.3 A0.25,0.25,1,1,1,0.5,0.3 A0.25,0.25,1,1,1,1,0.3 C1,0.7,0.5,1,0.5,1 Z"
);
clip-path: rect(5px 5px 160px 145px round 20%);
clip-path: shape(from 0% 0%, line to 100% 0%, line to 50% 100%, close);
clip-path: xywh(0 5px 100% 75% round 15% 0);
/* Box and shape values combined */
clip-path: padding-box circle(50px at 0 100px);
/* Global values */
clip-path: inherit;
clip-path: initial;
clip-path: revert;
clip-path: revert-layer;
clip-path: unset;
Свойство clip-path задаётся одним или сочетанием перечисленных ниже значений.
Значения
-
<clip-source> <url>, указывающий на элемент SVG<clipPath>.-
<basic-shape> - Фигура, размер и положение которой определяются значением
<geometry-box>. Если геометрическая рамка не указана, в качестве опорной рамки используетсяborder-box. Одно из следующих значений:-
inset() - Задаёт прямоугольник с отступами.
-
circle() - Задаёт круг с помощью радиуса и положения.
-
ellipse() - Задаёт эллипс с помощью двух радиусов и положения.
-
polygon() - Задаёт многоугольник с помощью правила заливки SVG и набора вершин.
-
path() - Задаёт фигуру с помощью необязательного правила заливки SVG и описания контура SVG.
-
rect() - Задаёт прямоугольник с помощью указанных расстояний от краёв опорной рамки.
-
shape() - Задаёт фигуру с помощью необязательного правила заливки SVG и команд для построения линий, кривых и дуг.
-
xywh() - Задаёт прямоугольник с помощью указанных расстояний от верхнего и левого краёв опорной рамки, а также заданных ширины и высоты прямоугольника.
-
-
<geometry-box> - Если это значение задано вместе с
<basic-shape>, оно определяет опорную рамку для базовой фигуры. Если оно задано самостоятельно, края указанной рамки, включая форму углов (например,border-radius), становятся контуром отсечения. Геометрическая рамка может принимать одно из следующих значений:-
margin-box - В качестве опорной рамки используется внешнее поле.
-
border-box - В качестве опорной рамки используется граница.
-
padding-box - В качестве опорной рамки используется внутренний отступ.
-
content-box - В качестве опорной рамки используется область содержимого.
-
fill-box - В качестве опорной рамки используется ограничивающая рамка объекта.
-
stroke-box - В качестве опорной рамки используется ограничивающая рамка обводки.
-
view-box - В качестве опорной рамки используется ближайшая область просмотра SVG. Если для элемента, создающего область просмотра SVG, задан атрибут
viewBox, опорная рамка располагается в начале системы координат, заданной атрибутомviewBox, а её размеры по ширине и высоте устанавливаются в соответствии со значениями ширины и высоты атрибутаviewBox.
-
-
none - Контур отсечения не создаётся.
Примечание: Вычисленное значение, отличное от none, приводит к созданию нового контекста наложения, как и свойство CSS opacity при значениях, отличных от 1.
Формальное определение
| Исходное значение | none |
|---|---|
| Применяется к | всем элементам; в SVG применяется к элементам-контейнерам, за исключением элемента <defs>, а также ко всем графическим элементам |
| Наследуется | нет |
| Проценты | относительно опорной рамки, если она указана, в противном случае — относительно границы |
| Вычисленное значение | как задано, но значения <url> становятся абсолютными |
| Тип анимации | да, как указано для <basic-shape>, в противном случае — нет |
Формальный синтаксис
clip-path = <clip-source> | [ <basic-shape> || <geometry-box> ] | none <clip-source> = <url> <basic-shape> = <inset()> | <xywh()> | <rect()> | <circle()> | <ellipse()> | <polygon()> | <path()> | shape() <geometry-box> = <shape-box> | fill-box | stroke-box | view-box <inset()> = inset( <length-percentage>{1,4} [ round <'border-radius'> ]? ) <xywh()> = xywh( <length-percentage>{2} <length-percentage [0,∞]>{2} [ round <'border-radius'> ]? ) <rect()> = rect( [ <length-percentage> | auto ]{4} [ round <'border-radius'> ]? ) <circle()> = circle( <radial-size>? [ at <position> ]? ) <ellipse()> = ellipse( <radial-size>? [ at <position> ]? ) <polygon()> = polygon( <'fill-rule'>? , [ <length-percentage> <length-percentage> ]# ) <path()> = path( <'fill-rule'>? , <string> ) <shape-box> = <visual-box> | margin-box <length-percentage> = <length> | <percentage> <radial-size> = <radial-extent> | <length [0,∞]> | <length-percentage [0,∞]>{2} <position> = [ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ] <visual-box> = content-box | padding-box | border-box <radial-extent> = closest-corner | closest-side | farthest-corner | farthest-side
Примеры
Фигуры и геометрические рамки
В этом примере создаются два треугольника: для элементов <div> в качестве контура отсечения задаётся polygon(). У каждого из них сплошной цветной фон и толстая border. Для второго элемента <div> опорной рамкой задано значение content-box:
HTML
<div></div> <div></div>
CSS
body {
display: flex;
gap: 20px;
flex-flow: row wrap;
}
div {
height: 200px;
width: 200px;
box-sizing: border-box;
background-color: rebeccapurple;
border: 20px solid magenta;
clip-path: polygon(50% 0, 100% 100%, 0 100%);
}
div:last-of-type {
clip-path: content-box polygon(50% 0, 100% 100%, 0 100%);
}
Результат
Для первого треугольника мы не указали опорную рамку, поэтому по умолчанию используется border-box, а позиции 0% и 100% находятся на внешнем крае границы. Во втором примере мы задали <geometry-box> значение content-box. Это означает, что опорной рамкой для базовой фигуры служит внешний край области содержимого, находящийся внутри рамки внутреннего отступа. Поскольку в нашем примере нет padding, это внутренний край границы.
Функции shape() и path()
Развивая предыдущий пример, мы создаём тот же треугольник с разными значениями <basic-shape> и показываем, что функции shape() и path() также можно использовать для создания контуров отсечения, причём shape() — более гибкое решение.
Для задания контура отсечения первого элемента мы используем path(), а для второго — shape(); в обоих случаях используется значение border-box по умолчанию в качестве опорной рамки:
div {
clip-path: path("M100 0 L200 200 L0 200 Z");
}
div:last-of-type {
clip-path: shape(from 50% 0, line to 100% 100%, line to 0 100%, close);
}
В результате контур, заданный функцией shape(), увеличивается вместе с элементом, а вариант path() — нет:
Поскольку функция shape() позволяет использовать значения <percentage> (а также пользовательские свойства), она более универсальна.
Продемонстрируем это, увеличив размер исходного элемента:
div {
width: 250px;
height: 250px;
}
В примере с контуром отсечения, заданным функцией shape(), видны все четыре стороны границы или, по крайней мере, их части, поскольку процентные значения позволяют контуру увеличиваться вместе с элементом. В варианте path() элемент увеличился, а фигура — нет. В результате верхняя и левая границы видны частично, тогда как правая и нижняя обрезаны.
SVG в качестве источника отсечения
В этом примере мы задаём элементы SVG <clipPath>, которые будут использоваться в качестве источника clip-path.
HTML
Мы добавляем два элемента <div> и элемент <svg>, содержащий два элемента <clipPath>. Один <clipPath> содержит четыре элемента <rect>, которые вместе образуют оконные стёкла, оставляя посередине пустой крест, а другой содержит два пересекающихся элемента <rect>.
<svg height="0" width="0">
<defs>
<clipPath id="window">
<rect y="0" x="0" width="80" height="80" />
<rect y="0" x="120" width="80" height="80" />
<rect y="120" x="0" width="80" height="80" />
<rect y="120" x="120" width="80" height="80" />
</clipPath>
<clipPath id="cross">
<rect y="0" x="80" width="40" height="200" />
<rect y="80" x="0" width="200" height="40" />
</clipPath>
</defs>
</svg>
<div class="window">Window</div>
<div class="cross">Cross</div>
CSS
Мы используем flexbox, чтобы расположить элементы рядом друг с другом с промежутком, если хватает места. Для обоих элементов <div> мы задаём фоновое изображение conic-gradient(), создающее интересный визуальный эффект для отсечения, а также border.
body {
display: flex;
gap: 20px;
flex-flow: row wrap;
font: 2em sans-serif;
}
div {
width: 200px;
height: 200px;
background-image: conic-gradient(
at center,
rebeccapurple,
green,
lightblue,
rebeccapurple
);
border: 5px solid;
box-sizing: border-box;
}
Затем мы задаём id элемента <clipPath> в качестве <clip-source>. В примере cross мы вертикально центрируем текст с помощью align-content, иначе текст будет обрезан, как это происходит в примере window.
.window {
clip-path: url("#window");
}
.cross {
clip-path: url("#cross");
align-content: center;
}
Результат
Элементы, включая их границы и текст, обрезаются: на странице отображаются только их части, перекрывающие элементы <clipPath>.
Различные типы значений
В этом примере показано, как различные значения свойства clip-path обрезают HTML-элемент <img>.
HTML
HTML включает элемент <img>, который будет обрезан, <clipPath> в форме звезды и элемент <select> для выбора значения свойства clip-path.
<img
id="clipped"
src="https://mdn.github.io/shared-assets/images/examples/progress-pride-flag.jpg"
alt="Pride flag" />
<svg height="0" width="0">
<defs>
<clipPath id="star">
<path d="M100,0 42,180 196,70 4,70 158,180z" />
</clipPath>
</defs>
</svg>
<select id="clipPath">
<option value="none">none</option>
<option value="circle(100px at 110px 100px)">circle</option>
<option value="url(#star)" selected>star</option>
<option value="inset(20px round 20px)">inset</option>
<option value="rect(20px 150px 200px 20px round 10%)">rect</option>
<option value="xywh(0 20% 90% 67% round 0 0 5% 5px)">xywh</option>
<option value="path('M 0 200 L 0,110 A 110,90 0,0,1 240,100 L 200 340 z')">
path
</option>
</select>
<pre id="log"></pre>
CSS
В исходном виде звезда используется в качестве источника clip-path.
#clipped {
margin-bottom: 20px;
clip-path: url("#star");
}
JavaScript
При выборе нового пункта в меню <select> обработчик события обновляет значение clip-path, заданное для элемента <img>.
const clipPathSelect = document.getElementById("clipPath");
clipPathSelect.addEventListener("change", (evt) => {
const path = evt.target.value;
document.getElementById("clipped").style.clipPath = path;
log(`clip-path: ${path};`);
});
function log(text) {
const logElement = document.querySelector("#log");
logElement.innerText = `${text}`;
logElement.scrollTop = logElement.scrollHeight;
}
Результат
Выбирайте разные варианты, чтобы изменить значение clip-path.
Примечание: Хотя можно задать контур в виде текста, если вы хотите обрезать фоновое изображение по тексту, а не по фигуре, см. свойство background-clip.
Спецификации
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
clip-path |
55
23
|
79
12–79Поддерживаются только контуры отсечения, заданные с помощьюurl(). |
3.5 |
42
15
|
9.1
7
|
55
25
|
4 |
42
14
|
9.3
7
|
6.0
1.5
|
55
4.4
|
9.3
7
|
basic_shape |
23 |
79 |
54 |
15 |
7 |
25 |
54 |
14 |
7 |
1.5 |
4.4 |
7 |
border-box |
119 |
119 |
54 |
105 |
13 |
119 |
54 |
79 |
13 |
25.0 |
119 |
13 |
content-box |
119 |
119 |
54 |
105 |
13 |
119 |
54 |
79 |
13 |
25.0 |
119 |
13 |
fill-box |
119 |
119 |
51Это значение поддерживалось до Firefox 51, но как псевдоним дляborder-box. |
105 |
13.1 |
119 |
51Это значение поддерживалось до Firefox для Android 51, но как псевдоним дляborder-box. |
79 |
13.4 |
25.0 |
119 |
13.4 |
html_elements |
23 |
79 |
3.5 |
15 |
7 |
25 |
4 |
14 |
7 |
1.5 |
4.4 |
7 |
is_animatable |
55 |
79 |
49 |
42 |
12.1 |
55 |
49 |
42 |
12.2 |
6.0 |
55 |
12.2 |
margin-box |
119 |
119 |
54 |
105 |
13 |
119 |
54 |
79 |
13 |
25.0 |
119 |
13 |
padding-box |
119 |
119 |
54 |
105 |
13 |
119 |
54 |
79 |
13 |
25.0 |
119 |
13 |
path |
88 |
88 |
71 |
74 |
13.1
10
|
88 |
79 |
63 |
13
10
|
15.0 |
88 |
13
10
|
stroke-box |
119 |
119 |
51Это значение поддерживалось до Firefox 51, но как псевдоним дляborder-box. |
105 |
13.1 |
119 |
51Это значение поддерживалось до Firefox для Android 51, но как псевдоним дляborder-box. |
79 |
13.4 |
25.0 |
119 |
13.4 |
svg_elements |
23 |
12 |
52 |
15 |
7 |
25 |
52 |
14 |
7 |
1.5 |
4.4 |
7 |
view-box |
119 |
119 |
54 |
105 |
13.1 |
119 |
54 |
79 |
13.4 |
25.0 |
119 |
13.4 |
См. также
clip-rulemaskfilterbackground-clip- Введение в отсечение в CSS
- Модуль маскирования CSS
- Атрибут SVG
clip-path - Применение эффектов SVG к содержимому HTML
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/clip-path