Email *

Отзывчивая SVG графика

Отзывчивая SVG графика

Отзывчивая SVG графика

Отзывчивая SVG графика — это не просто картинки, которые могут изменять свой размер на различных дисплеях. Формат SVG позволяет использовать также отдельные элементы и группы внутри одного изображения. К каждому пути (path) или группе (g) можно писать отдельные медиа-запросы, уменьшая или скрывая их на дисплеях смартфонов и планшетов. И даже наоборот — можно увеличивать их на больших экранах, ведь SVG — это полностью масштабируемая векторная графика.

Это тестовая статья. Пока что относительное позиционирование отдельных элементов и их групп в SVG корректно работает только в Chrome и Opera. В остальных браузерах готовьтесь к поехавшей верстке 🙁

В этой статье мы дадим несколько примеров создания отзывчивых изображений SVG.

svg

Итак, у нас есть небольшая иконка с несколькими заливками: левое и правое крылья (path id=”left-wing”, path id=”right-wing”), круг (path class=”circle”), текст (text class=”text”) и нимб (path class=”halo”). Вся иконка имеет class=”logo”.

Допустим, мы хотим ее уменьшить на экранах с разрешением менее 480 px по ширине. Для этого достаточно написать медиа-запрос ко всему изображению:

@media only screen and (max-width: 480px){
 .logo {
 transform: scale(0.8);
 }
}

В таком случае вся иконка при разрешении дисплея <=480 будет иметь такой вид:

svg

Но ведь то же самое можно сделать и с растровым изображением. В чем же тогда преимущество SVG? Дело в том, что этот формат дает возможность работы с отдельными элементами внутри одного изображения.

Давайте уменьшим только крылья, а также повернем их на 30 градусов вверх.

@media only screen and (max-width: 480px){
 #left-wing {
 transform: scale(0.8) rotate(30deg);
 }
 #right-wing {
 transform: scale(0.8) rotate(-30deg);
 }
}

Важный момент!

Все элементы SVG изображения в качестве базовой точки трансформации имеют левый верхний угол. Поэтому необходимо переопределить эти свойства на CSS. В нашем случае левое крыло должно уменьшаться с привязкой к правому краю по оси X (100%) и середине по оси Y. Правое же крыло уменьшается с привязкой к левому краю (0% по оси X) и середине.

Данные свойства необходимо указывать вне медиа-запроса, то есть в основных стилях:

#left-wing {
 transform-origin: 100% 50%;
}
#right-wing {
 transform-origin: 0% 50%;
}

Теперь мы получим то же самое изображение, но уменьшены будут только крылья. И нам совершенно ничего не надо перерисовывать в графическом редакторе.

svg

Исходник

svg

Изображение при ширине дисплея <=480px

Обратите внимание, что не все браузеры поддерживают свойство transform. Для кросс-браузерной верстки придется дописывать префиксы -webkit-, -moz-, -o- и -ms-. То же самое со свойством transform-origin.

Но это совсем простой пример. А что если в SVG присутствует множество заливок, которые объединены в подгруппы и группы? Как сделать такое изображение отзывчивым?

Итак, у нас есть такая схема:

Она имеет ширину 640 px. Соответственно на дисплеях шириной ниже этого значения рисунок необходимо уменьшать. Но можно одновременно повернуть его, чтобы длинная сторона вставала вертикально. Пишем несложный медиа-запрос:

@media only screen and (max-width: 640px){
 .plan {
 transform: rotate(90deg) scale(0.8);

Можете сжать окно браузера и посмотреть результат.

Но обратите внимание: все иконки внутри рисунка также повернулись, но в обратном направлении, то есть сохранили свою ориентацию. Иконки в данном случае желательно объединить в группы с их фонами (кругами), чтобы вращение происходило вокруг центров групп — сами иконки таким образом не будут смещаться. Объединение объектов в группы в SVG выглядит так:

/*группа иконки спальни*/
<g id="bed-ico">
 <path class="bed" d="/*координаты фона*/>
 <path class="bed" d="/*координаты иконки*/>
</g>

Всем иконкам внутри изображения необходимо задать обратное вращение в медиа-запросе:

@media only screen and (max-width: 640px){
 #bed-ico /*здесь же указываются все остальные id или классы групп через запятую*/{
 transform: rotate(-90deg);
 }
}

А также задаем центр вращения для всех иконок вне медиа-запроса:

#bed-ico /*здесь же указываются все остальные id или классы групп через запятую*/{
 transform-origin: 50% 50%;
}

Безусловно, для максимально удобного отображения на всех устройствах медиа-запросов должно быть больше. На этой странице для нашего плана также настроены переходы на ширине 380 и 520 px. Но основные принципы мы изложили.

Таким образом у нас получается полностью отзывчивое SVG изображение. И, как видите, для этого можно использовать как отдельные элементы, так и их группы. Все вышеизложенное также присутствует в нашем видеоуроке:

Отзывчивая SVG графика

Обратите внимание: параметры viewBox останутся прежними. Соответственно изображение уменьшится и повернется внутри вьюбокса, и между его границей и самим изображением появится промежуток.

Параметры viewBox нельзя изменить в CSS. Поэтому выбирайте:

Сложный путь: менять эти параметры в JS, прописывая медиа-запросы еще и там.

Простой путь: сдвинуть все изображение вместе с вьюбоксом на нужное количество пикселей влево.

Здесь мы выбрали простой способ, а вы можете попробовать что-то еще. Рисуйте, разрабатывайте и развлекайтесь.