No exemplo a seguir, o círculo se adapta à largura da grade e mantém sua proporção. À medida que a largura do recipiente diminui, os círculos diminuem com ele ...
Porém, quando a altura é menor que a largura (segunda caixa), o círculo não diminui as sobreposições fora da grade. Existe uma maneira de adaptá-lo à altura, mantendo a proporção?
.container {
display: grid;
background-color: greenyellow;
margin: 5px;
min-height: 10px;
min-width: 10px;
}
.portrait {
max-height: 100px;
max-width: 200px;
}
.landscape {
max-height: 200px;
max-width: 100px;
}
.aspect-ratio {
grid-column: 1;
grid-row: 1;
background-color: deeppink;
border-radius: 50%;
align-self: center;
justify-self: center;
}
<div class="container landscape">
<svg class="aspect-ratio" viewBox="0 0 1 1"></svg>
</div>
<div class="container portrait">
<svg class="aspect-ratio" viewBox="0 0 1 1"></svg>
</div>
Respostas:
Depois de mexer algum tempo com esse problema, percebi que isso não é um problema com o layout da grade.
Como você nunca define altura / altura máxima ou largura / largura máxima para o seu SVG, o que está sendo calculado é
width:auto
eheight:auto
Nota: Eu trago max-height / max-width, pois eles teriam prioridade sobre os valores de largura / altura .
Agora, por que o layout da paisagem funciona e o retrato não funciona? Porque a largura está "priorizando" sua altura.
Fonte - Por que width: auto se comporta de maneira diferente de height: auto?
Isso significa que seu SVG está retirando o
width
contêiner e osheight
descendentes.No seu exemplo, seu SVG não tem descendentes, mas tem um pai com uma largura máxima definida . Mas o que isso significa para a altura do SVG ?
O SVG está calculando sua altura através da razão intrísica:
Fonte
E sua proporção intrísica é 1/1 = 1
Então você está forçando sua
height=width
As soluções)
A solução está configurando a
width
ou amargin
para o seu SVG, dependendo da proporção da sua div principal.No exemplo que você deu, você tem uma proporção de 2: 1, então seu SVG deve ter
width:50%
oumargin: 0 25%
.Isso significa que, se você deseja definir uma proporção diferente, deve ajustar em conformidade (veja retrato-1-3 no código abaixo).
A definição de uma regra CSS para cada proporção pode ser evitada se
height
não houver uma restrição, pois você pode definir awidth
para o SVG e o contêiner, permitindo que os elementos ajustemheight
para manter a proporção.Também adicionei o exemplo final, se alguém não se preocupa em manter a proporção, mas precisa conter o SVG em um conjunto
height
e em umwidth
contêiner.Note que eu não sou muito proficiente trabalhando com SVGs e essa resposta é resultado de pesquisas e muita experimentação! Ficaria feliz em receber quaisquer ajustes e / ou correções na minha resposta.
fonte
Adicione ao recipiente altura e largura específicas ao lado de altura e largura máx.
as unidades vw e vh podem ser usadas para tornar esse layout mais flexível.
Dessa forma, é possível definir
max-width: 100%; max-height: 100%;
o svg e ele não se sobrepõe.-EDITAR-
Como a caixa de exibição svg já é renderizada com a proporção correta, é seguro mover o fundo svg dentro do próprio svg para obter o resultado esperado: uma tag cicle fará o truque.
É possível imitar o raio da borda com outra marca de círculo dentro de uma máscara
Todos os outros elementos do svg devem ser colocados dentro de um grupo mascarado. ou seja:
<g mask="url(#mask)">
fonte