Después de jugar un tiempo con este problema, pensé que no era un problema con el diseño de la cuadrícula.
Como nunca define altura / altura máxima o ancho / ancho máximo para su SVG, lo que se calcula es width:auto
yheight:auto
Nota: menciono max-height / max-width ya que estos tendrían prioridad sobre los valores de ancho / alto .
Ahora bien, ¿por qué funciona su diseño de paisaje y su diseño de retrato no funciona? Porque el ancho "tiene prioridad" sobre su altura.
Y es por eso que, en el diseño de bloque, una altura automática se basa en la altura total de los descendientes y un ancho automático se basa en el ancho del bloque que lo contiene.
Fuente: ¿por qué ancho: auto se comporta de manera diferente que altura: auto?
Esto significa que su SVG está tomando el width
de su contenedor y el height
de sus descendientes.
En su ejemplo, su SVG no tiene descendientes, pero tiene un padre con un definido ancho máximo . Pero, ¿qué significa esto para la altura del SVG ?
El SVG está calculando su altura a través de la relación intrínseca:
Si el 'viewBox' en el elemento 'svg' está correctamente especificado:
- deje que viewbox sea el viewbox definido por el atributo 'viewBox' en el elemento 'svg'
- return viewbox.width / viewbox.height
Fuente
Y tu relación intrínseca es 1/1 = 1
Entonces estás forzando tu height=width
Las soluciones)
La solución es establecer una width
o unamargin
a su SVG en función de la proporción de su padre div.
En el ejemplo que dio, tiene una proporción de 2: 1, por lo que su SVG debería tener width:50%
omargin: 0 25%
.
Esto significa que si desea establecer una proporción diferente, debe ajustar en consecuencia (vea el retrato 1-3 en el código a continuación).
Se podría evitar establecer una regla CSS para cada proporción si height
no es una restricción, ya que podría definir un width
para su SVG y contenedor, permitiendo que los elementos ajusten elheight
para mantener su relación de aspecto.
También he agregado el último ejemplo si a alguien no le importa mantener la relación de aspecto, pero necesita contener el SVG en un conjunto height
y width
contenedor.
.container {
display: grid;
background-color: greenyellow;
margin: 5px;
min-height: 10px;
min-width: 10px;
}
.portrait {
max-height: 100px;
max-width: 200px;
}
/* Add 25% margin left and right to center the image OR set the image width to 50% */
.portrait>.aspect-ratio {
margin: 0 25%;
/*
or
width:50%;
*/
}
.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;
}
/* Set fixed max-height and max-width rule (33% proportion) */
.portrait-1-3 {
max-height: 100px;
max-width: 300px;
}
/* Align image with the new proportion */
.portrait-1-3>.aspect-ratio {
margin: 0 33.33%;
/*
or
width:33.3%;
*/
}
/* Removed max-height and let the container adjust the height according to the max-width rule and the proportion set */
.portrait-any-height {
max-width: 400px;
}
/* Height will be adjusted through the width/margin defined here, so 10% width will correspond to 40px of height (10%*400px)*(aspect ratio=1)*/
.portrait-any-height>.aspect-ratio {
width:10%;
}
/* Set fixed max-height and max-width rule (proportion doesn't matter) */
.portrait-squeezed {
max-height: 100px;
max-width: 300px;
}
/* Make sure SVG complies with the the given max with and height (squeezing your svg) */
.portrait-squeezed>.aspect-ratio {
max-height: inherit;
max-width: inherit;
}
<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>
<div class="container portrait-1-3">
<svg class="aspect-ratio" viewBox="0 0 1 1"></svg>
</div>
<div class="container portrait-any-height">
<svg class="aspect-ratio" viewBox="0 0 1 1"></svg>
</div>
<div class="container portrait-squeezed">
<svg class="aspect-ratio" viewBox="0 0 1 1"></svg>
</div>
Tenga en cuenta que no soy muy competente trabajando con SVG y esta respuesta es el resultado de la investigación y mucha experimentación. Estaré encantado de recibir cualquier ajuste y / o corrección a mi respuesta.