Saltar al contenido

Número máximo de columnas de la cuadrícula CSS sin consultas de medios

Solución:

Con la cuadrícula CSS puede considerar el uso de max(width,100%/N) dónde N es el número máximo de columnas. Si el ancho del contenedor aumenta, 100%/N seguramente será más grande que width así no tendremos más de N elementos por fila.

.grid-container 
  --n:4; /* the max number of columns */
  display: grid;
  grid-template-columns:repeat(auto-fill,minmax(max(200px,100%/var(--n)),1fr));


.grid-item 
  background: tomato;
  padding: 5px;
  height: 50px;
  margin: 10px;
  
  line-height: 50px;
  color: white;
  font-weight: bold;
  font-size: 2em;
  text-align: center;
  box-sizing:border-box;
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8

Con lagunas:

.grid-container 
  --n:4; /* the max number of columns */
  display: grid;
  grid-template-columns:repeat(auto-fill,
           minmax(max(200px,(100% - (var(--n) - 1)*10px)/var(--n)),1fr));
  gap:10px;
  margin:5px;


.grid-item 
  background: tomato;
  padding: 5px;
  height: 50px;
  
  line-height: 50px;
  color: white;
  font-weight: bold;
  font-size: 2em;
  text-align: center;
  box-sizing:border-box;
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8


Con flexbox, simplemente puede configurar un max-width al contenedor ya que sus elementos tienen un ancho fijo:

.flex-container 
  display: flex;
  flex-wrap: wrap;
  max-width:calc(5*(200px + 20px)); 


.flex-item 
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 100px;
  margin: 10px;
  
  line-height: 100px;
  color: white;
  font-weight: bold;
  font-size: 2em;
  text-align: center;
  box-sizing:border-box;
1
2
3
4
5
6
7
8

El único inconveniente es que necesita conocer el ancho de sus elementos y su margen para establecer correctamente el max-width.

Si desea que sus elementos se expandan y cubran todo el ancho, puede usar un truco con min-width como abajo:

.flex-container 
  display: flex;
  flex-wrap: wrap;


.flex-item 
  background: tomato;
  padding: 5px;
  min-width: 200px;
  width:calc(100%/5 - 20px); /*5 columns*/
  height: 100px;
  margin: 10px;
  
  line-height: 100px;
  color: white;
  font-weight: bold;
  font-size: 2em;
  text-align: center;
  box-sizing:border-box;
1
2
3
4
5
6
7
8

Aquí también debe considerar el margen.Puede hacer esto fácilmente más flexible usando la variable CSS:

.flex-container 
  display: flex;
  flex-wrap: wrap;


.flex-item 
  --m:10px;
  background: tomato;
  padding: 5px;
  min-width: 200px;
  width:calc(100%/5 - 2*var(--m)); /*5 columns*/
  height: 100px;
  margin: var(--m);
  
  line-height: 100px;
  color: white;
  font-weight: bold;
  font-size: 2em;
  text-align: center;
  box-sizing:border-box;
1
2
3
4
5
6
7
8

También puedes considerar flex-grow si desea que su elemento siempre se expanda (incluso cuando hay un ajuste), pero puede enfrentar el problema de la última fila que debe solucionar con algunos trucos:

.flex-container 
  display: flex;
  flex-wrap: wrap;
  --m:10px;


.flex-item 
  background: tomato;
  padding: 5px;
  min-width: 200px;
  flex-grow:1;
  width:calc(100%/5 - 2*var(--m)); /*5 columns*/
  height: 100px;
  margin: var(--m);
  
  line-height: 100px;
  color: white;
  font-weight: bold;
  font-size: 2em;
  text-align: center;
  box-sizing:border-box;


.flex-container span 
  min-width: 200px;
  flex-grow:1;
  width:calc(100%/5 - 2*var(--m)); /*5 columns*/
  margin:0 var(--m);
1
2
3
4
5
6
7
8

En el siguiente ejemplo, hicimos que el número de columnas sea 5, por lo que necesitaremos al menos 4 elementos vacíos para solucionar el problema en caso de que tengamos de uno a 4 elementos en la última fila. Por supuesto, esto es un inconveniente, pero como conoce la cantidad de columnas, puede configurar fácilmente esos elementos vacíos y no necesitará ningún JS.

Para hacerlo más flexible, aquí hay una idea con variables CSS:

.flex-container 
  display: flex;
  flex-wrap: wrap;
  border:1px solid;
  --m:10px;
  --n:5;
  --width:150px;


.flex-item 
  background: tomato;
  min-width: var(--width);
  flex-grow:1;
  width:calc(100%/var(--n) - 2*var(--m));
  height: 50px;
  margin: var(--m);
  
  box-sizing:border-box;


.flex-container span 
  display:contents; /* each span will give us 2 elements*/

.flex-container span:before,
.flex-container span:after,
.flex-container:before,
.flex-container:after
  content:"";
  min-width: var(--width);
  flex-grow:1;
  width:calc(100%/var(--n) - 2*var(--m));
  margin:0 var(--m);
  order:1; /*we make sure they are at the end*/
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8

solía display:contents para poder configurar N elementos vacíos que luego serán considerados como 2 * N que pueden reducir el código.

Si tiene 7 columnas, solo necesitaremos 6 elementos adicionales. Podemos usar los dos pseudo elementos y luego solo 2 elementos vacíos para cubrir los 4 restantes.

No puedes explícitamente hazlo por un caja flexible o por un Cuadrícula CSS – pero puedes usar un cortar a tajos utilizando CSS Variables (normalmente eso es todo lo que necesitas).


Diseño de cuadrícula CSS

Por ejemplo, puede configurar número de columna global en el :root mientras que un número de columna específico sobre el envoltorio de rejilla – ver un Cuadrícula CSS a continuación con 4 columnas configuradas globalmente:

:root 
  --columns: 3;


.grid 
  display: grid;
  grid-gap: 10px;
  /* adjusting for the 10px grid-gap as well */
  grid-template-columns: repeat(auto-fit, minmax(calc(100% / var(--columns) - 20px), 1fr)); 


.grid > * 
  background-color: green;
  height: 200px;
1
2
3
4
5
6

Ahora puede establecer una regla para número de columnas sobre el contenedor de rejilla por redeclarar--columns (o puede hacer que JS agregue un class que contiene el --columns declaración) – vea la demostración a continuación:

:root 
  --columns: 3;


.grid 
  display: grid;
  grid-gap: 10px;
  --columns: 4; /* re-define the number of columns */
  grid-template-columns: repeat(auto-fit, minmax(calc(100% / var(--columns) - 20px), 1fr));


.grid > * 
  background-color: green;
  height: 200px;
1
2
3
4
5
6


Flexbox

Argumentos similares son válidos para cajas flexibles – vea una demostración simplificada a continuación:

:root 
  --columns: 3;


.flexbox 
  display: flex;
  flex-wrap: wrap;
  --columns: 4; /* re-define the number of columns */


.flexbox > * 
  background-color: green;
  height: 200px;
  margin: 10px;
  flex-basis: calc(100% / var(--columns) - 20px);
1
2
3
4
5
6

Te mostramos reseñas y calificaciones

Si te ha resultado provechoso este artículo, nos gustaría que lo compartas con otros desarrolladores de esta forma nos ayudas a extender este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *