Свойство CSS `stroke`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с января 2020 года.
Свойство stroke CSS определяет цвет или сервер заливки SVG, используемый для рисования обводки элемента. Поэтому stroke влияет только на элементы, которым можно задать обводку (например, <rect> или <ellipse>); полный список см. на странице атрибута SVG stroke. При объявлении значение CSS переопределяет любое значение атрибута SVG элемента stroke.
Примечание: Согласно черновику спецификации CSS Fill and Stroke Module Level 3 от 4 апреля 2017 года, свойство stroke является сокращённой записью для ряда других свойств обводки. На практике, по состоянию на август 2024 года, браузеры не поддерживают задание других связанных с обводкой значений, таких как ширина или шаблоны штрихов, через свойство stroke, рассматривая его вместо этого как прямой аналог атрибута SVG stroke.
Синтаксис
/* assorted color values */ stroke: rgb(153 51 102 / 1); stroke: color-mix(in lch, var(--primaryColor) 35%, gray 15%); stroke: dodgerblue; stroke: currentColor; stroke: transparent; stroke: context-stroke; /* Global values */ stroke: inherit; stroke: initial; stroke: revert; stroke: revert-layer; stroke: unset;
Значения
-
color - Задаёт заливку обводки любым допустимым значением цвета CSS.
-
<image> - Задаёт заливку обводки с помощью того, что в SVG называется сервером заливки; в данном контексте это градиент или узор SVG. Градиенты CSS нельзя использовать со свойством
stroke. -
context-stroke - Заставляет элемент «наследовать» определение обводки от своего контекстного элемента. Если допустимого контекстного элемента нет, это значение приводит к тому, что для обводки не используется заливка.
Формальное определение
| Начальное значение | как у каждого из свойств сокращённой записи: |
|---|---|
| Применяется к | как у каждого из свойств сокращённой записи: |
| Наследуется | да |
| Вычисленное значение | как у каждого из свойств сокращённой записи: |
| Тип анимации | как у каждого из свойств сокращённой записи: |
Формальный синтаксис
stroke = <paint> <paint> = none | <color> | <url> [none | <color>]? | context-fill | context-stroke <color> = <color-base> | currentColor | <system-color> | <light-dark()> | <deprecated-system-color> <color-base> = <hex-color> | <color-function> | <named-color> | <color-mix()> | transparent <system-color> = AccentColor | AccentColorText | ActiveText | ButtonBorder | ButtonFace | ButtonText | Canvas | CanvasText | Field | FieldText | GrayText | Highlight | HighlightText | LinkText | Mark | MarkText | SelectedItem | SelectedItemText | VisitedText <light-dark()> = light-dark( <color>, <color> ) <deprecated-system-color> = ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonHighlight | ButtonShadow | CaptionText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText <color-function> = <rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <oklab()> | <oklch()> | <color()> <named-color> = aliceblue | antiquewhite | aqua | aquamarine | azure | beige | bisque | black | blanchedalmond | blue | blueviolet | brown | burlywood | cadetblue | chartreuse | chocolate | coral | cornflowerblue | cornsilk | crimson | cyan | darkblue | darkcyan | darkgoldenrod | darkgray | darkgreen | darkgrey | darkkhaki | darkmagenta | darkolivegreen | darkorange | darkorchid | darkred | darksalmon | darkseagreen | darkslateblue | darkslategray | darkslategrey | darkturquoise | darkviolet | deeppink | deepskyblue | dimgray | dimgrey | dodgerblue | firebrick | floralwhite | forestgreen | fuchsia | gainsboro | ghostwhite | gold | goldenrod | gray | green | greenyellow | grey | honeydew | hotpink | indianred | indigo | ivory | khaki | lavender | lavenderblush | lawngreen | lemonchiffon | lightblue | lightcoral | lightcyan | lightgoldenrodyellow | lightgray | lightgreen | lightgrey | lightpink | lightsalmon | lightseagreen | lightskyblue | lightslategray | lightslategrey | lightsteelblue | lightyellow | lime | limegreen | linen | magenta | maroon | mediumaquamarine | mediumblue | mediumorchid | mediumpurple | mediumseagreen | mediumslateblue | mediumspringgreen | mediumturquoise | mediumvioletred | midnightblue | mintcream | mistyrose | moccasin | navajowhite | navy | oldlace | olive | olivedrab | orange | orangered | orchid | palegoldenrod | palegreen | paleturquoise | palevioletred | papayawhip | peachpuff | peru | pink | plum | powderblue | purple | rebeccapurple | red | rosybrown | royalblue | saddlebrown | salmon | sandybrown | seagreen | seashell | sienna | silver | skyblue | slateblue | slategray | slategrey | snow | springgreen | steelblue | tan | teal | thistle | tomato | turquoise | violet | wheat | white | whitesmoke | yellow | yellowgreen <color-mix()> = color-mix( <color-interpolation-method> , [ <color> && <percentage [0,100]>? ]#{2}) <rgb()> = rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? ) | rgb( [ <number> | <percentage> | none ]{3} [ / [ <alpha-value> | none ] ]? ) <rgba()> = rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? ) | rgba( [ <number> | <percentage> | none ]{3} [ / [ <alpha-value> | none ] ]? ) <hsl()> = hsl( <hue>, <percentage>, <percentage>, <alpha-value>? ) | hsl( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <hsla()> = hsla( <hue>, <percentage>, <percentage>, <alpha-value>? ) | hsla( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <hwb()> = hwb( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <lab()> = lab( [<percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <lch()> = lch( [<percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? ) <oklab()> = oklab( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <oklch()> = oklch( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? ) <color()> = color( [ from <color> ]? <colorspace-params> [ / [ <alpha-value> | none ] ]? ) <color-interpolation-method> = in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ] <alpha-value> = <number> | <percentage> <hue> = <number> | <angle> <colorspace-params> = [<custom-params> | <predefined-rgb-params> | <xyz-params>] <rectangular-color-space> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | xyz | xyz-d50 | xyz-d65 <polar-color-space> = hsl | hwb | lch | oklch <hue-interpolation-method> = [ shorter | longer | increasing | decreasing ] hue <custom-color-space> = <dashed-ident> <custom-params> = <dashed-ident> [ <number> | <percentage> | none ]+ <predefined-rgb-params> = <predefined-rgb> [ <number> | <percentage> | none ]{3} <xyz-params> = <xyz> [ <number> | <percentage> | none ]{3} <predefined-rgb> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 <xyz> = xyz | xyz-d50 | xyz-d65
Примеры
Обводка базовым цветом
В этом примере мы создаём две разные фигуры — круг и прямоугольник, входящие в <g> (группу), которая задаёт серый цвет обводки по умолчанию для обеих фигур.
<svg>
<g fill="none" stroke="gray" stroke-width="10">
<circle cx="100" cy="100" r="40" />
<rect x="20" y="20" width="80" height="80" />
</g>
</svg>
Затем с помощью CSS мы задаём прямоугольнику приглушённый фиолетовый цвет, а кругу — красный.
rect {
stroke: rebeccapurple;
}
circle {
stroke: red;
}
Обводка узором
В этом примере используются та же группа и те же фигуры (круг немного сдвинут), что и в предыдущем примере, но также определяется узор SVG.
<svg>
<g fill="none" stroke="gray" stroke-width="23">
<circle cx="150" cy="90" r="40" />
<rect x="20" y="20" width="80" height="80" />
</g>
<defs>
<pattern id="star" viewBox="0,0,10,10" width="10%" height="10%">
<polygon points="0,0 2,5 0,10 5,8 10,10 8,5 10,0 5,2" />
</pattern>
</defs>
</svg>
Затем в CSS на узор ссылаются с помощью значения URL, указывающего на его идентификатор. Этот узор применяется к обеим фигурам в качестве заливки обводки, как показано в результате.
rect,
circle {
stroke: url("#star");
}
Узор рисуется относительно ограничивающих рамок фигур, что может приводить к визуальным помехам в местах их пересечения, поскольку части узора прозрачны.
Градиенты SVG и CSS
Здесь мы снова используем ту же разметку группы и фигур, что и в первом примере, но также добавляем определение градиента SVG.
<svg>
<g fill="none" stroke="gray" stroke-width="10">
<circle cx="100" cy="100" r="40" />
<rect x="20" y="20" width="80" height="80" />
</g>
<defs>
<linearGradient id="greenwhite">
<stop offset="0%" stop-color="green" />
<stop offset="100%" stop-color="white" />
</linearGradient>
</defs>
</svg>
В CSS мы применяем этот градиент SVG к прямоугольнику с помощью значения URL, указывающего на идентификатор линейного градиента. Кругу мы задаём линейный градиент CSS, аналогичный градиенту SVG.
rect {
stroke: url("#greenwhite");
}
circle {
stroke: linear-gradient(90deg, green, white);
}
Градиентная обводка применяется только к прямоугольнику, тогда как круг использует серую обводку, заданную элементом группы. Это происходит потому, что градиенты CSS не являются допустимыми значениями свойства stroke, тогда как ссылки URL на градиенты SVG разрешены.
Контекстная обводка
В этом случае мы снова начинаем с элемента группы, внутри которого определены два пути в форме прямоугольников. После этого определяются линейный градиент и маркер SVG.
<svg>
<g fill="none" stroke="gray" stroke-width="4">
<path d="M 20,20 l 180,0 0,100 -180,0 z" />
<path d="M 100,40 l 180,0 0,100 -180,0 z" />
</g>
<defs>
<linearGradient id="orangered">
<stop offset="0%" stop-color="orange" />
<stop offset="100%" stop-color="red" />
</linearGradient>
<marker
id="circle"
markerWidth="20"
markerHeight="20"
refX="10"
refY="10"
markerUnits="userSpaceOnUse">
<circle
cx="10"
cy="10"
r="8"
stroke-width="4"
stroke="none"
fill="none" />
</marker>
</defs>
</svg>
Затем мы пишем CSS, чтобы добавить маркер к обоим путям и задать им приглушённый фиолетовый цвет обводки. Для второго пути это значение переопределяется: ему задаётся значение URL, применяющее оранжево-красный градиент в качестве обводки. Наконец, мы задаём элементу круга внутри элемента маркера значение обводки context-stroke.
path {
stroke: rebeccapurple;
marker: url("#circle");
}
path:nth-of-type(2) {
stroke: url("#orangered");
}
marker circle {
stroke: context-stroke;
}
Поскольку stroke-context применяется к элементу, который является потомком элемента <marker>, контекстным элементом для каждого круга является элемент, вызвавший элемент <marker>, то есть элементы <path>. В результате маркеры первого пути используют цвет вызвавшего их пути и окрашены в фиолетовый цвет. Маркеры второго пути, напротив, используют тот же градиент SVG от оранжевого к красному, что и сам путь. Этот последний случай показывает, как градиенты SVG применяются ко всей фигуре целиком, а не отдельно к каждой её части.
Спецификации
| Спецификация |
|---|
| Scalable Vector Graphics (SVG) 2 # StrokeProperty |
Совместимость с браузерами
| Настольные | Мобильные | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
stroke |
1 |
≤15 |
1.5 |
15 |
4 |
18 |
4 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
none |
1 |
≤15 |
1.5 |
15 |
4 |
18 |
4 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
См. также
stroke-dasharraystroke-dashoffsetstroke-linecapstroke-linejoinstroke-miterlimitstroke-opacitystroke-widthpaint-order- атрибут SVG
stroke
© 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/stroke