cssresponsive-web-design

Mejora tu responsive web design con variables CSS

Las variables CSS pueden ofrecerte mejores resultados que las variables Sass en Responsive Web Design.

Las variables CSS son increíbles y su mejor característica es que están vivas en el navegador, lo que permite manipularlas con JavaScript o utilizarlas para hacer un mejor Responsive Web Design (como te enseñaré en este artículo).

Variables CSS en el navegador

Supongamos que nuestro diseño tiene un .main-header fijo en la parte superior del viewport y una altura diferente en móvil y desktop. Con el CSS de toda la vida lo escribimos así:

.main-header {
  height : 3rem;
}

@media screen and (min-width: 64em) {
  .main-header {
    height : 4rem;
  }
}

Puesto que este elemento es fijo, debemos empujar el body para que no haya elementos que queden tapados por el.

.main-header {
  height : 3rem;
}

body {
  margin-top : 3rem
}

@media screen and (min-width: 64em) {
  .main-header {
    height : 4rem;
  }
  body {
    margin-top : 4rem
  }
}

En este punto la cosa se empieza a complicar porque debemos cambiar valores en dos lugares distintos, y con que el proyecto crezca y otros elementos dependan de este valor, mantener el código será un caos (clásico de CSS 😄). Sería mejor guardar esa altura en una variable. Seguro piensas en Sass:

$header-height: 3rem;

.main-header {
  height : $header-height;
}

body {
  margin-top : $header-height;
}

@media screen and (min-width: 64em) {
  $header-height : 4rem;
}

Pero hay malas noticias: el código anterior no funciona. Las variables Sass nunca se compilan (solo se compilan sus valores cuando son utilizados en alguna declaración). Así que la forma correcta de hacerlo con Sass es la siguiente:

$header-height : 3rem;

.main-header {
  height : $header-height;
}

body {
  margin-top : $header-height;
}

@media screen and (min-width: 64em) {
  $header-height : 4rem;
  .main-header {
    height : $header-height;
  }
  body {
    margin-top : $header-height;
  }
}

Es decir, además de redeclarar la variable $header-height hay que volver a escribir las declaraciones para main-header y body 💩

Variables CSS al rescate

Puesto que las variables CSS están vivas en el navegador, pueden actualizarse en tiempo real y el navegador actualizará los valores automáticamente. Nuestro ejemplo previo quedará así:

:root {
  --header-height : 3rem;
}

.main-header {
  height : var(--header-height);
}

body {
  margin-top : var(--header-height)
}

@media screen and (min-width: 64em) {
  :root {
    --header-height : 4rem;
  }
}

Hermoso 😍. Podemos reducir el código un poco más (y hacerlo más entendible) usando Sass:

:root {
  --header-height : 3rem;
  @media screen and (min-width: 64em) {
    --header-height : 4rem;
  }
}

.main-header {
  height   : var(--header-height);
}

body {
  margin-top : var(--header-height)
}

Podemos usar el mismo principio para cualquier valor que cambie en una media query, ahorrándonos mucho tiempo y esfuerzo. Además de hacer el código más legible y mantenible (nuevamente, el problema clásico de CSS). Por ejemplo, podrías crear tu propio sistema de tipografía fácilmente:

:root {
  --h1-font-size    : 2rem;
  --h2-font-size    : 1.5rem;
  --body-font-size  : 1rem;
  --small-font-size : .8rem;
  
  @media screen and (min-width: 64em) {
    --h1-font-size    : 2.5rem;
    --h2-font-size    : 1.75rem;
    --body-font-size  : 1.2rem;
    --small-font-size : 1rem;
  }
}

h1 {
  font-size : var(--h1-font-size);
}

h2 {
  font-size : var(--h2-font-size);
}

body {
  font-size : var(--body-font-size);
}

.small {
  font-size : var(--small-font-size);
}

O tu propio grid:

:root {
  --grid-columns : repeat(2,1fr);
  --grid-gap     : 1rem;
  
  @media screen and (min-width: 40em) {
    --grid-columns : repeat(3,1fr);
    --grid-gap     : 1.5rem;
  }
  
  @media screen and (min-width: 64em) {
     --grid-columns : repeat(4,1fr);
     --grid-gap     : 2rem;
  }
}

.grid {
  display               : grid;
  grid-template-columns : var(--grid-columns);
  grid-gap              : var(--grid-gap);
}

Recuerda que en EDteam tenemos un curso gratuito de variables CSS que te enseña este y más trucos. ¿Ya usas variables CSS en tus proyectos? Y si aún no, ¿qué estás esperando?