Após 48 horas de pesquisa, acabei fazendo isso para obter escala proporcional:
NOTA: Este exemplo é escrito com React. Se você não estiver usando isso, mude o material da caixa de camelo de volta para hífens (ou seja: mude backgroundColor
para background-color
e mude o estilo de Object
volta para 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>
Aqui está o que está acontecendo no código de exemplo acima:
VIEWBOX
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
min-x, min-y, largura e altura
ou seja: viewbox = "0 0 1000 1000"
O Viewbox é um atributo importante, porque basicamente informa ao SVG qual o tamanho para desenhar e onde. Se você usasse CSS para criar o SVG 1000x1000 px, mas sua caixa de visualização fosse 2000x2000, veria o quarto superior esquerdo do seu SVG.
Os dois primeiros números, min-x e min-y, determinam se o SVG deve ser deslocado dentro da caixa de exibição.
Meu SVG precisa deslocar para cima / baixo ou esquerda / direita
Examine isto: viewbox = "50 50 450 450"
Os dois primeiros números deslocam o SVG para 50px para cima e para 50px, e os dois primeiros números são do tamanho da caixa de exibição: 450x450 px. Se o seu SVG é de 500 x 500, mas possui algum preenchimento extra, você pode manipular esses números para movê-lo dentro da "caixa de visualização".
Seu objetivo neste momento é alterar um desses números e ver o que acontece.
Você também pode omitir completamente a caixa de visualização, mas sua milhagem variará dependendo de todas as outras configurações que você tiver no momento. Na minha experiência, você encontrará problemas com a preservação da proporção, porque a caixa de visualização ajuda a definir a proporção.
PRESERVE ASPECT RATIO
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
Com base em minha pesquisa, existem muitas configurações diferentes de proporção, mas a padrão é chamada xMidYMid meet
. Coloquei no meu para me lembrar explicitamente. xMidYMid meet
a escala proporcional com base nos pontos médios X e Y. Isso significa que permanece centralizado na caixa de exibição.
LARGURA
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width
Veja o meu código de exemplo acima. Observe como eu defino apenas largura, sem altura. Eu o defino como 100% para que preencha o contêiner em que está. É provavelmente o que mais contribui para responder a essa pergunta do Stack Overflow.
Você pode alterá-lo para o valor de pixel desejado, mas recomendo usar 100% como fiz para aumentar o tamanho máximo e controlá-lo com CSS por meio do contêiner pai. Eu recomendo isso, porque você obterá o controle "adequado". Você pode usar consultas de mídia e controlar o tamanho sem JavaScript louco.
ESCALAR COM CSS
Veja meu código de exemplo acima novamente. Observe como eu tenho essas propriedades:
resize: 'horizontal', // you can safely omit this
overflow: 'hidden', // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',
Isso é adicional, mas mostra como permitir que o usuário redimensione o SVG enquanto mantém a proporção adequada. Como o SVG mantém sua própria proporção, você só precisa redimensionar a largura no contêiner pai e redimensionar conforme desejado.
Deixamos a altura em paz e / ou a definimos como automática e controlamos o redimensionamento com largura. Eu escolhi a largura porque geralmente é mais significativa devido a designs responsivos.
Aqui está uma imagem dessas configurações sendo usadas:
Se você leu todas as soluções nesta pergunta e ainda está confuso ou não vê o que precisa, confira este link aqui. Eu achei muito útil:
https://css-tricks.com/scale-svg/
É um artigo massivo, mas divide praticamente todas as formas possíveis de manipular um SVG, com ou sem CSS. Eu recomendo a leitura enquanto você toma um café casualmente ou escolhe líquidos selecionados.