Si ya has creado sitios web, pro­ba­ble­me­n­te estés fa­mi­lia­ri­za­do con CSS y puede que incluso hayas echado de menos algunas ca­ra­c­te­rí­s­ti­cas. Como diseñar sitios web con CSS puede llegar a ser laborioso, muchos de­sa­rro­lla­do­res han empezado a utilizar SASS. Con el pro­me­te­dor nombre de “hojas de estilo si­n­tá­c­ti­ca­me­n­te in­creí­bles” (Sy­n­ta­c­ti­ca­lly Awesome St­y­le­sheets), el acrónimo SASS aglutina a un pre­pro­ce­sa­dor y a un lenguaje de hojas de estilo. 

SASS es un pre­pro­ce­sa­dor porque requiere una co­n­ve­r­sión: antes de que pueda eje­cu­tar­se, el código SASS se ha de compilar en el más conocido CSS. ¿Cómo se lleva a cabo esta co­n­ve­r­sión? Sigue a co­n­ti­nua­ción nuestro detallado tutorial de SASS y aprende a diseñar con SASS.

Consejo

Encuentra más in­fo­r­ma­ción sobre SASS en nuestro artículo general.

Re­qui­si­tos para SASS

SASS es mu­l­ti­pla­ta­fo­r­ma y puede usarse, por tanto, tanto en PC Windows como en Mac o Linux. SASS se basa, al menos en la versión original, en Ruby, por lo que es necesario que este lenguaje de pro­gra­ma­ción esté instalado en el sistema. En macOS Ruby debería estar prei­n­s­ta­la­do. Para equipos con sistema Windows puede uti­li­zar­se el in­s­ta­la­dor de Ruby. El paquete de in­s­ta­la­ción contiene el lenguaje, un entorno de de­sa­rro­llo (que no se necesita para SASS) y la do­cu­me­n­ta­ción. La in­s­ta­la­ción no entraña ninguna co­m­ple­ji­dad (ni siquiera para las di­s­tri­bu­cio­nes de Linux).

Consejo

También hay paquetes de in­s­ta­la­ción para otros sistemas. Puedes encontrar una lista completa en la página oficial de Ruby.

El proyecto LibSASS permite utilizar SASS con otros lenguajes de pro­gra­ma­ción: C/C++, Java, Ja­va­S­cri­pt, Node PHP o Python, entre otros, ya están di­s­po­ni­bles. Usando wrappers (una he­rra­mie­n­ta de im­ple­me­n­ta­ción) pueden apro­ve­char­se las ventajas de otros lenguajes de pro­gra­ma­ción. Tanto la bi­blio­te­ca LibSASS como la in­fo­r­ma­ción sobre los wrappers di­s­po­ni­bles puede en­co­n­trar­se en el sitio web oficial de LibSASS del proyecto.

Instalar SASS

Hay varias maneras de integrar a SASS en tu sistema. Hoy ya se han co­n­so­li­da­do varias apli­ca­cio­nes que facilitan el trabajo con el lenguaje de hojas de estilo. Algunas son de pago, pero otras, como Koala o Scout-App, están di­s­po­ni­bles de forma gratuita y con código abierto. En principio, no se necesita ningún programa adicional para poder utilizar SASS en tu sistema, ya que Ruby incluye el gestor de paquetes gem, que permite instalar el lenguaje de hojas de estilo en la terminal. Abre entonces la consola y escribe este comando:

gem install sass

Si recibes un mensaje de error, es posible que no tengas los derechos ne­ce­sa­rios para instalar el software. Esto puede co­rre­gi­r­se con el comando sudo (macOS, Linux) o iniciando la terminal de líneas de comando como ad­mi­ni­s­tra­dor haciendo clic en el botón derecho del ratón (Windows). Para verificar que la in­s­ta­la­ción se ha realizado co­rre­c­ta­me­n­te y que está ac­tua­li­za­da, solicita a SASS la versión instalada con este comando:

sass -v

Pero además de in­s­ta­lar­lo, también debes co­n­fi­gu­rar la co­m­pi­la­ción, porque el código SASS solo funciona en una web si antes se ha co­n­ve­r­ti­do a CSS. Una vez más, hay varias maneras de hacerlo: si has elegido instalar SASS con un programa, también puedes co­m­pi­lar­lo con él. Si trabajas con los Task Runners Grunt o Gulp, ellos se en­ca­r­ga­rán de hacerlo una vez co­n­fi­gu­ra­dos. Hay plugins para la co­m­pi­la­ción incluso para algunos editores de texto. Pero también puede hacerse en la consola de comandos.

