Після 48 годин досліджень я зробив це, щоб отримати пропорційне масштабування:
ПРИМІТКА. Цей зразок написаний за допомогою React. Якщо ви не використовуєте , що змінити ГорбатийРегістр річ назад в дефіс (тобто зміни backgroundColor
в background-color
і змінити стиль Object
назад до 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>
Ось що відбувається у наведеному вище прикладі коду:
ПІДГОТОВКА
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, але у вашому вікні перегляду 2000x2000, ви побачите верхню ліву чверть свого SVG.
Перші два числа, min-x та min-y, визначають, чи слід SVG змістити всередині вікна перегляду.
Мій SVG повинен зміщуватися вгору / вниз або вліво / вправо
Вивчіть це: viewbox = "50 50 450 450"
Перші два номери змінять ваш SVG вліво на 50 пікселів і вгору на 50 пікселів, а другі два числа - розмір вікна перегляду: 450x450 пікселів. Якщо ваш SVG розміром 500x500, але на ньому є додаткові накладки, ви можете маніпулювати цими номерами, щоб перемістити його всередині "viewbox".
Ваша мета на даний момент - змінити одне з цих чисел і подивитися, що відбувається.
Ви також можете повністю опустити вікно перегляду, але тоді ваш пробіг буде змінюватися залежно від будь-яких інших налаштувань, які ви маєте на той час. На мій досвід, у вас виникнуть проблеми із збереженням співвідношення сторін, оскільки вікно перегляду допомагає визначити співвідношення сторін.
ЗБЕРІГАЙТЕ АСПЕКТНИЙ РАЙОН
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 або без нього. Рекомендую прочитати його, недбало пивши каву або вибираючи вибрані рідини.