- Позиционирование иконок в одиночном файле SVG
- Позиционирование иконок с помощью ‘viewBox’
- Позиционирование нескольких иконок с помощью ‘preserveAspectRatio’
- Позиционирование иконок с помощью min-x, min-y ‘viewBox’
- Позиционирование изменением параметров команды ‘use’
Итак, мы выбрали векторные иконки, но сразу их использовать не получается, так как одни больше, другие меньше того размера, который нам необходим. Как изменить размеры иконок обсуждалось здесь.
Позиционирование, центрирование иконок внутри файла SVG очень тесно связано с масштабированием.
Позиционирование иконок в одиночном файле SVG
Позиционирование иконок внутри файла SVG становится необходимым, если при встраивании векторного изображения в страницу Html, появляются большие отступы текста вокруг иконок.
Возьмем иконку с размерами 48x48px, и добавим её внутрь Html страницы, таким образом, чтобы текст обтекал её слева. Ниже код иконки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<svg version="1" xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96" style="border:1px solid crimson" > <g fill="#00BCD4"> <rect x="37" y="18" width="6" height="24"/> <rect x="29" y="26" width="6" height="16"/> <rect x="21" y="22" width="6" height="20"/> <rect x="13" y="32" width="6" height="10"/> <rect x="5" y="28" width="6" height="14"/> </g> <g fill="#3F51B5"> <circle cx="8" cy="16" r="3"/> <circle cx="16" cy="18" r="3"/> <circle cx="24" cy="11" r="3"/> <circle cx="32" cy="13" r="3"/> <circle cx="40" cy="9" r="3"/> <polygon points="39.1,7.2 31.8,10.9 23.5,8.8 15.5,15.8 8.5,14.1 7.5,17.9 16.5,20.2 24.5,13.2 32.2,15.1 40.9,10.8"/> </g> </svg> |
Пример размещения иконки внутри Html.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla posuere non enim vitae tincidunt. Quisque eleifend, lectus a rhoncus cursus, libero risus condimentum ipsum, vitae finibus dolor metus eget turpis. Mauris vitae elementum sem. Aliquam urna ligula, pretium eu lorem non, dapibus dignissim lorem. Integer tempor tempus ex, a egestas lectus condimentum sed. Suspendisse tellus sem, placerat ac malesuada sed, tincidunt.
———————————————————————————————————————-
Результат не радует – получились огромные отступы текста справа и снизу. Чтобы понять причину этого, добавим красную рамку, которая показывает истинный размер ‘viewport’ – области просмотра SVG файла.
1 |
style="border:1px solid crimson" |
Сразу стало видно, что ‘viewport’ занимает в два раза больше места, чем иконка, именно из-за этого образуются большие отступы текста от иконки.
Для уменьшения отступов, нужно уменьшить размеры ‘viewport’.
У нас был масштаб – viewport / viewBox = 96/96 – M1:1.
Чтобы избежать искажения графики оставляем масштаб 1:1, но при этом уменьшаем размеры ‘вьюпорта’ и ‘вьюбокса’ – viewport / viewBox = 48/48 – M1:1.
1 2 |
<svg version="1" xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" style="border:1px solid crimson"> |
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla posuere non enim vitae tincidunt. Quisque eleifend, lectus a rhoncus cursus, libero risus condimentum ipsum, vitae finibus dolor metus eget turpis. Mauris vitae elementum sem. Aliquam urna ligula, pretium eu lorem non, dapibus dignissim lorem. Integer tempor tempus ex, a egestas lectus condimentum sed. Suspendisse tellus sem, placerat ac malesuada sed, tincidunt.
———————————————————————————————————————–
Размер иконки остался тот же, отступы текста сократились вдвое.
Позиционирование иконок с помощью ‘viewBox’
Этот способ позиционирования является наиболее простым и понятным. Он может быть использован на практике, если отступы от векторного объекта до краев области просмотра не критичны для вёрстки страницы.
Центрирование по горизонтали.
Возьмем иконку с геометрическими размерами 100×100 px и поместим её в прямоугольную область просмотра ‘viewport’ с шириной width =”200″ и высотой height=”100″ пикселей.
1 2 3 |
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="100" viewBox="0 0 100 100" xmlns:xlink="http://www.w3.org/1999/xlink" style="border: 1px dotted crimson;"> |
Здесь красная рамка показывает границы ‘viewport’ – области просмотра.
Так как ширина ‘viewport’ – больше в два раза ширины ‘viewBox’ мы ожидаем, что иконка должна растянуться по оси х-ов в два раза.
Но, на самом деле, растягивание изображения до границ ‘viewport’ не происходит, так как не указан атрибут – preserveAspectRatio отвечающий за пропорциональность трансформации. В этом случае его значение по умолчанию равно – preserveAspectRatio=”xMidYMid meet”, что соответствует центрированию изображения по осям “X” и “Y”
Чтобы получить растягивание изображения, как на картинке выше, значение этого параметра должно быть – preserveAspectRatio=”none”.
Далее примеры использования ‘preserveAspectRatio’ для различного позиционирования SVG иконки.
1 2 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="100" viewBox="0 0 100 100" preserveAspectRatio="xMinYMin meet" > |
1 2 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="100" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid meet" > |
1 2 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="100" viewBox="0 0 100 100" preserveAspectRatio="xMaxYMax meet" > |
Для этого назначим ‘viewport’ высотой 200px и шириной 100px
и атрибут – preserveAspectRatio=”xMidYMid meet”
1 2 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="200" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid meet" > |
Позиционирование с помощью ‘preserveAspectRatio’ возможно лишь в случае присутствия ‘viewBox’. В противном случае ‘preserveAspectRatio’ – игнорируется.
Позиционирование нескольких иконок с помощью ‘preserveAspectRatio’
На ум сразу приходит решение этой задачи – использовать ‘preserveAspectRatio’. Одну иконку направить влево – ‘xMinYMin’, вторую разместить по центру – ‘xMidYMid’, третью вправо – ‘xMaxYMax’. Каждую иконку обернуть в свой ‘symbol’, так как у него есть свой ‘viewBox’ и ‘preserveAspectRatio’. Структура в примере ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<svg xmlns="http://www.w3.org/2000/svg" width="310" height="100" viewBox="0 0 100 100" preserveAspectRatio="xMaxYMax meet" xmlns:xlink="http://www.w3.org/1999/xlink"> <symbol id="milk" viewBox="0 0 100 100" preserveAspectRatio="xMinYMin meet" > <path .../> </symbol> <symbol id="like" viewBox="0 0 100 100" preserveAspectRatio="xMidYmid meet"> <path .../> </symbol> <symbol id="letter" viewBox="0 0 100 100" preserveAspectRatio="xMaxYMax meet" > <path ... /> </symbol> <use xlink:href="#letter" /> <use xlink:href="#milk" /> <use xlink:href="#like" /> </svg> |
Не сработало.
Все три иконки собираются одна под другой в центре ‘viewport’. Это результат доминирующего действия ‘preserveAspectRatio’ в шапке файла SVG. И всё, что указано ниже в ‘symbol’ – игнорируется.
Как нейтрализовать действие ‘preserveAspectRatio’ в шапке файла и дать возможность этой же команде внутри ‘symbol’ позиционировать самостоятельно?
Попробовать убрать его в шапке файла, но по умолчанию будет всё равно центрирование – preserveAspectRatio=”xMidYmid meet”.
Присвоить ему значение – preserveAspectRatio=”none”? – Тогда верхняя иконка растянется на всю ширину ‘viewport’a.
Недостаток этого метода в малом количестве иконок, которые можно позиционировать – от одной до трёх.
Достоинство метода – блок иконок добавляется в Html, как один объект и то, что находится внутри его не влияет на разметку страницы.
Блок иконок легко может быть преобразован из горизонтального в вертикальный путем изменения ширины и высоты ‘viewport’ в шапке файла – width=”100″ height=”310″
Позиционирование иконок с помощью min-x, min-y ‘viewBox’
У ‘viewBox’ всё наоборот – уменьшение сторон ведет к увеличению масштаба изображения. Перемещение центра координат вправо, смещает изображение влево. Подробнее здесь.
Давайте используем это свойство смещения векторных изображений, путём изменения начала координат ‘viewBox’а, для еще одного способа позиционирования иконок.
Допустим нам надо в одном файле svg разместить по горизонтали 5 иконок. Размер каждой иконки – 126х126 px.
Расширяем ‘viewport’ по горизонтали до width=”630″, высоту оставляем прежней – height=”126″. Собираем в одном файле все иконки и оборачиваем код каждой в свой ‘symbol’ с уникальным ‘id’ . Изменением параметра ‘min-x’ (первая цифра ‘viewBox’) позиционируем каждую иконку.
Ниже структура файла SVG с пятью иконками. Обратите внимание, что у ‘viewBox’ов внутри ‘symbol’ изменяется только первая цифра, отвечающая за положение начала координат по оси абцисс.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<svg xmlns="http://www.w3.org/2000/svg" width="630" height="126" xmlns:xlink="http://www.w3.org/1999/xlink" > <symbol id="facebook" viewBox="245 0 126 126" > <!-- Здесь код иконки "facebook" --> <path ... /> </symbol> <symbol id="google" viewBox="122 0 126 126" > <!-- Здесь код иконки "google" --> <path ... /> </symbol> <symbol id="linkedin" viewBox=" 0 0 126 126" > <path .... /> </symbol> <symbol id="twitter" viewBox=" -122 0 126 126" > <path ... /> </symbol> <symbol id="vimeo" viewBox=" -245 0 126 126" > <path .../> </symbol> <!-- Вывод иконок на экран --> <use xlink:href="#facebook" /> <use xlink:href="#google" /> <use xlink:href="#linkedin" /> <use xlink:href="#twitter" /> <use xlink:href="#vimeo" /> </svg> |
Данный метод позволяет поместить в один файл сколько угодно векторных изображений, но более удобно позиционировать нечётное количество векторных объектов, так как средняя иконка позиционируется автоматически. Файл SVG можно встроить в Html несколькими способами. В данной статье svg добавляется, как изображение <img> с фолбэк’ом от David Bushell для браузеров не поддерживающих SVG
1 2 3 |
<div class="alignleft"> <img src="files/position-icon/viewBox-icons.svg" width="600" height="126" alt="viewBox-icons" onerror="this.onerror=null; this.src='files/position-icon/viewBox-icons.png'"></div> |
Обратите внимание, что при выводе изображения SVG заданы его размеры. Очень удобно, можно одновременно изменять масштаб всех иконок в блоке.
Необходимо только следить за пропорциями: было – width=”600″ height=”126″
стало – width=”300″ height=”63″ и третий вариант width=”150″ height=”31″
Позиционирование изменением параметров команды ‘use’
Команда ‘use’ создает прямоугольную область с началом координат – x=”0″ y=”0″ и служит для вывода изображений. Ширина и высота этой области, если не указаны другие значения, равны ширине и высоте ‘viewport’.
Последовательность позиционирования иконок по горизонтали следующая:
Расширяем ‘viewport’ в шапке файла, чтобы хватило места для всех иконок. Высоту ‘viewport’ – назначаем равной высоте иконок.
‘viewBox’, если он есть в шапке файла удаляем. Это для того, чтобы исключить воздействие – ‘preserveAspectRatio’
Код каждой иконки оборачиваем в’symbol’, присваиваем ему ‘id’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<svg xmlns="http://www.w3.org/2000/svg" width="600" height="126" xmlns:xlink="http://www.w3.org/1999/xlink"> <rect x="0" width="600" height="126" fill="#C9E4FF" /> <symbol id="facebook"> <!-- Здесь код иконки "facebook" --> <path ... /> </symbol> <symbol id="google" > <!-- Здесь код иконки "google" --> <path... /> </symbol> <symbol id="linkedin" > <!-- Здесь код иконки "linkedin" --> <path ..."/> </symbol> <symbol id="twitter" > <!-- Здесь код иконки "twitter" --> <path .../> </symbol> <symbol id="vimeo" > <!-- Здесь код иконки "vimeo" --> <path.../> </symbol> <!-- Позиционирование иконок по горизонтали --> <use x="-5" xlink:href="#vimeo" /> <use x="112" xlink:href="#facebook" /> <use x="235" xlink:href="#twitter" /> <use x="358" xlink:href="#linkedin" /> <use x="480" xlink:href="#google" /> </svg> |
Далее позиционируем иконки по горизонтали, изменяя значения – x=”…”. Обратите внимание, что можно менять иконки местами внутри блока SVG.
Большое спасибо, очень полезная статья.