Con SASS los usuarios pueden elegir compilar después de cada mo­di­fi­ca­ción en el código fuente o habilitar un modo de mo­ni­to­ri­za­ción. En este último caso, el co­m­pi­la­dor revisa un archivo o una carpeta completa y realiza la co­n­ve­r­sión au­to­má­ti­ca­me­n­te. Para iniciar una mo­ni­to­ri­za­ción, navega hasta la carpeta de tu proyecto web en la terminal de comandos e inicia uno de estos dos comandos:

sass --watch ejemplo.sass:ejemplo.css

Con este código mo­ni­to­rea­rás el archivo ejemplo.sass y co­m­pi­la­rás el código fuente en el archivo ejemplo.css. Si añades dos su­b­ca­r­pe­tas más a la carpeta de tu proyecto (una para los archivos SASS y otra para los archivos CSS) y los nombras re­s­pe­c­ti­va­me­n­te sass y css, puedes su­pe­r­vi­sar toda la carpeta:

sass --watch sass:css

Tan pronto como hagas un cambio en los archivos SASS y lo guardes, el co­m­pi­la­dor so­bre­s­cri­bi­rá au­to­má­ti­ca­me­n­te los archivos CSS con las versiones más recientes.

En el caso de querer pasar un proyecto escrito en CSS a SASS, también tienes que convertir tu antiguo código CSS. Para ello debes co­n­si­de­rar primero si deseas trabajar en la sintaxis original de SASS o en la nueva variante SCSS (en este tutorial de SASS siempre in­tro­du­ci­re­mos ambas formas). También hay comandos para las co­n­ve­r­sio­nes:

sass-convert ejemplo.css ejemplo.sass
sass-convert ejemplo.css ejemplo.scss

El co­n­ve­r­ti­dor lee el formato a partir de las ex­te­n­sio­nes de archivo. Si lo prefieres, hay páginas, como la del co­n­ve­r­ti­dor CSS 2 SASS/SCSS, que se ocupan de la co­n­ve­r­sión de una forma muy sencilla: in­tro­du­ces el código CSS en el lado izquierdo de la ventana y en el lado derecho obtienes el código fuente co­n­ve­r­ti­do al formato deseado. Este código puede copiarse donde sea menester. Si decides usar SCSS, la co­n­ve­r­sión es opcional: renombra tus archivos -en lugar de .css, escribe .scss. Cualquier código escrito con reglas CSS también funciona con SCSS.

La sintaxis de SASS al detalle

Como ya se ha me­n­cio­na­do, no hay solo una sintaxis en SASS. Hoy hay dos formatos co­n­so­li­da­dos que compiten entre sí. Ori­gi­na­l­me­n­te, SASS se basaba en la sintaxis que hoy se conoce como “indented syntax”, en la que las in­de­n­ta­cio­nes (o sangrías de texto) generan el ani­da­mie­n­to y cada salto de línea finaliza una línea de código. SCSS, en cambio, se orienta más al formato que conocemos por CSS y requiere, por lo tanto, corchetes y puntos y comas. A co­n­ti­nua­ción, nos ade­n­tra­re­mos en las pe­cu­lia­ri­da­des de SASS.

Consejo

Si solo deseas probar el lenguaje de la hoja de estilo, puedes hacerlo en el navegador. Con Sass.js Pla­y­grou­nd o Sa­s­s­Mei­s­ter el código fuente CSS se genera tras in­tro­du­cir el código.

Variables

La mayoría de los de­sa­rro­lla­do­res web aprecian el uso de variables en SASS porque con ellas puede guardarse in­fo­r­ma­ción con un alias y re­uti­li­zar­la más tarde. Su uso es muy popular, por ejemplo, en el contexto de los colores y las es­pe­ci­fi­ca­cio­nes de tamaño. En una variable se puede guardar el valor he­xa­de­ci­mal de un color o ajustar un tamaño fijo uti­li­za­n­do funciones ma­te­má­ti­cas. Las variables se in­tro­du­cen en SASS con el símbolo del dólar ($):

$bg-color: #df0174
$size: 1em

SCSS

$bg-color: #df0174;
$size: 1em;

Estas variables se colocan entonces en los lugares apro­pia­dos del código:

SASS

$bg-color: #df0174
$size: 1em
body
background-color: $bg-color
margin: $size * 2

SCSS

$bg-color: #df0174;
$size: 1em;
body {
background-color: $bg-color;
margin: $size * 2;
}

Al compilar, el co­m­pi­la­dor ajusta la sintaxis a CSS de nuevo y resuelve las variables:

CSS

body {
background-color: #df0174;
margin: 2em;
}
Nota

En la de­no­mi­na­ción de los valores cro­má­ti­cos en la forma de variables se han co­n­so­li­da­do dos pri­n­ci­pios di­fe­re­n­tes. Para algunos de­sa­rro­lla­do­res es más práctico nombrar el color ($pink), mientras que otros prefieren es­pe­ci­fi­car qué propósito debe servir ($bg-color). Con todo, en principio, los nombres de las variables pueden se­le­c­cio­nar­se li­bre­me­n­te.

Para ciertas variables, puede ser útil es­pe­ci­fi­car un valor por defecto. A menos que se defina lo contrario, SASS recurre a esta in­fo­r­ma­ción (si la variable se define de forma diferente, se ignora la in­fo­r­ma­ción pre­de­fi­ni­da). Esto puede ser útil, por ejemplo, si un de­sa­rro­lla­dor presenta un producto inacabado a un cliente que aún desea realizar cambios o cuando un diseñador web utiliza su propia plantilla. Este valor pre­de­te­r­mi­na­do se puede lograr colocando una etiqueta !default. Se pueden in­tro­du­cir tanto valores normales como variables ya definidas:

SASS

$text-color: #000000 !default
$background-color: $bg-color !default

SCSS

$text-color: #000000 !default;
$background-color: $bg-color !default;

Importar

SASS tiene una directiva muy útil que permite in­co­r­po­rar otros archivos en la hoja de estilos, como podría hacerse creando e im­po­r­ta­n­do un archivo en el que se definan todas las variables (por ejemplo, todos los valores de color que se necesitan). La in­fo­r­ma­ción del archivo importado se utiliza como si formara parte del código fuente. Esto mantiene la claridad en las hojas de estilo. Con @import puede im­po­r­tar­se cualquier número de archivos, incluso desde su­b­di­re­c­to­rios. La función también puede importar varios archivos en un solo paso:

SASS

@import "variables"
@import "partials/styles"
@import "partials/test-a", "partials/test-b"

SCSS

@import "variables";
@import "partials/styles";
@import "partials/test-a", "partials/test-b";

Si deseas incluir ficheros .sass o .scss, no necesitas es­pe­ci­fi­car la extensión de fichero, porque el sistema asume au­to­má­ti­ca­me­n­te que se trata de estos tipos de fichero. Sin embargo, también es posible integrar archivos CSS y, para que el ordenador sepa exac­ta­me­n­te lo que significa, en este caso sí hay que es­pe­ci­fi­car la te­r­mi­na­ción. Al compilar, se invierte esta si­m­pli­fi­ca­ción y el código CSS final ya no contiene la directiva, sino solo la in­fo­r­ma­ción de los archivos.

Partials (parciales)

En el trabajo con SASS, lo que se importa más a menudo son los llamados partials. Se trata de fra­g­me­n­tos de código con los que se crean módulos que se pueden instalar fá­ci­l­me­n­te una y otra vez. Al nombrar el archivo, es im­po­r­ta­n­te preceder el nombre real con un guion bajo, el cual informa al co­m­pi­la­dor de que este archivo no necesita una co­n­tra­pa­r­ti­da en CSS. De lo contrario, el sistema co­n­ve­r­ti­ría todos los archivos SASS a CSS.

Al importar los parciales el guion bajo se omite. SASS también in­te­r­pre­ta a qué archivo se refiere. Por lo tanto, es co­n­ve­nie­n­te no crear archivos con el mismo nombre (con y sin guión): dos archivos llamados ejemplo.sass y _ejemplo.sass re­s­pe­c­ti­va­me­n­te llevarán a error. Esto también se aplica a las ex­te­n­sio­nes de archivo: ejemplo.sass y ejemplo.scss no deberían estar en el mismo di­re­c­to­rio.

Mixins (mezclas)

Otra directiva im­po­r­ta­n­te la co­n­s­ti­tu­yen las llamadas mixins, reglas fijas que pueden invocarse en la hoja de estilo cuando sea necesario sin tener que volver a insertar el código completo. Esto ayuda a trabajar más rápido y a mantener el código más ligero. Una mixin puede contener todo lo que está permitido en SASS: reglas, pa­rá­me­tros o funciones, pero, incluso aunque tiene un espacio ilimitado, no conviene alojar en ella más de veinte líneas. Después de todo, el objetivo es in­cre­me­n­tar la si­m­pli­ci­dad, no co­m­pli­car­lo todo más.

Para trabajar efi­ca­z­me­n­te con mixins, solo se necesitan dos di­re­c­ti­vas: @mixin e @include: con la primera se crea el modelo, con la segunda se inserta el bloque de código:

SASS

@mixin big-blue-text
font-family: Arial
font-size: 25px
font-weight: bold
color:#0000ff

