SVG и CSS
Эта страница демонстрирует применение CSS к специализированному языку для создания графики: SVG.
Ниже вы создадите простую демонстрацию, которая будет работать в вашем браузере, поддерживающем SVG.
Примечание: Элементы, на которые ссылаются элементы <use>, наследуют стили из этого элемента. Поэтому, чтобы применить к ним разные стили, следует использовать настраиваемые свойства CSS.
Пример
Создайте новый документ SVG в виде простого текстового файла, doc8.svg. Скопируйте и вставьте содержимое отсюда, убедившись, что вы прокрутили, чтобы получить всё:
<svg width="600px" height="600px" viewBox="-300 -300 600 600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="style8.css" type="text/css" /> <title>SVG demonstration</title> <desc>Mozilla CSS Getting Started - SVG demonstration</desc> <defs> <radialGradient id="fade" cx="0" cy="0" r="200" gradientUnits="userSpaceOnUse"> <stop id="fade-stop-1" offset="33%" /> <stop id="fade-stop-2" offset="95%" /> </radialGradient> </defs> <text id="heading" x="-280" y="-270">SVG demonstration</text> <text id="caption" x="-280" y="-250"> Move your mouse pointer over the flower. </text> <g id="flower"> <circle id="overlay" cx="0" cy="0" r="200" stroke="none" fill="url(#fade)" /> <g id="outer-petals"> <g class="quadrant"> <g class="segment"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(18)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(36)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(54)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(72)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> <g class="quadrant"> <g class="segment" transform="rotate(90)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(108)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(126)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(144)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(162)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> <g class="quadrant"> <g class="segment" transform="rotate(180)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(198)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(216)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(234)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(252)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> <g class="quadrant"> <g class="segment" transform="rotate(270)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(288)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(306)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(324)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(342)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> </g> <g id="inner-petals" transform="rotate(9) scale(0.33)"> <g class="quadrant"> <g class="segment"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(18)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(36)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(54)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(72)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> <g class="quadrant"> <g class="segment" transform="rotate(90)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(108)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(126)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(144)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(162)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> <g class="quadrant"> <g class="segment" transform="rotate(180)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(198)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(216)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(234)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(252)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> <g class="quadrant"> <g class="segment" transform="rotate(270)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(288)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(306)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(324)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g class="segment" transform="rotate(342)"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> </g> </g> </g> </svg>
Создайте новый файл CSS, style8.css в той же директории, что и doc8.svg. Скопируйте и вставьте содержимое отсюда, убедившись, что вы прокрутили, чтобы получить всё:
/*** SVG demonstration ***/ /* page */ svg { background-color: beige; } #heading { font-size: 24px; font-weight: bold; } #caption { font-size: 12px; } /* flower */ #flower:hover { cursor: crosshair; } /* gradient */ #fade-stop-1 { stop-color: blue; } #fade-stop-2 { stop-color: white; } /* petals */ .segment-fill { fill: var(--segment-fill-fill); stroke: var(--segment-fill-stroke); stroke-width: var(--segment-fill-stroke-width); } .segment-fill:hover { fill: var(--segment-fill-fill-hover); stroke: var(--segment-fill-stroke-hover); } .segment-edge { fill: var(--segment-edge-fill); stroke: var(--segment-edge-stroke); stroke-width: var(--segment-edge-stroke-width); } .segment-edge:hover { stroke: var(--segment-edge-stroke-hover); } /* outer petals */ #outer-petals { opacity: 0.75; --segment-fill-fill: azure; --segment-fill-stroke: lightsteelblue; --segment-fill-stroke-width: 1; --segment-edge-fill: none; --segment-edge-stroke: deepskyblue; --segment-edge-stroke-width: 3; --segment-fill-fill-hover: plum; --segment-fill-stroke-hover: none; --segment-edge-stroke-hover: slateblue; } /* Non-standard way of styling elements referenced via <use> elements, supported by some older browsers */ #outer-petals .segment-fill { fill: azure; stroke: lightsteelblue; stroke-width: 1; } #outer-petals .segment-edge { fill: none; stroke: deepskyblue; stroke-width: 3; } #outer-petals .segment:hover > .segment-fill { fill: plum; stroke: none; } #outer-petals .segment:hover > .segment-edge { stroke: slateblue; } /* inner petals */ #inner-petals { --segment-fill-fill: yellow; --segment-fill-stroke: yellow; --segment-fill-stroke-width: 1; --segment-edge-fill: none; --segment-edge-stroke: yellowgreen; --segment-edge-stroke-width: 9; --segment-fill-fill-hover: darkseagreen; --segment-fill-stroke-hover: none; --segment-edge-stroke-hover: green; } /* Non-standard way of styling elements referenced via <use> elements, supported by some older browsers */ #inner-petals .segment-fill { fill: yellow; stroke: yellow; stroke-width: 1; } #inner-petals .segment-edge { fill: none; stroke: yellowgreen; stroke-width: 9; } #inner-petals .segment:hover > .segment-fill { fill: darkseagreen; stroke: none; } #inner-petals .segment:hover > .segment-edge { stroke: green; }
Откройте документ doc8.svg в вашем браузере, поддерживающем SVG. Наведите курсор мыши на график, чтобы увидеть, что происходит.
Результат
Примечания к этой демонстрации:
- Документ SVG связывает таблицу стилей с помощью следующего тега HTML
<link>:Его также можно связать с правиломhtml<link rel="stylesheet" href="style8.css" type="text/css" />@importвнутри тега<style>:html<style> @import url(style8.css); </style>
- SVG имеет свои собственные свойства и значения CSS. Некоторые из них аналогичны свойствам CSS для HTML.
Задача
Измените таблицу стилей так, чтобы внутренние лепестки становились розовыми при наведении курсора мыши на любой из них, не изменяя работу внешних лепестков.
Упрощенная структура
Структуру SVG, показанную выше, можно значительно сократить, ссылаясь на отдельные части цветка через элементы <use>. Это стандартизированное поведение, хотя в настоящее время лишь некоторые браузеры поддерживают псевдокласс :hover и другие более сложные селекторы CSS для элементов, на которые ссылаются элементы <use>. Существует некоторая дискуссия о том, какие правила применяются к таким связанным элементам.
Ниже показан вид структуры.
<svg width="600px" height="600px" viewBox="-300 -300 600 600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>SVG demonstration</title> <desc>Mozilla CSS Getting Started - SVG demonstration</desc> <defs> <g id="segment" class="segment"> <path class="segment-fill" d="M0,0 v-200 a40,40 0 0,0 -62,10 z" /> <path class="segment-edge" d="M0,-200 a40,40 0 0,0 -62,10" /> </g> <g id="quadrant"> <use href="#segment" /> <use href="#segment" transform="rotate(18)" /> <use href="#segment" transform="rotate(36)" /> <use href="#segment" transform="rotate(54)" /> <use href="#segment" transform="rotate(72)" /> </g> <g id="petals"> <use href="#quadrant" /> <use href="#quadrant" transform="rotate(90)" /> <use href="#quadrant" transform="rotate(180)" /> <use href="#quadrant" transform="rotate(270)" /> </g> <radialGradient id="fade" cx="0" cy="0" r="200" gradientUnits="userSpaceOnUse"> <stop id="fade-stop-1" offset="33%" /> <stop id="fade-stop-2" offset="95%" /> </radialGradient> </defs> <text id="heading" x="-280" y="-270">SVG demonstration</text> <text id="caption" x="-280" y="-250"> Move your mouse pointer over the flower. </text> <g id="flower"> <circle id="overlay" cx="0" cy="0" r="200" stroke="none" fill="url(#fade)" /> <use id="outer-petals" href="#petals" /> <use id="inner-petals" href="#petals" transform="rotate(9) scale(0.33)" /> </g> </svg>
Что дальше?
В этой демонстрации ваш браузер, поддерживающий SVG, уже знает, как отображать элементы SVG. Таблица стилей лишь изменяет отображение определённым образом. Это также верно для HTML-документов. Но вы можете использовать CSS для документов XML общего назначения, где нет предопределённого способа отображения элементов. Следующая страница демонстрирует это: Введение в XML
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/SVG_and_CSS