Dopo circa 48 ore di ricerca, ho finito per farlo per ottenere un ridimensionamento proporzionale:
NOTA: questo esempio è scritto con React. Se non lo stai usando, cambia la roba della custodia del cammello in trattini (cioè: cambia backgroundColor
in background-color
e cambia lo stile Object
in 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>
Ecco cosa sta succedendo nel codice di esempio sopra:
viewbox
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
min-x, min-y, larghezza e altezza
ovvero: viewbox = "0 0 1000 1000"
Viewbox è un attributo importante perché sostanzialmente dice all'SVG quale dimensione disegnare e dove. Se avessi usato CSS per creare SVG 1000x1000 px ma il tuo riquadro di visualizzazione fosse 2000x2000, vedresti il quarto in alto a sinistra del tuo SVG.
I primi due numeri, min-x e min-y, determinano se l'SVG deve essere sfalsato all'interno del riquadro di visualizzazione.
Il mio SVG deve spostarsi su / giù o a sinistra / a destra
Esaminare questo: viewbox = "50 50 450 450"
I primi due numeri sposteranno il tuo SVG a sinistra di 50 px e su di 50 px, e i secondi due numeri hanno la dimensione del riquadro di visualizzazione: 450x450 px. Se il tuo SVG è 500x500 ma ha qualche imbottitura extra, puoi manipolare quei numeri per spostarlo all'interno della "viewbox".
Il tuo obiettivo a questo punto è cambiare uno di quei numeri e vedere cosa succede.
Puoi anche omettere completamente la viewbox, ma la tua distanza varierà in base a tutte le altre impostazioni che hai in quel momento. Nella mia esperienza, incontrerai problemi con la conservazione delle proporzioni perché la viewbox aiuta a definire le proporzioni.
CONSERVARE IL RAPPORTO ASPETTO
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
Sulla base della mia ricerca, ci sono molte impostazioni di proporzioni diverse, ma viene chiamata quella predefinita xMidYMid meet
. L'ho messo sul mio per ricordare esplicitamente a me stesso. xMidYMid meet
lo fa ridimensionare proporzionalmente in base al punto medio X e Y. Ciò significa che rimane centrato nel riquadro di visualizzazione.
LARGHEZZA
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width
Guarda il mio codice di esempio sopra. Nota come imposto solo la larghezza, non l'altezza. L'ho impostato al 100% in modo da riempire il contenitore in cui si trova. Questo è ciò che probabilmente contribuisce maggiormente a rispondere a questa domanda StackTranslate.it.
Puoi cambiarlo in qualsiasi valore di pixel tu voglia, ma ti consiglio di usare il 100% come ho fatto per farlo esplodere fino alla dimensione massima e quindi controllarlo con CSS tramite il contenitore padre. Lo consiglio perché otterrai un controllo "adeguato". Puoi utilizzare le query multimediali e puoi controllare le dimensioni senza JavaScript pazzo.
SCALING CON CSS
Guarda di nuovo il mio codice di esempio sopra. Nota come ho queste proprietà:
resize: 'horizontal', // you can safely omit this
overflow: 'hidden', // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',
Questo è aggiuntivo, ma mostra come consentire all'utente di ridimensionare l'SVG mantenendo le proporzioni corrette. Poiché SVG mantiene le proprie proporzioni, è necessario solo ridimensionare la larghezza sul contenitore padre e ridimensionerà come desiderato.
Lasciamo l'altezza da sola e / o la impostiamo su auto e controlliamo il ridimensionamento con larghezza. Ho scelto larghezza perché spesso è più significativo a causa di progetti reattivi.
Ecco un'immagine di queste impostazioni utilizzate:
Se leggi tutte le soluzioni in questa domanda e sei ancora confuso o non vedi esattamente ciò di cui hai bisogno, dai un'occhiata a questo link qui. L'ho trovato molto utile:
https://css-tricks.com/scale-svg/
È un articolo enorme, ma analizza praticamente ogni modo possibile per manipolare un SVG, con o senza CSS. Vi consiglio di leggerlo mentre bevete casualmente un caffè o la vostra scelta di liquidi selezionati.