В документах HTML мы можем отображать, скрывать или изменять порядок частей страницы в зависимости от условий области просмотра. Например, если окно браузера имеет ширину 480 пикселей, мы можем сместить нашу навигацию с горизонтального на вертикальный сворачиваемый список. Мы можем сделать
Эта статья является выдержкой из книги Тиффани «Мастер CSS,
* * *
Помимо использования CSS с HTML, мы также можем использовать CSS с SVG или масштабируемой векторной графикой. SVG — это формат разметки для описания плоских двумерных изображений. Поскольку это язык разметки, он имеет объектную модель документа и может использоваться с CSS.
Используя CSS с SVG, мы можем изменить внешний вид SVG в зависимости от взаимодействия с пользователем. Или мы можем использовать один и тот же документ SVG в нескольких местах и показывать или скрывать его части в зависимости от ширины области просмотра.
Все основные браузерные движки поддерживают спецификацию SVG 1.1, и они делают это уже много лет. С другой стороны, поддержка функций SVG 2 все еще находится в стадии разработки.
Однако, прежде чем мы двинемся дальше, давайте поговорим о том, что такое SVG и почему вы должны его использовать.
Сравнение векторных изображений и растровых изображений
Большинство изображений, используемых в настоящее время в Интернете, представляют собой растровые изображения, также известные как растровые изображения. Растровые изображения состоят из пикселей на фиксированной сетке с заданным количеством пикселей на дюйм. JPEG, WebP, GIF и PNG — все это примеры форматов растровых изображений.
Растровые изображения зависят от разрешения.
Вместо того, чтобы использовать пиксели в сетке, форматы векторных изображений описывают примитивные формы — круги, прямоугольники, линии или контуры, — которые составляют изображение, и их размещение в системе координат документа. В результате векторные изображения не зависят от разрешения и сохраняют свое качество независимо от разрешения или размеров экрана.
Независимость от разрешения — самое большое преимущество SVG. Мы можем масштабировать изображения вверх или вниз без потери качества. Одно и то же изображение отлично смотрится как на устройствах с высоким, так и с низким значением PPI. Тем не менее, SVG плохо подходит для количества цветовых данных, необходимых для фотографий. Это лучше всего подходит для рисунков и форм. Используйте его вместо изображений PNG и GIF, а также в качестве более гибкой замены иконочных шрифтов.
Еще одним преимуществом SVG является то, что он был разработан для использования с другими
Связывание CSS с документами SVG
Использование CSS с SVG очень похоже на его использование с HTML. Мы можем применить CSS, используя styleатрибут элемента SVG, сгруппировать CSS внутри документа, используя
➥
На изображении ниже показано, как этот код отображается в браузере.
Круг в SVG
Давайте добавим нашему кругу розовую заливку с помощью CSS и styleатрибута:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"
➥
Эффект от этого показан ниже.
Использование атрибута стиля для добавления цвета заливки
Вот одно различие между использованием CSS с HTML и его использованием с SVG: имена свойств. Многие свойства CSS, которые мы используем с документами HTML, несовместимы с SVG, и наоборот. Мы вернемся к этому вопросу позже в этой главе.
Использование styleатрибута, конечно, не лучший способ использования CSS. Это ограничивает возможность повторного использования этих стилей в нескольких элементах или документах. Вместо этого мы должны использовать встроенный или связанный CSS.
Встраивание CSS в документы SVG
Вместо использования styleатрибута мы можем использовать
➥ 200 200»
Встраивание CSS в документ SVG позволяет нам повторно использовать эти стили для нескольких элементов в одном документе, но предотвращает совместное использование этого CSS в нескольких документах. Это нормально для логотипов и иконок. Но если вы создаете
С помощью стандартного текстового редактора вы также можете добавлять CSS к изображениям SVG, созданным с помощью таких программ, как Sketch, Inkscape или Illustrator. Это не повлияет на вашу способность редактировать изображение с помощью приложения для рисования, но если вы редактируете файл с помощью программного обеспечения для работы с изображениями, приложение может перезаписать или удалить ваш CSS.
Ссылка из SVG на внешний файл CSS
Как и в случае с HTML, ссылка на внешний файл CSS позволяет использовать стили в нескольких документах SVG. Чтобы связать внешний файл CSS, добавьте <?
<? xml version="1.0" encoding="utf-8"? >
<?
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox=«0 0
➥ 200 200»
Использование
элемента
В качестве альтернативы используйте
элемент HTML. Если вы используете этот метод, вам необходимо включить xmlnsатрибут пространства имен, как показано ниже:
<link href="style.css" type="text/css" rel="stylesheet"
➥ xmlns="http://www.w3.org/1999/xhtml" />
Примечание: некоторые старые браузеры требуют, чтобы
элемент был заключен в теги
Элемент
не является элементом SVG. Он принадлежит HTML и XHTML. XHTML — это вариант HTML, анализируемый в соответствии с правилами разметки XML. Согласно правилам XML, мы можем заимствовать элементы и их поведение из других диалектов XML, таких как XHTML. Однако для этого нам нужно сообщить браузеру, к какому пространству имен принадлежит элемент, используя xmlnsатрибут.
С использованием@import
Мы также можем ссылаться на внешнюю таблицу стилей, используя теги @importinside
Этот метод работает аналогично
методу.
SVG и элемент: ограничения
Связывание файлов SVG с внешними ресурсами, включая файлы CSS, не работает с элементом. Это ограничение безопасности элемента, встроенного в браузеры.
Если вы хотите использовать связанный CSS с вашими изображениями SVG, вам нужно будет сделать одну из следующих двух вещей:
используйте
Элементы SVG в документах HTML также становятся частью дерева документа HTML. Если вы используете встроенный SVG, вполне нормально объединить CSS, связанный с HTML, и CSS, связанный с SVG, в одной таблице стилей.
Различия между SVG и HTML
Хотя SVG и HTML являются языками разметки, между ними есть два существенных различия, которые влияют на то, как они работают с CSS:
SVG не соответствует блочной модели CSS.
SVG не имеет схемы позиционирования
SVG не соответствует блочной модели CSS
При использовании с HTML макет CSS следует правилам блочной модели CSS. SVG, с другой стороны, использует координаты для макета. Он придерживается того, что лучше всего понимать как «модель формы».
Формы SVG не ограничиваются прямоугольными блоками. В результате большинство свойств, связанных с блочной моделью, не применяются к элементам SVG. Например, вы не можете изменить paddingили marginэлемента SVG. Вы также не можете использовать свойства
Однако вы можете использовать CSS для установки или изменения диапазона свойств и значений атрибутов SVG. Полный список указан в спецификации SVG 2, хотя поддержка в большинстве браузеров неполная. Некоторые свойства CSS, такие как filter, можно использовать с SVG или HTML. Мы обсудим некоторые из них в этой главе в контексте конкретных методов.
SVG не имеет схемы позиционирования
Когда CSS используется с HTML, блоки элементов могут:
существовать в пределах нормального потока
быть удалены из нормального потока со floatсвойством
быть удалены из нормального потока со positionсвойством
Спецификация CSS называет их схемами позиционирования. Схем позиционирования в SVG не существует. Свойство positionне влияет на элементы SVG. Как и такие свойства, как top, leftи bottom, которые зависят от расположения элементов. Вы также не можете перемещать элементы в документе SVG.
Вместо этого SVG использует систему координат для размещения элементов. Например, чтобы создать
Что касается схем позиционирования, в SVG также отсутствует идея
Примечание. Спецификация SVG 2 определяет поведение
Вместо этого элементы SVG располагаются в соответствии с их исходным порядком. Те, которые появляются позже в документе, располагаются ближе к вершине стека. Если вы хотите изменить порядок размещения элементов SVG, вам нужно будет переместить их в исходном коде или использовать JavaScript, чтобы переупорядочить их в дереве DOM.
На самом деле, большинство свойств CSS 2.1 неприменимы к документам SVG. Исключения включают анимации и преобразования, display, overflow, visibility, filter, а также некоторые свойства шрифтов и текста. Вместо этого вам придется использовать специфичные для SVG свойства стиля с документами SVG. Большинство этих свойств также могут быть выражены как атрибуты элемента SVG.
Стилизация
Вот простой пример того, как стилизовать элементы SVG с помощью CSS. Сначала наш документ SVG, который представляет собой отдельный файл:
<? xml version="1.0" encoding="utf-8"? >
<?
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns: xlink=
➥«http: //www.w3.org/1999/xlink» x="0px" y="0px" viewBox=«0 0 497
➥ 184»
<polygon id="star" points="77,23.7 98.2,66.6 145.5,66.5 111.2,
➥106.9,119.3,154 77,131.8 34.7,154 42.8,106.9 8.5,67.5 55.8,
➥66.6 «/>
Эта разметка создает изображение, показанное ниже.
Простой круг и звезда
Хотя мы не можем использовать большинство свойств CSS с документами SVG, мы можем использовать CSS для изменения цвета элемента. Сделаем нашу звезду желтой:
#star {
fill: hsl (44, 100%, 50%) ;
}
Вы часто будете видеть fillатрибут, используемый с тегами SVG, например,
Мы также можем использовать CSS для настройки элемента stroke, который является контуром формы SVG. Обводка фигуры существует, даже если не strokeустановлены никакие свойства. Давайте добавим нашему кругу
circle {
fill: cornflowerblue;
stroke: darkblue;
}
Вместе это дает нам результат ниже.
Простой круг и звезда
Использование атрибутов SVG в качестве свойств CSS
Мы также можем использовать CSS для установки значений координат некоторых элементов формы:
Однако SVG 2 переопределил некоторые атрибуты SVG как свойства геометрии. Это означает, что мы можем использовать CSS для установки их значений:
Свойства координат (xи y), свойства координат центра (cxи cy) и свойства радиуса (rx, ry, и r) можно задать с помощью CSS. Так может widthи height. Единицы не являются обязательными для атрибутов SVG. Значения CSS, с другой стороны, требуют единиц. И длины, и проценты допустимы для упомянутых здесь свойств, но имейте в виду, что длины работают немного
вычисляемый widthи heightкорневого элемента SVG
значение viewBoxатрибута корневого элемента
любые преобразования масштабирования, примененные к элементу или его предкам
Другими словами, углы нашего элемента
Не каждый атрибут SVG доступен через CSS — по крайней мере, не во всех браузерах. Например, Chrome и Edge поддерживают использование path () функции CSS для установки данных пути или dатрибута:
path {
d: path («M 454.45223,559.21474 -304.96705,163.45948 417.4767, -296.33928 Z») ;
}
На момент написания этой статьи это единственные браузеры, которые это делают. Работа по добавлению поддержки в Firefox и WebKit еще не началась.
Для других элементов формы спецификация SVG 2 совершенно непоследовательна. На сегодняшний день вы должны использовать атрибуты элемента для установки свойств элементов
Тем не менее, мы не ограничены использованием селекторов типа (или элемента) для установки свойств. Мы могли бы, например, определить маленькие, средние и большие круги, используя селекторы классов:
Независимо от селектора, использование синтаксиса CSS для указания свойств также упрощает их анимацию. Мы рассмотрим, как это сделать, в следующем разделе.
Анимация и изменение свойств CSS SVG
Использование CSS с SVG становится более интересным, когда мы добавляем к ним переходы и анимацию. Этот процесс похож на анимацию
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px"
➥ y="0px" viewBox="0 0 497 184" xml: space="preserve">
<link href="twinkle.css" type="text/css" rel="stylesheet"
➥ xmlns="http://www.w3.org/1999/xhtml"/>
<polygon class="star" points="77,23.7 98.2,66.6 145.5,66.5 111.2
➥, 106.9 119.3,154 77,131.8 34.7,154 42.8,106.9 8.5,67.5
➥ 55.8,66.6 «/>
<polygon class="star twinkle" points=»77,23.7 98.2,66.6 145.5,
➥66.5 111.2,106.9 119.3,154 77,131.8 34.7,154 42.8,106.9
➥ 8.5,67.5 55.8,66.6 «/>
Наш документ содержит два звездообразных многоугольника, каждый из которых имеет имя класса star. Чтобы создать эффект мерцания, мы анимируем первый. Вот наш CSS:
@keyframes twinkle {
from {
}
to {
transform: scale (2) ;
}
}
.star {
fill: rgb (255,195,0) ;
}
.twinkle {
animation: twinkle 1.5s infinite forwards
}
Здесь мы использовали специфичное для SVG свойство
Наша анимация пульсирующей звезды
Давайте посмотрим на другой пример. На этот раз мы создадим эффект рисования, изменив
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
➥xmlns: xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 200 200"
<circle fill="transparent"
➥ cy="96.8" r="79.6"/>
Свойство
Мы можем использовать
circle {
transition:
fill: transparent;
}
.animate {
}
В начале перехода наш штрих невидим, потому что длина тире равна, 0а наш зазор равен 500. Но когда мы добавляем animateкласс к нашему кругу, мы сдвигаем длину тире на 500и устраняем пробел. Эффект немного напоминает рисование круга циркулем. Почему 500? Это наименьшее значение, которое помогло создать этот конкретный эффект.
Будущее анимированного пути
Помните наш пример определения пути через CSS из предыдущего раздела?
path {
d: path («M357.5 451L506.889 192.25H208.111L357.5 451Z») ;
transition: d 1s
}
.straighten {
d: path («M357.5 8871L406 -10113.75H208.111L357.5 351Z») ;
}
Однако на сегодняшний день только браузеры на основе Chromium, такие как Google Chrome и Microsoft Edge, поддерживают анимацию определений пути таким образом. Чтобы это работало в других браузерах, используйте библиотеку JavaScript, такую как GreenSock и ее MorphSVGPlugin. В дополнение к
Использование SVG с
В
Очень реальный логотип для вымышленной компании
Без
Давайте различать область просмотра документа HTML и область просмотра документа SVG. Когда SVG является встроенным, область просмотра HTML и область просмотра SVG являются одним и тем же. Документ SVG ведет себя как любой другой элемент HTML. С другой стороны, когда документ SVG связан — как с элементами
<svg version="1.1" id="HexagonLogo" xmlns=«http: //www.w3.org/2000/
➥svg» xmlns: xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
➥ viewBox="0 0 555 174" xml: space="preserve">
<polygon id="hexagonbg" points="55.2,162 10,86.5 55.2,11
➥ 145.5,11 190.7,86.5 145.5,162 «/>
<path id="letterH" fill="#FFFFFF" d=«M58,35.5h33v35.2h18.
➥4V35.5 h33.2v103.4h−33.2v−38.3H91v38.3H58V35.5z M77.5,126.5V87.
➥3h45.6v39.2h4V47.9h−4v35.6H77.5V47.9h−4v78.6H77.5z»/>
...
...
Примечание: полная демонстрация этой техники, включая полный исходный код этого
В меньших окнах просмотра давайте покажем только букву H в шестиугольном символе:
@media (
[id=
display: none;
}
}
Теперь, когда контейнер нашего SVG меньше или равен 20em, будет видна только символьная часть нашего логотипа.
Отображение/скрытие элементов в зависимости от размера области просмотра SVG
Чтобы вызвать это представление из документа HTML, установите ширину контейнера SVG
Как вы, возможно, заметили, взглянув на изображение выше, наше изображение SVG сохраняет свои внутренние размеры, даже если его часть скрыта. К сожалению, это ограничение SVG. Чтобы исправить это, нам нужно изменить viewBoxатрибут
Атрибут viewBox, как следует из его названия, определяет видимую область элемента SVG. Настроив его, мы можем определить, какая часть изображения SVG заполняет окно просмотра. Далее следует пример использования matchMediaи
Теперь, когда контейнер SVG имеет размер 320 пикселей или меньше, значение viewBoxбудет равно «0 0 200 174». Когда оно превышает 320 пикселей, viewBoxвосстанавливается до исходного значения.
Настройка атрибута viewBox на основе ширины области просмотра
Поскольку в этом методе используется либо onloadатрибут события, либо само SVGLoadсобытие, хорошей идеей будет встроить наши CSS и JavaScript в файл SVG. Если CSS является внешним, SVGLoadсобытие может сработать до завершения загрузки связанного с ним CSS.
Использование медиазапросов
Документы SVG и мультимедийные запросы не ограничиваются изображениями переднего плана. Мы также можем изменить размер области просмотра SVG, используя
Мы начнем с этого документа SVG:
<? xml version="1.0" encoding="utf-8"? >
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
➥ xmlns: xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
➥ viewBox="-20 -20 250 250" xml: space="preserve">
Это простой случай. Наши
Чтобы это работало, мы должны использовать наше изображение SVG в качестве фонового изображения и установить
элемента и для
- элементов:
body, li {
background: url (circles.svg) ;
}
body {
background-color : #9c27b0;background-size : 300px auto;}
li {
background-position : left center;background-repeat :no-repeat ;background-size : 1em auto;padding-left : 40px;font-size : 24px;margin: 1rem 0;
}
Результат на фото ниже.
Управление областью просмотра SVG с помощью свойства CSS
background-size Заключение
Использование SVG с CSS дает нам больше возможностей для гибких и адаптивных документов. Теперь вы должны знать, как:
использовать CSS для стилизации элементов SVG
анимировать свойства SVG
использовать мультимедийные запросы CSS и matchMediaAPI для отображения и скрытия частей документа SVG.