Hasta hace poco, maquetar un calendario en CSS era bastante rollo. No es que fuese imposible, ni mucho menos, pero para crear la cuadrĂcula de dĂas debĂamos de tener en cuenta unas cuantas cosas y hacĂa que el CSS fuese, no complicado, pero sĂ algo largo.
Con la llegada de display: grid
a alguien se le ha ocurrido una ingeniosa manera de simplificar esto. He creado un vĂdeo donde enseño paso a paso cĂłmo hacerlo, para que veas la potencia de esta estrategia:
{{< youtube id=“Bpyl59_fjvU” >}}
Si prefieres leer texto, pues sigue por aquĂ, que te voy contando. 👇
El marcado de nuestro calendario
Como un calendario no deja de ser una lista numerada de nĂşmeros, vamos a utilizar la etiqueta <ol>
. Cada dĂa será un elemento de la lista, por lo que cada dĂa será un <li>
. Para saber en quĂ© dĂa de la semana estamos podrĂamos usar tambiĂ©n 7 elementos <li>
para indicar los dĂas de Lunes a Domingo.
QuedarĂa algo asĂ:
<div>
<h1>Enero 2021</h1>
<ol>
<li class="day-name">Lun</li>
<li class="day-name">Mar</li>
<li class="day-name">Mié</li>
<li class="day-name">Jue</li>
<li class="day-name">Vie</li>
<li class="day-name">Sáb</li>
<li class="day-name">Dom</li>
<li class="first-day">1</li>
<li>2</li>
<!-- ... -->
<li>31</li>
</ol>
</div>
Como ves, hemos marcado con una clase tanto el dĂa de la semana (.day-name
) como el primer dĂa numĂ©rico (.first-day
). De esta forma, podremos estilar fácilmente esas partes y luego te explicaré cómo.
Las 3 lĂneas mágicas de CSS para estilar un calendario
Como un calendario no deja de ser una cuadrĂcula de nĂşmeros… ya te puedes imaginar que vamos a utilizar display: grid
. Ahora bien, esto no es suficiente, tenemos una cuadrĂcula pero… Âżde cuantas columnas? Pues si la semana tiene 7 dĂas, parece bastante evidente que nuestra cuadrĂcula va a tener 7 columnas:
ol {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
}
Desde luego no parece muy adecuado poner a mano cada fr
para indicar las siete columnas. No te preocupes, hay una forma mejor usando el método repeat
.
ol {
display: grid;
grid-template-columns: repeat(7, 1fr);
}
Ahora mejor. Si probases este cĂłdigo verĂas que, aunque empieza a tener mejor pinta… salen demasiados nĂşmeros y es que, por defecto, la etiqueta ol
nos indica el número de cada elemento. Vamos a ocultar esto, ya que no los necesitamos. Y también quitamos el padding que añade por defecto:
ol {
display: grid;
grid-template-columns: repeat(7, 1fr);
list-style: none;
padding: 0;
}
¡Mucho mejor! Ahora, sĂ que parece un calendario pero, sin embargo, existe un problema y es que el dĂa 1 de enero de 2021 no cae en lunes, que es lo que nos estarĂa mostrando. El dĂa correcto serĂa empezar en viernes. ÂżCĂłmo hacemos para que empiece por el dĂa correcto?
Usando la clase .first-day
vamos a indicarle en quĂ© columna deberĂa empezar a poner los nĂşmeros. En este caso lo correcto serĂa que empezase en viernes. Esto es, en la quinta columna. Pues añadimos este CSS para hacer que funcione:
.first-day {
grid-column-start: 5;
}
A partir de aquĂ puedes empezar a estilar y dejar a tu gusto el calendario CSS. AquĂ te dejo una demo completa con una versiĂłn bastante sencilla pero puedes entretenerte jugando con ello:
Referencias:
Calendar Tricks: A calendar in three lines of CSS