SCSS

@mixin big-blue-text {
font-family: Arial;
font-size: 25px;
font-weight: bold;
color:#0000ff;
} 
}

Al crear la mezcla, se da un nombre a la plantilla (por ejemplo, hidden) que permite volver a integrar el bloque de código en la posición co­rre­s­po­n­die­n­te.

SASS

@include big-blue-text

SCSS

@include big-blue-text;

En el código CSS final aparece el bloque completo de código fuente en lugar del mixin. Aquí, la de­fi­ni­ción de la mezcla en sí (@mixin) ya no aparece.

Extend

La regla extender permite ahorrar mucho trabajo. La directiva garantiza que todas las pro­pie­da­des de una clase se tra­n­s­fie­ran a las de otra. Usando @extend se evita tener que re­de­fi­ni­r­lo todo. La directiva también funciona como una cadena. Una clase definida por @extend puede a su vez formar parte de una tercera clase:

SASS

.button-scope
    margin: 5px
    border-radius: 2px
.home-button
    @extend .button-scope
    background-color: $black
.back-button
    @extend .home-button

SCSS

.button-scope {
    margin: 5px;
    border-radius: 2px;
}
.home-button {
    @extend .button-scope;
    background-color: $black;
}
.back-button {
    @extend .home-button;
}

El co­m­pi­la­dor resuelve el código de la siguiente manera:

CSS

.button-scope, .home-button, .back-button {
margin: 5px;
border-radius: 2px;
}
.home-button, .back-button {
background-color: #000000;
}

En algunas si­tua­cio­nes puede ser necesario es­pe­ci­fi­car la apa­rie­n­cia de una clase que no se quiere aplicar en una página web, pero sí utilizar en forma de @extend. Esto ocurre sobre todo cuando se crea una bi­blio­te­ca. SASS ofrece se­le­c­to­res de ma­r­ca­do­res de posición (pla­ceho­l­der selectors) para tales si­tua­cio­nes. Se utiliza un signo de po­r­ce­n­ta­je (%) para ide­n­ti­fi­car a una clase que se crea úni­ca­me­n­te con el fin de uti­li­zar­la en otras clases. Si al diseñar el sitio web no se importa un selector de este tipo, SASS tampoco lo compilará en CSS:

SASS

%module
    margin: 20px
    padding: 10px
    color: $bg-color
.post
    @extend %module
    color: $grey

SCSS

%module {
    margin: 20px;
    padding: 10px;
    color: $bg-color;
}
.post {
    @extend %module;
    color: $grey;
}

En el código CSS final, la clase module ya no aparece. Sus pro­pie­da­des se tra­n­s­fie­ren di­re­c­ta­me­n­te a la clase post.

CSS

.post {
margin: 20px;
padding: 10px;
color: …;
}
.post {
color: #D3D3D3;
}

La etiqueta !optional también puede ser muy útil en @extend: si escribes una extensión de una clase que no existe, SASS generará un error durante la co­m­pi­la­ción. Con !optional se evita, porque SASS ignorará entonces el comando si no encuentra una clase adecuada.

Consejo

El modus operandi de los mixins y de @extend se asemeja mucho y, en la mayoría de los casos, es mejor usar los primeros. Puedes encontrar un exhau­s­ti­vo análisis de las di­fe­re­n­cias entre ambos en cs­s­wi­za­r­dry.com.

Nesting (anidación)

En HTML se asume que el código se anida en una es­tru­c­tu­ra je­rá­r­qui­ca. CSS, en cambio, ignora esta función y obliga al usuario a declarar las pro­pie­da­des una y otra vez. SASS devuelve la anidación a las hojas de estilo al permitir que las su­b­ca­te­go­rías hereden las pro­pie­da­des de la categoría superior. Esto también garantiza la ligereza del código y la reducción de la carga de trabajo para escribir y esperar. Por ejemplo, es posible definir la apa­rie­n­cia de los enlaces y es­pe­ci­fi­car en una anidación cómo cambian de color cuando se pasa con el ratón por encima (hover) o cuando ya se han visitado.

Si se emplea el nesting en el código, se usa el símbolo & para re­em­pla­zar a una parte del selector por el superior.

SASS

a
    color: $blue
    &:visited
        color: $red
    &:hover
        color: $purple

SCSS

a {
    color: $blue;
    &:visited {
        color: $red;
    }
    &:hover {
        color: $purple;
    }
}

En la co­m­pi­la­ción, el ani­da­mie­n­to debe di­so­l­ve­r­se de nuevo. En CSS cada estado aparece definido por separado.

CSS

a {
color: #0000FF;
}
a:visited {
color: #FF0000;
}
a:hover {
color: #551A8B;
}

Además de la re­so­lu­ción del ani­da­mie­n­to, la co­m­pi­la­ción también asegura que las variables (cuya de­fi­ni­ción omitimos en el ejemplo) se co­n­vie­r­tan de nuevo en valores he­xa­de­ci­ma­les.

Nota

La anidación es una he­rra­mie­n­ta muy útil para mantener el código fuente de la hoja de estilo ligero y eficiente. Con todo, la tentación de hacer un uso excesivo de ella es muy fuerte, llevando así a invertir su efecto y crear es­tru­c­tu­ras muy complejas que pueden acarrear problemas a la hora de realizar cambios o labores de ma­n­te­ni­mie­n­to. Así, conviene no pasar de un tercer nivel.

El nesting también permite tra­n­s­fe­rir las “pro­pie­da­des”. CSS conoce algunas pro­pie­da­des que pe­r­te­ne­cen a la misma familia. Por ejemplo, toda la in­fo­r­ma­ción de formato de fuente pertenece a la misma familia (font), pero en CSS debe definirse como puntos in­di­vi­dua­les con sus nombres de propiedad completos. SASS permite anidar las pro­pie­da­des bajo los nombres de las familias.

SASS

.example
font:
    family: serif
    style: normal
    size: medium

SCSS

.example {
font: {
        family: serif;
        style: normal;
        size: medium;
    }
}

Funciones

SASS conoce numerosas funciones que facilitan el trabajo en la hoja de estilo. Se trata de workflows pre­de­fi­ni­dos que evitan tener que eje­cu­tar­los ma­nua­l­me­n­te. Las funciones pueden asignarse a di­fe­re­n­tes ca­te­go­rías:

  • Colores: con estas funciones pueden ajustarse los valores de color, la sa­tu­ra­ción, la tra­n­s­pa­re­n­cia y muchas otras pro­pie­da­des. Con mix(), p.ej., pueden mezclarse dos colores y crear uno nuevo.
  • Listas: en las listas (series de valores de propiedad CSS) las funciones sirven para leer el número de entradas o fusionar varias listas en una sola.
  • Cadenas: las strings son cadenas fijas de ca­ra­c­te­res, como las que se utilizan en los textos. Las funciones de esta categoría pueden colocar una cadena de ca­ra­c­te­res entre comillas o convertir un texto completo a ma­yú­s­cu­las.
  • Se­le­c­to­res: con las funciones de esta categoría se manipulan se­le­c­to­res completos. Con selector -unify() puedes fusionar dos se­le­c­to­res en uno solo (ahorrando mucha escritura).
  • Números: dentro del tema de los números, valores o unidades, en­co­n­tra­rás funciones que pueden, entre otras cosas, redondear hacia arriba y hacia abajo, buscar el número más grande de un conjunto o entregar un número aleatorio.
  • Mapas: los mapas en SASS son es­tru­c­tu­ras de datos co­m­pue­s­tas de claves y pro­pie­da­des. Con las funciones adecuadas, estos conjuntos de datos pueden ma­ni­pu­lar­se fu­sio­na­n­do dos mapas o borrando una clave de un mapa.
  • In­tro­s­pe­c­ción: estas funciones permiten revisar el contenido de la hoja de estilo completa para comprobar, entre otras cosas, si en el código se encuentra una ca­ra­c­te­rí­s­ti­ca de­te­r­mi­na­da, un mixin o una función en concreto.
  • Mi­s­ce­lla­neous: en el punto mi­s­ce­lá­nea SASS también incluye la útil función if() –que no debe co­n­fu­n­di­r­se con la directiva del mismo nombre. La di­fe­re­n­cia se explica más abajo en el punto “Ra­mi­fi­ca­ción”.
Consejo

Una lista completa de las funciones SASS ya incluidas en el paquete de in­s­ta­la­ción se puede encontrar en la do­cu­me­n­ta­ción oficial del lenguaje de la hoja de estilos. Allí también en­co­n­tra­rás una breve ex­pli­ca­ción de cada función.

Las funciones se insertan en el código siguiendo siempre el mismo patrón: cada función posee un nombre propio y ciertos pa­rá­me­tros que se encierran entre pa­ré­n­te­sis separados por comas. Como resultado, la función entrega un valor in­di­vi­dual. Ex­pli­ca­re­mos esta sintaxis de SASS usando el ejemplo de la simple pero útil función mix():

SASS

$color-1: #ffff00
$color-2: #0000ff
body
background-color: mix($color-1, $color-2, 30%)

SCSS

***CODE***
$color-1: #ffff00;
$color-2: #0000ff;
body {
background-color: mix($color-1, $color-2, 30%);
}

En esta función se mezclan los dos valores de color que se han definido pre­via­me­n­te en las variables $color-1 y $color-2 (no es necesario guardar antes los valores de color en las variables; si se prefiere, los valores he­xa­de­ci­ma­les pueden incluirse di­re­c­ta­me­n­te en la función). Como tercer parámetro, se es­pe­ci­fi­ca la pro­po­r­ción de la mezcla: en nuestro ejemplo, el resultado final contendrá un 30 por ciento de $color-1. Si dejas este último parámetro vacío, SASS in­te­r­pre­ta que la mezcla ha de resultar 50/50. En el código CSS aparecerá un valor único (el valor he­xa­de­ci­mal del color re­su­l­ta­n­te):

CSS

body {
    background-color: #4d4db3;
}

Las funciones ex­pli­ca­das hasta ahora están incluidas por defecto en SASS, pero el lenguaje de hojas de estilo también permite definir funciones es­pe­cí­fi­cas para un proyecto, lo que agiliza las fases del trabajo que más se repiten. Con ello se asemejan a las mixins, con la di­fe­re­n­cia de que, mientras estas entregan líneas de código como output, las funciones solo entregan un valor. Las funciones se crean con la directiva @function, aunque en realidad necesitan siempre dos di­re­c­ti­vas: además de la inicial @function, se necesita un @return anidado con el cual se define el valor de salida:

SASS

$column-count: 12
@function column-width($num)
@return $num * 100% / $column-count
.three-columns 
width: column-width(3)

SCSS

