- Как увеличить, уменьшить размеры векторных картинок.
- Как разместить картинку по центру.
- Почему при увеличении масштаба картинка обрезалась по краям.
- Почему изображение сдвинулось вправо, влево и так далее
Рецепты лечения не сложные, но в каждом конкретном случае по одному и тому же вопросу действия будут разные. Всё зависит от многих факторов, например для изменения масштабирования нужно ответить себе на вопросы:
Размеры ‘viewport’ и ‘viewBox’ в шапке файла заданы, они равны или отличаются друг от друга?
Картинка вызывается из внешнего файла или размещена inline в Html?
Есть ли у ‘Symbol’ свой ‘viewBox’?
Есть ли дополнительный ‘SVG’ опять же со своим ‘viewBox’?
В итоге получается, что векторное изображение может масштабироваться от одного до нескольких раз, до того момента, как мы увидим его на дисплее.
Начнем с простого.
Масштабирование изображения в одиночном файле SVG
Берем файл иконки 48х48 px, всё как есть, без изменений кода.
Произошло это из-за отсутствия в шапке SVG файла указания размеров viewPort. Если размеры width, height viewport’а не указаны, то они по умолчанию равны – 100%, поэтому изображение автоматически растянулось на весь экран.
1 2 3 4 5 6 7 8 |
<svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" > <path fill="#37474F" d="M6,36V8c0-2.2,1.8-4,4-4h14c2.2,0,4,1.8,4,4v28c0,2.2-1.8,4-4,4H10C7.8,40,6,38.2,6,36z"/> <path fill="#BBDEFB" d="M24,7H10C9.4,7,9,7.4,9,8v25c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1V8C25,7.4,24.6,7,24,7z"/> <rect x="14" y="36" fill="#78909C" width="6" height="2"/> <path fill="#C556AF" d="M20,40V12c0-2.2,1.8-4,4-4h14c2.2,0,4,1.8,4,4v28c0,2.2-1.8,4-4,4H24C21.8,44,20,42.2,20,40z"/> <path fill="#FFF3E0" d="M38,11H24c-0.6,0-1,0.4-1,1v25c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1V12C39,11.4,38.6,11,38,11z"/> <circle fill="#FFF3E0" cx="31" cy="41" r="1.5"/> </svg> |
Известно, что масштаб векторной картинки зависит от соотношения величин viewport / viewBox. Подробнее здесь.
1. Если соотношение сторон viewport / viewBox 1:1 – масштаб векторной картинки будет – М1:1, размеры в нашем случае 48х48 px, см. код ниже.
2. Если пропорция viewport / viewBox – 2:1 – масштаб М2:1, то есть происходит увеличение изображения в 2 раза – 96х96 px.
3. Если пропорция viewport / viewBox – 1:2 – масштаб М1:2, то есть происходит уменьшение изображения в 2 раза – 24х24 px.
Чтобы получить эти варианты масштабирования, корректируем каждый раз строку, добавляя, изменяя значения: width=”48″ height=”48″(viewport)
1 |
<svg version="1" xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" > |
1 |
<svg version="1" xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 48 48" > |
1 |
<svg version="1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 48 48" > |
Верхняя картинка – масштаб 1:1, средняя М2:1, нижняя М1:2;
Масштабирование изображения при наличии ‘symbol’
В этом случае векторная картинка проходит масштабирование несколько раз, так как ‘symbol’ имеет собственный ‘viewBox’.
Возьмем теперь иконку, которая имеет размеры 100х100px и ‘symbol’ с viewBox=”0 0 100 100″
1 2 3 4 5 6 7 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="0 0 100 100" > <symbol id="tweeter" viewBox="0 0 100 100"> <-- здесь код иконки --> </symbol> <-- Вызов иконки из символа --> <use xlink:href="#tweeter" /> </svg> |
Для того, чтобы увидеть, как влияет ‘symbol’ на масштаб картинки я убрал все другие факторы масштабирования:
задал в шапке файла соотношение viewport/viewBox – 1:1.
В команде вывода картинки на экран <use xlink:href=”#…..”/> не указал параметры width и height , которые тоже могли бы влиять на масштаб картинки. Итак, при этих заданных условиях, на масштаб теперь могут влиять только изменения параметров ‘viewBox’ – ‘символа’.
Иконка выше отрисовалась без изменений, в масштабе 1:1 к оригинальному размеру. Так как ‘viewBox’ – ‘символа’ тот же, что и в шапке файла.
Далее, допустим, у нас появилась необходимость уменьшить иконку в два раза. Все условия прежние, меняем только параметры – ‘viewBox’ – ‘символа’, увеличивая их в 2 раза.
1 2 3 4 5 6 7 8 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="0 0 100 100" style="border:1px solid red;"> <!-- Красная рамка -'viewport svg файла' <symbol id="tweeter" viewBox="0 0 200 200" <-- здесь код иконки --> </symbol> <-- Вызов иконки из символа --> <use xlink:href="#tweeter" /> </svg> |
С чем тут сравнивается ‘viewBox’ – ‘символа’ для вычисления масштаба? Ответ – с ‘viewport’, который задан в шапке SVG файла – viewport(SVG) / viewBox(symbol’s) – 100/200 = M1:2. Размер иконки стал – 50х50 px.
Обратите внимание на красную рамку вокруг иконки – это ‘viewport’, который задан в начале SVG файла – width=”100″ height=”100″. Это очень удобно – видеть границы ‘viewport’ во время настройки масштаба.
Размеры изображения после масштабирования могут стать больше, чем размеры ‘viewport’ поэтому они будут обрезаны по ширине и/или высоте ‘viewport’а. Смотри пример ниже.
1 2 3 4 5 6 7 8 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="0 0 100 100" style="border:1px solid red;"> <!-- Красная рамка -'viewport svg файла' <symbol id="tweeter" viewBox="0 0 50 50" <-- здесь код иконки --> </symbol> <-- Вызов иконки из символа --> <use xlink:href="#tweeter" /> </svg> |
‘viewport'(SVG) / ‘viewBox'(symbol’s) – 100/50 = M2:1.
Размер иконки стал – 200х200 px и поэтому в область просмотра ‘viewport’ – 100х100 px поместилась только верхняя четверть иконки.
Масштабирование изображения при использовании ‘use’
Для чистоты эксперимента отключаем все возможности масштабирования иконки, которые рассмотрели выше.
Оставляем масштабирование в команде ‘use’ с помощью параметров width и height. В отличии от ‘viewBox’, где уменьшение сторон влекло за собой увеличение масштаба, у команды ‘use’ прямо пропорциональная зависимость – увеличение width и height вызывает увеличение размеров вектоной картинки.
1 2 3 4 5 6 7 8 |
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="0 0 100 100"> <symbol id="beac" viewBox="0 0 100 100"> <! -- масштаб 1:1 --> <path fill="#85D4EE" d="M49.988 .... /> <! -- здесь код иконки --> </symbol > <!-- вызов иконки и её масштабирование --> <use width ="100" height="100" xlink:href="#beac" /> </svg> |
1 2 3 4 5 6 |
<!-- вызов иконки и её масштабирование --> <use width ="100" height="100" xlink:href="#beac" /> <use width ="75" height="75" xlink:href="#beac" /> <use width ="50" height="50" xlink:href="#beac" /> <use width ="25" height="25" xlink:href="#beac" /> <use width ="16" height="16" xlink:href="#beac" /> |
Статья получилась намного длиннее, чем я планировал, потому центрирование векторных изображений лучше рассмотреть в новой статье.