WoJ
Lo que quiero lograr:
Usando Diseño de cuadrícula CSSpara tener una página con una columna derecha cuyo tamaño se deriva de su contenido, pero solo hasta el 20% del ancho de la ventana.
Cómo pensé que funcionaría:
div {
border-style: solid;
}
#container {
width: 300px;
height: 300px;
display: grid;
grid-template-columns: 1fr minmax(auto, 20%);
}
<div id="container">
<div>
some content
</div>
<div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec cursus eu leo ac ultrices. Vivamus ornare, orci sed pretium sollicitudin
</div>
</div>
Se ve bien, pero luego cuando elimino el contenido del segundo div
la columna de la izquierda no colapsa:
div {
border-style: solid;
}
#container {
width: 300px;
height: 300px;
display: grid;
grid-template-columns: 1fr minmax(auto, 20%);
}
<div id="container">
<div>
some content
</div>
<div></div>
</div>
Mi pregunta:
Tenía la impresión de que desde minmax()
(…) define un rango de tamaño mayor o igual al mínimo y menor o igual al máximo.
significaría que en mi caso el ancho se establece desde auto
(= 0
cuando el div
está vacío) a 20%
. Sin embargo, se mantiene en un 20%. ¿Por que es esto entonces?
“La función de ajuste de contenido acepta un parámetro, el valor máximo. Una columna/fila de cuadrícula con esta propiedad establecida seguirá ocupando el mínimo espacio necesario, de acuerdo con su contenido, pero no más que el valor máximo”.
Ver este artículo: ¡Conviértete en un CSS Grid Ninja!
Puede resolver su caso sin dejar de utilizar máximos basados en porcentajes:
div {
outline: 1px dotted gray;
}
.container {
width: 300px;
height: 300px;
display: grid;
grid-template-columns: 1fr fit-content(20%);
}
.container div {
overflow: hidden; /* this needs to be set so that width respects fit-content */
}
<div class="container">
<div>
some content
</div>
<div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec cursus eu leo ac ultrices. Vivamus ornare, orci sed pretium sollicitudin
</div>
</div>
<div class="container">
<div>
some content
</div>
<div></div>
</div>
-
esto hará que esa columna se reduzca para ajustarse al contenido en ella
– lboyel
16 abr 2020 a las 15:30
-
Cuando se publicó esta respuesta,
fit-content()
tenía un soporte de navegador más limitado. Hoy en día, todavía requiere un prefijo en Firefox. caniuse.com/#search=fit-content– Michael Benjamín
30 de abril de 2020 a las 17:49
Vadim Ovchinnikov
has entendido mal minmax
función. Primero intenta aplicar el valor máximo y cuando eso no es posible, aplica el mínimo.
Entonces, para arreglar su diseño, solo necesita calcular 20%
del ancho de su contenedor, aplíquelo usando max-width
propiedad para su elemento de cuadrícula, y use auto
en tus grid-template-columns
definición de propiedad para la segunda columna. Manifestación:
div {
outline: 1px dotted gray;
}
.container {
width: 300px;
height: 300px;
display: grid;
grid-template-columns: 1fr auto;
}
.container > :nth-child(2) {
max-width: 60px; /* 20% x 300px */
}
<div class="container">
<div>
some content
</div>
<div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec cursus eu leo ac ultrices. Vivamus ornare, orci sed pretium sollicitudin
</div>
</div>
<div class="container">
<div>
some content
</div>
<div></div>
</div>
Actualización: se utilizará una solución más flexible fit-content
función de esta respuesta.
-
ah Yo leo define un rango de tamaño mayor o igual al mínimo y menor o igual al máximo como un continuo de min a max. Tu explicación es mucho más precisa. Gracias. En ese caso
max-width
de hecho, será el camino a seguir (esperaba evitar dos entradas para la misma acción de configuración de dimensiones en la columna)– WoJ
2 de agosto de 2017 a las 14:06
G-Cyrillus
Es posible que deba configurar el max-width
en el propio contenedor y deje que su columna se establezca en auto
.
div,
aside {
border-style: solid;
}
#container {
width: 300px;
height: 300px;
display: grid;
grid-template-columns: 1fr auto;
}
aside {
max-width: 60px; /* 60px is 20% of 300px*/
/* max-width:20%; 20% of window's */
font-size: 0;
transition: 0.25s;
}
#container:hover aside {
font-size: 1em;
}
<div id="container">
<div>
Hover it to see aside grow till 20% average width
</div>
<aside>lets give a try to resize it from content</aside>
</div>
Me gustaría tener una página con una columna a la derecha hay muchas otras formas de lograr esto, ¿hay alguna razón específica para usar
grid-template-columns
?– Abhishek Pandey
2 de agosto de 2017 a las 11:17
@AbhishekPandey: sí, toda la aplicación se basa en CSS Grid (lo aclararé en la pregunta)
– WoJ
2 de agosto de 2017 a las 11:21