$column-count: 12;
@function column-width($num) {
@return $num * 100% / $column-count;
}
.three-columns {
width: column-width(3);

En este ejemplo de arriba hemos calculado el ancho de columna para una cua­drí­cu­la de diseño. Primero definimos 12 columnas. En el siguiente paso, se da nombre a la función y se define cuántos pa­rá­me­tros contiene (en nuestro ejemplo, un número). Además, de­te­r­mi­na­mos qué debe hacer la función y, por lo tanto, qué valor entrega. En este caso, column-width mu­l­ti­pli­ca el número que se introduce como parámetro por 100 % y divide el resultado por el número de columnas. Una vez definida la función, se puede utilizar una y otra vez con pa­rá­me­tros distintos. En el código final solo aparece el valor re­su­l­ta­n­te:

CSS

.three-columns {
    width: 25%;
}
Consejo

En la creación de funciones pueden uti­li­zar­se guiones o guiones bajos en los nombres. Cuando se llama a la función más tarde, esta di­s­ti­n­ción es irre­le­va­n­te. Tanto function-name como function_name llaman a la misma función.

Bucles (loops)

Los bucles pro­po­r­cio­nan al lenguaje de hojas de estilo el atractivo de un lenguaje de pro­gra­ma­ción real. En SASS se utilizan para crear bloques de in­s­tru­c­cio­nes que se repiten hasta que tiene lugar una condición de­te­r­mi­na­da. Existen tres di­re­c­ti­vas di­fe­re­n­tes para crear bucles:

  • @for
  • @while
  • @each

@for es el loop estándar en pro­gra­ma­ción: comienza al inicio y repite la orden hasta que se alcanza un estado de salida y con ello el final. En SASS, esta directiva se presenta en dos variantes di­fe­re­n­tes: o bien el último ciclo se ejecuta una vez más cuando se alcanza el objetivo o se abandona el bucle antes.

SASS

@for $i from 1 through 4
	.width-#{$i}
width: 10em + $i
@for $i from 1 to 4
	.height-#{$i}
height: 25em * $i

SCSS

@for $i from 1 through 4 {
	.width-#{$i} { width: 10em + $i; }
}
@for $i from 1 to 4 {
	.height-#{$i} { height: 25em * $i; }
}

Tras la directiva primero se es­pe­ci­fi­ca una variable cua­l­quie­ra ($i) y luego se define el punto de inicio (1) y el de destino (4). Con through se indica que la cuarta re­pe­ti­ción también debe rea­li­zar­se, mientras que con to el bucle se detiene después de la tercera vuelta. Si para el inicio se define un valor superior al elegido para el final, SASS cuenta hacia atrás. Hay dos elementos in­te­gra­dos en el bucle: primero se elige la notación de CSS que obtendrá una cifra superior con #{$i}: la variable –y, por lo tanto, también la notación– se in­cre­me­n­ta­rá en 1 con cada vuelta.

Hecho

En SASS #{} es una in­te­r­po­la­ción. Con ella se puede combinar a una variable con un ide­n­ti­fi­ca­dor que se ha asignado a sí mismo.

Se­gui­da­me­n­te se escribe, bien entre corchetes o con sangría, lo que debe suceder. En nuestro ejemplo, cada vuelta hace aumentar la in­fo­r­ma­ción de tamaño. En CSS aparecerá un valor para cada pasada:

CSS

.width-1 {
width: 11em;
}
.width-2 {
width: 12em;
}
.width-3 {
width: 13em;
}
.width-4 {
width: 14em;
}
.height-1 {
height: 25em;
}
.height-2 {
height: 50em;
}
.height-3 {
height: 75em;
}

La directiva @while tiene una mecánica muy similar a la de @for pero, mientras que este último tiene puntos fijos de inicio y final, un bucle @while contiene una consulta de tipo lógico: mientras un estado siga siendo verdadero, las órdenes deberán repetirse. Como se verá a co­n­ti­nua­ción, con la función @while podemos lograr exac­ta­me­n­te el mismo resultado:

SASS

$i: 1
@while $i < 5
	.width-#{$i}
width: 10em + $i
	$i: $i + 1

SCSS

$i: 1;
@while $i < 5 {
	.width-#{$i} { width: 10em + $i; }
	$i: $i + 1;
}

Con este tipo de bucle, primero se debe asignar un valor a las variables, ya que la directiva en sí no necesita un valor de inicio. En el ciclo se ha de es­pe­ci­fi­car el estado hasta el que se realizan las re­pe­ti­cio­nes. En nuestro ejemplo, el bucle se ejecuta siempre que la variable sea inferior a 5. La in­s­tru­c­ción dentro del bucle es ini­cia­l­me­n­te la misma que en el ejemplo de @for. De nuevo, haremos que se ajuste la de­sig­na­ción del elemento de las variables y aumente el tamaño. También se ha de integrar un comando en el bucle que haga que $i aumente con cada vuelta, porque, de lo contrario, el bucle se eje­cu­ta­ría hasta que el co­m­pi­la­dor SASS se detuviera. Al final se obtiene el mismo código CSS que en @for.

La directiva @each funciona de manera diferente. Este bucle se basa en una lista de datos es­pe­ci­fi­ca­da por el usuario que el bucle recorrerá en cada vuelta. Para cada entrada, @each hace una re­pe­ti­ción diferente. De este modo, indicando una lista con los valores 1, 2, 3 y 4 sería posible generar el mismo resultado que con los otros bucles. La verdadera ventaja de este bucle, sin embargo, es que también puede in­tro­du­ci­r­se otra in­fo­r­ma­ción en la lista ex­ce­p­tua­n­do valores numéricos (con @each, por ejemplo, se insertan varias imágenes di­fe­re­n­tes en el diseño). Puedes in­tro­du­cir los datos di­re­c­ta­me­n­te en la directiva o in­tro­du­cir la lista en una variable y luego llamarla.

SASS

$list: dog cat bird dolphin
@each $i in $list
	.image-#{$i}
		background-image: url('/images/#{$i}.png')

SCSS

$list: dog cat bird dolphin;
@each $i in $list {
	.image-#{$i} { background-image: url('/images/#{$i}.png'); }
}

Aquí, de nuevo, necesitas una variable. Esta asume el nombre de una de las entradas de la lista en cada vuelta. El nombre está integrado tanto en la de­no­mi­na­ción del bloque de código como en el nombre de archivo de la imagen. Para que el diseño funcione bien, las imágenes deben haber sido guardadas en la ruta es­pe­ci­fi­ca­da. El bucle se asegura de que la variable se haga cargo de la siguiente entrada.

CSS

.image-dog {
background-image: url("/images/dog.png");
}
.image-cat {
background-image: url("/images/cat.png");
}
.image-bird {
background-image: url("/images/bird.png");
}
.image-dolphin {
background-image: url("/images/dolphin.png");
}

Ra­mi­fi­ca­ción

Además de los bucles, SASS ofrece aún otra he­rra­mie­n­ta más conocida en el entorno de la pro­gra­ma­ción: las ra­mi­fi­ca­cio­nes según el principio “si-entonces-si no”. Con la directiva @if una orden solo se ejecuta si tiene lugar un cierto evento; en caso contrario, se ejecuta otro comando. Además de esta directiva, también hay una función if(). No guardan relación, pero pueden aparecer juntas. La función es fácil de explicar. Contiene tres pa­rá­me­tros: la condición y dos salidas di­fe­re­n­tes. La primera salida se emite si el primer parámetro es verdadero, de lo contrario la función reproduce el tercer parámetro.

SASS

$black: #000000
$white: #ffffff
$text-color: $black
body
	background-color: if($text-color == $black, $white, $black)

SCSS

$black: #000000;
$white: #ffffff;
$text-color: $black;
body {
	background-color: if($text-color == $black, $white, $black);
}

En nuestro ejemplo, la función verifica si la variable $text-color está co­n­fi­gu­ra­da en negro (black). Si este es el caso (como en el ejemplo), el fondo se mostrará blanco. En cualquier otro caso, el CSS mostraría el fondo en negro. Como puede verse en este ejemplo, esta técnica no es quizá la más adecuada para el diseño de un sitio web completo. Tanto la directiva como la función son útiles en primera línea en mixins o partials. Esto permite a la plantilla reac­cio­nar mejor a los valores que aparecen en el diseño final. A la inversa, si ya sabes que el color del texto es negro, no hace falta escribir una ra­mi­fi­ca­ción compleja para que el fondo sea blanco.

Las funciones tienen la pa­r­ti­cu­la­ri­dad de devolver un solo valor. Para re­qui­si­tos más complejos, conviene emplear la directiva @if, que cuenta con la ventaja de poder di­s­ti­n­guir más de dos casos entre sí:

SASS

$black: #000000
$white: #ffffff
$lightgrey: #d3d3d3
$darkgrey: #545454
@mixin text-color($color)
@if ($color == $black)
background-color: $white
@else if ($color == $white)
background-color: $black
@else if ($color == $lightgrey)
background-color: $black
@else
background-color: $white
p
	@include text-color($lightgrey)

SCSS

$black: #000000;
$white: #ffffff;
$lightgrey: #d3d3d3;
$darkgrey: #545454;
@mixin text-color($color) {
@if ($color == $black) {
background-color: $white;
	}
@else if ($color == $white) {
background-color: $black;
	}
@else if ($color == $lightgrey) {
background-color: $black;
	}
@else {
background-color: $white;
	}
}
p {
	@include text-color($lightgrey);
}

La sintaxis de la directiva permite teó­ri­ca­me­n­te crear un caso para cada valor previsto, aunque es necesario colocar la directiva @else (que, en co­m­bi­na­ción con if puede invocarse tantas veces como se desee) detrás de la @if inicial. Solo el último @else permanece libre, cubriendo así a todos los demás casos.

Co­me­n­ta­rios

Con SASS también es útil añadir co­me­n­ta­rios al código fuente. Los co­me­n­ta­rios co­n­tri­bu­yen a que el código sea co­m­pre­n­si­ble para cua­l­quie­ra que lo lea en otro momento. Esto ocurre así es­pe­cia­l­me­n­te cuando se crean pla­n­ti­llas para otros usuarios, porque los co­me­n­ta­rios pueden serles útiles en la edición. Muchos di­se­ña­do­res web también usan co­me­n­ta­rios para es­tru­c­tu­rar el código con más claridad. La mayoría de los lenguajes de pro­gra­ma­ción y marcado tienen la capacidad de insertar en el código texto que en la co­m­pi­la­ción o el análisis se ignora. Este texto está dirigido a las personas y no a las máquinas.

Los pro­gra­ma­do­res y di­se­ña­do­res web también usan esta función para “comentar” el código correcto, lo que se hace colocando un bloque de código, que no se necesita, pero que no se desea eliminar del código fuente, entre las etiquetas de co­me­n­ta­rios.

Cada lenguaje tiene un método es­pe­cí­fi­co para comentar texto. En SASS, esto se hace de dos maneras di­fe­re­n­tes. Por un lado, como en CSS, en SASS puedes utilizar /* */. Con este método puedes comentar varias filas al mismo tiempo. A menudo se en­cue­n­tran co­me­n­ta­rios en CSS o SASS donde cada línea en el bloque de co­me­n­ta­rios comienza con un asterisco. Sin embargo, esto es solo una co­n­ve­n­ción y no una necesidad.

/* Esto es un comentario.
Todo lo escrito entre estas marcas
no se tendrá en cuenta. */
Hecho

Cuando se comenta, no importa si se escribe el código en SCSS o en sintaxis sangrada. Los co­me­n­ta­rios funcionan igual en ambas sintaxis.

Además de este conocido método de CSS, con // también puedes comentar líneas aisladas:

// Esta línea es un comentario.
// Y esta línea también.

La di­fe­re­n­cia entre los dos métodos también radica en que, si con la co­n­fi­gu­ra­ción por defecto la primera variante se copia en el CSS compilado, la segunda se pierde. De una forma u otra, un documento CSS con co­me­n­ta­rios no puede lanzarse online como una versión pro­du­c­ti­va. Para ello se utiliza una versión mi­ni­mi­za­da que los na­ve­ga­do­res pueden cargar más rápido.

Ir al menú principal