После примерно 48 часов исследований я в итоге сделал это, чтобы получить пропорциональное масштабирование:
ПРИМЕЧАНИЕ. Этот образец написан с использованием React. Если вы не используете это, измените материал дела верблюда обратно на дефисы (то есть: измените backgroundColor
на background-color
и измените стиль Object
обратно на a String
).
<div
style={{
backgroundColor: 'lightpink',
resize: 'horizontal',
overflow: 'hidden',
width: '1000px',
height: 'auto',
}}
>
<svg
width="100%"
viewBox="113 128 972 600"
preserveAspectRatio="xMidYMid meet"
>
<g> ... </g>
</svg>
</div>
Вот что происходит в приведенном выше примере кода:
Viewbox
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
min-x, min-y, ширина и высота
т.е.: viewbox = "0 0 1000 1000"
Viewbox является важным атрибутом, потому что он в основном говорит SVG, какой размер рисовать и где. Если вы использовали CSS для создания SVG 1000x1000 px, но ваш viewbox был 2000x2000, вы увидите верхнюю левую четверть SVG.
Первые два числа, min-x и min-y, определяют, должен ли SVG быть смещен внутри окна просмотра.
Мой SVG должен сдвигаться вверх / вниз или влево / вправо
Изучите это: viewbox = "50 50 450 450"
Первые два числа будут сдвигать SVG влево на 50 пикселей и выше на 50 пикселей, а вторые два числа соответствуют размеру окна просмотра: 450x450 пикселей. Если ваш SVG имеет размер 500x500, но на нем есть дополнительные отступы, вы можете манипулировать этими числами, чтобы перемещать их внутри «окна просмотра».
Ваша цель на данный момент состоит в том, чтобы изменить один из этих номеров и посмотреть, что произойдет.
Вы также можете полностью опустить окно просмотра, но тогда ваш пробег будет варьироваться в зависимости от всех других настроек, которые у вас есть в данный момент. По моему опыту, вы столкнетесь с проблемами с сохранением соотношения сторон, потому что окно просмотра помогает определить соотношение сторон.
СОХРАНИТЬ АСПЕКТ
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
Основываясь на моих исследованиях, существует множество различных настроек соотношения сторон, но по умолчанию они называются xMidYMid meet
. Я положил это на себя, чтобы явно напомнить себе. xMidYMid meet
пропорционально масштабируется в зависимости от средней точки X и Y. Это означает, что он остается в центре окна просмотра.
ШИРИНА
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width
Посмотрите на мой пример кода выше. Обратите внимание, как я установил только ширину, а не высоту. Я установил его на 100%, чтобы он заполнил контейнер, в котором он находится. Это то, что, вероятно, больше всего способствует ответу на этот вопрос переполнения стека.
Вы можете изменить его на любое значение пикселя, которое хотите, но я бы рекомендовал использовать 100%, как я, чтобы увеличить его до максимального размера, а затем управлять им с помощью CSS через родительский контейнер. Я рекомендую это, потому что вы получите «правильный» контроль. Вы можете использовать медиа-запросы, и вы можете контролировать размер без сумасшедшего JavaScript.
Масштабирование с помощью CSS
Посмотрите на мой пример кода выше снова. Обратите внимание, как у меня есть эти свойства:
resize: 'horizontal', // you can safely omit this
overflow: 'hidden', // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',
Это дополнительная информация, но она показывает, как разрешить пользователю изменять размер SVG, сохраняя при этом правильное соотношение сторон. Поскольку SVG поддерживает свое собственное соотношение сторон, вам нужно только изменить ширину в родительском контейнере, и она изменит размер по желанию.
Мы оставляем высоту в одиночестве и / или устанавливаем ее на авто, и мы контролируем изменение размера по ширине. Я выбрал ширину, потому что это часто более значимо из-за отзывчивых проектов.
Вот изображение этих настроек используется:
Если вы прочитали каждое решение в этом вопросе и все еще не понимаете, что вам нужно, перейдите по этой ссылке здесь. Я нашел это очень полезным:
https://css-tricks.com/scale-svg/
Это огромная статья, но она разбивает практически все возможные способы манипулирования SVG, с или без CSS. Я рекомендую прочитать его, попивая кофе или выбор жидкости.