¿Qué es Sass?

Preprocesador CSS por excelencia


Uno de los preprocesadores CSS por excelencia es Sass. Pero... ¿Qué es un preprocesador? Como su propio nombre indica, un preprocesador es una herramienta que se encarga de procesar el código ANTES de que el navegador lo haga.

Gracias a eso, podemos escribir código Sass, que no es más que CSS con algunos añadidos (bucles, funciones, etc...), de modo que podamos escribir menos código y de forma más concisa.

¿Qué es Sass?

Sass es uno de los preprocesadores más populares que se ha establecido como preprocesador CSS por excelencia. Aunque muchas de sus innovaciones y características han terminado añadiéndose en CSS, aún hoy en día incorpora ciertas ventajas que aún no existen en CSS nativo.

Instalación

Utilizar es sencillo, sobre todo si utilizamos Vite. Lo único que debemos hacer es:

  • 1️⃣ Instalar el paquete sass.
  • 2️⃣ Alternativamente, el paquete sass-embeded puede ser mejor para entornos «no-JavaScript».
  • 3️⃣ Reemplaza la extensión de los archivos .css por .scss.
  • 4️⃣ En tus archivos .html, .css o .js, importa el archivo .scss en lugar de .css.

¡Listo! Recuerda que HTML o Javascript no permite ni reconoce la importación de ficheros .scss, sin embargo, si utilizamos vite y tenemos el paquete de Sass instalado, se encargará de hacer la tarea por nosotros.

Así pues, instalamos el paquete de Sass necesario:

$ npm install -D sass

Y ahora nos aseguramos de importar los archivos .scss en nuestros archivos HTML/CSS/JS:

<!-- Si lo queremos importar desde un HTML -->

<head>
  <link rel="stylesheet" href="./styles.scss">
</head>
/* Si lo queremos importar desde un CSS/SCSS */

@import "./styles.scss";
// Si lo queremos importar desde un JS/TS

import "./styles.scss";

Características de Sass

Una de las ventajas de Sass es que simplemente cambiando la extensión de .css a .scss ya estará funcionando. Esto ocurre porque Sass es compatible con CSS, y simplemente añade mejoras que poco a poco y de forma progresiva puedes ir añadiendo para adaptar tu código.

CaracterísticaDescripciónDisponible en CSS
VariablesPosibilidad de guardar valores en variables reutilizables.CSS Custom Properties
Nesting CSSPosibilidad de anidar estilos dentro de otros.CSS Nesting
Módulos (@use)Crear pequeños ficheros reutilizables. Reemplazo de partials.🟧 @import (pero hace peticiones extra)
MixinsBloques de código CSS reutilizables.❌ Propuesta: Mixins
FuncionesBloques de código CSS que devuelven un valor.❌ Propuesta: Funciones
BuclesPosibilidad de repetir bloques de código e iterar.❌ Sólo bucles simples con contadores
CondicionalesPosibilidad de realizar condiciones.❌ Propuesta: if / ✅ @supports / @media
Ajustes sass:colorManipulación de colores para crear variaciones.Función color-mix()
Cálculos matemáticosPosibilidad de realizar operaciones y cálculos.Función calc() y otros

Como puedes ver, muchas de las características principales de Sass se han ido implementando en CSS nativo y mejorando con funcionalidades adicionales. Sin embargo, Sass aún tiene casos de uso donde es interesante, sobre todo cuando necesitamos preprocesar el código y realizar cambios en el CSS que tenemos escrito.

Módulos Sass

Un buen ejemplo de ello es la regla @use. Con ella, se puede importar un archivo CSS externo y que forme parte del archivo CSS final. De esta forma, podemos dividir el código en múltiples partes para que sea mucho más sencillo para nosotros trabajar con CSS.

Observa el siguiente archivo index.scss que contiene varias reglas @use para importar pequeños ficheros .scss con el contenido de secciones específicas de nuestro sitio:

@use "./fonts.scss";
@use "./header.scss";
@use "./main.scss";
@use "./footer.scss";

La herramienta Sass leerá cada archivo por separado y construirá un archivo .css final con el contenido de cada uno de esos ficheros .scss. Al final, el navegador leerá un único archivo index.css con todo el contenido (una descarga).

Esto, con CSS nativo es muy complicado de hacer. Aunque utilicemos la regla @import, la diferencia es que el navegador no une ese código CSS en un sólo archivo final como hace con Sass, sino que realiza las peticiones de las múltiples partes desde el navegador en cada petición:

@import "./fonts.css";
@import "./header.css";
@import "./main.css";
@import "./footer.css";

En este caso, el navegador realizaría 4 descargar de ficheros .css individuales, procesándolo uno detrás del otro. Esto, en algunos casos, podría ofrecer una desventaja desde el punto de vista del performance.

Mixins

Los mixins permiten crear pequeñas agrupaciones de código CSS que podemos reutilizar en nuestros proyectos. Por ejemplo, observa el siguiente fragmento de código donde creamos un mixin rounded-box para establecer un estilo generalizado para nuestros elementos:

@mixin rounded-box($radius: 50px) {
  border-radius: $radius;
  border: 2px solid black;
  padding: 1rem 2rem;
  margin: 1rem;
}

.container {
  @include rounded-box(25px);   // border-radius: 25px;
}

.element {
  @include rounded-box;         // border-radius: 50px;
}

En el día a día se ha terminado por adoptar composición por medio de las clases de utilidad, más conocido hoy en día gracias a Tailwind CSS.

Funciones

Por otro lado, observa como se realizan funciones en Sass. En este caso hemos creado una función que se encarga de generar los estilos de los botones, recorriendo un array y añadiendo un color más oscuro si es necesario:

  • 1️⃣ Creamos la función usando la regla @function / @return.
  • 2️⃣ Definimos una variable $colors con un array de colores.
  • 3️⃣ Con @each recorremos el array de colores.
  • 4️⃣ Generamos una clase .button-red, .button-blue, etc...
  • 5️⃣ Con @if / @else podemos realizar condiciones.
@function darken-color($color, $percentage) {
  @return darken($color, $percentage);
}

$colors: red, blue, green, orange;

@each $color in $colors {
  .button-#{$color} {
    background-color: $color;
    border: 0;
    padding: 0.5rem 1rem;

    @if $color == red {
      color: white;
    } @else {
      color: black;
    }

    box-shadow: 0px 4px 6px darken-color($color, 10%);
  }
}
<button class="button-red">It's me, Manz!</button>
<button class="button-blue">It's me, Manz!</button>
<button class="button-green">It's me, Manz!</button>
<button class="button-orange">It's me, Manz!</button>

Como puedes ver, Sass puede llegar a ser muy útil si actualmente requieres utilizar módulos Sass, funciones, bucles, condicionales y/o mixins en CSS. En caso contrario, quizás lo aconsejable sería utilizar CSS nativo para ello. Por otro lado, si lo que necesitas es un Sass pero más potente y personalizable, echa un vistazo a PostCSS.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev