Entendiendo el alcance variable en Sass

En este artículo, vamos a echar un vistazo más profundo a las variables y variables alcance en sass. El alcance de una variable describe el contexto dentro del cual se define y, por lo tanto, dónde está disponible para usar.

Para empezar, cubriré los alcances que soporta Sass. Luego, explicaré dos indicadores útiles que podemos usar para personalizar el valor de una variable. Finalmente, presentaré brevemente las funciones disponibles para verificar si existe una variable o no.

Sass Variable Scope

Sass soporta dos tipos de variables: local variables y global variables.

Por defecto, todas las variables definidas fuera de cualquier selector se consideran variables globales. Eso significa que se puede acceder a ellos desde cualquier lugar en nuestras hojas de estilo. Por ejemplo, aquí hay una variable global:

$ bg-color: verde;

Por otro lado, las variables locales son aquellas que se declaran dentro de un selector. Más adelante, examinaremos cómo podemos personalizar ese comportamiento. Pero por ahora, veamos nuestro primer ejemplo..

Aquí definimos una mezcla y luego la btn-bg-color variable dentro de ella. Esta es una variable local, y por lo tanto es visible solo para el código dentro de esa mezcla:

@mixin button-style $ btn-bg-color: lightblue; color: $ btn-bg-color; 

A continuación, podemos llamar al mixin de la siguiente manera:

botón @include button-style; 

El CSS resultante:

botón color: azul claro; 

Sin embargo, imagine que también queremos usar esta variable (no la mezcla) en otro selector:

.envolver fondo: $ btn-bg-color; 

Esto nos daría el siguiente error:

Variable no definida: "$ btn-bg-color".

Eso era de esperarse, ¿verdad? Intentamos acceder a una variable mixin, que está localizada en el ámbito. Sin embargo, no se preocupe, como se mencionó anteriormente, solucionaremos este problema en una próxima sección.

Selectores anidados

También vale la pena mencionar que si declaramos una variable dentro de un selector, cualquier otro selector anidado puede acceder a ella. Aquí hay un ejemplo:

.envoltura $ bg-color: rojo; &: después de fondo: aclarar ($ bg-color, 10%);  

Esto compila a:

.ajuste: después de background: # ff3333; 

Sin embargo, mire el ejemplo a continuación donde definimos una función, luego use esa función junto con un selector anidado:

@function my-function () $ text-color: black; @return $ text-color;  .wrap color: my-function (); &: después de background: $ text-color; 

Si intentamos compilar esto, obtendremos el mismo error discutido antes. De nuevo, eso sucede porque no podemos acceder a la color de texto variable. No es directamente definido dentro del selector principal, pero dentro de la función que nuestro selector llama. 

Nombres de variables

Las variables globales y locales pueden tener los mismos nombres. Para demostrar ese comportamiento, trabajaremos en un cuarto ejemplo:

$ texto-color: tomate; @mixin button-style $ text-color: lime; color: $ texto-color;  @mixin link-style $ text-color: black; color: $ texto-color; 

Aquí hemos definido tres variables diferentes (color de texto) con el mismo nombre. La primera es una variable global, mientras que las otras dos son locales..

Aquí hay algunos estilos haciendo uso de ellos:

botón @include button-style;  a @include link-style;  .wrap background: $ text-color; 

Y el CSS generado:

botón color: lima;  a color: negro;  .wrap fondo: tomate; 

Es eso lo que estabas esperando?

Tenga en cuenta que no veremos estos estilos a menos que compilemos con la versión actual de Sass (3.4). Por ejemplo, suponiendo que usemos Sass 3.3, nuestra salida de CSS se vería así:

botón color: lima;  a color: negro;  .wrap fondo: negro; 

Observe la diferencia en el color de fondo de la .envolver selector. Esto sucede porque de acuerdo con las versiones anteriores de Sass (igual para LibSass), si redefinimos localmente el valor de una variable global (por ejemplo,. color de texto), este será el nuevo valor de la variable (global). Entonces, en nuestro ejemplo, los estilos compilados dependen del orden en el que declaramos la variable y los mixins.

los defecto bandera

Este indicador nos permite establecer el valor de una variable en caso de que aún no se haya establecido o su valor actual sea nulo (tratado como no asignado). Para explicar mejor cómo podemos aprovecharla en un escenario real, supongamos que tenemos un proyecto con la siguiente estructura:

Nombre del proyecto / ├──… ├── css / │ └── app.css └── scss / ├── _config.scss ├── _variables.scss ├── _mixins.scss └── app.scss

los app.scss archivo se ve así:

@import "config"; @importar "variables"; @import "mixins"; botón @include button-style;  // más estilos

Veamos los contenidos de los archivos parciales..

En primer lugar, el variables.scss archivo contiene nuestras variables:

$ btn-bg-color: lightblue! predeterminado; $ btn-bg-color-hover: oscurecer ($ btn-bg-color, 5%); // más variables

Observe la defecto bandera asignada a la btn-bg-color variable.

En segundo lugar, el mixins.scss archivo incluye nuestros mixins:

@mixin button-style ($ bg-color: $ btn-bg-color, $ bg-color-hover: $ btn-bg-color-hover) background-color: $ bg-color; // más estilos &: hover background-color: $ bg-color-hover; // más estilos // más mixins

Entonces, la generada app.css El archivo será el siguiente:

botón color: azul claro; botón: desplazarse fondo-color: # 99cfe0; 

Por lo tanto, nuestros botones vienen con estilos predeterminados. Pero supongamos que queremos tener la opción de sobrescribirlos aplicando nuestros valores personalizados. Para hacer esto, podemos reasignar las variables deseadas (predeterminadas) en el config.scss archivo parcial:

$ btn-bg-color: chocolate; // más variables

Ajustando el valor de esta variable a chocolate resultará en ignorar el valor correspondiente (azul claro) que ha recibido el defecto bandera. Por lo tanto, el CSS generado cambia como podemos ver a continuación:

botón color: chocolate; botón: desplazarse fondo-color: # bc5e1b; 

Nota: en caso de que no hayamos agregado el defecto bandera a la btn-bg-color variable, nuestro CSS sería, debido a la naturaleza en cascada de CSS, de la siguiente manera:

botón color: azul claro;  // hover estilos

los global bandera

Esta segunda bandera nos ayuda a cambiar el alcance de una variable local.

¿Recuerdas el error que vimos en nuestro primer ejemplo? Bueno, eso sucedió porque intentamos usar el btn-bg-color variable en el .envolver selector. Modifiquemos nuestro ejemplo para incluir esta nueva bandera. Aquí están los nuevos estilos:

@mixin button-style $ btn-bg-color: lightblue! global; color: $ btn-bg-color;  botón @include button-style;  .wrap fondo: $ btn-bg-color; 

Como puede ver a continuación, gracias a este indicador, el CSS se compila sin ningún error:

botón color: azul claro;  .wrap background: lightblue; 

los global La bandera es útil, pero tenga en cuenta que no siempre es una buena práctica cambiar el alcance de una variable. 

Comprobando si existe una variable

Sass proporciona dos funciones de introspección para probar si existe una variable o no. Podemos usar el variable-existe y / o variable-global-existe funciones para verificar si nuestras variables locales y / o globales existen respectivamente.

Por ejemplo, aquí hay un caso de uso común en el que definimos una variable que contiene la ruta absoluta a una fuente de Google. Luego, elegimos importar esa fuente en nuestras hojas de estilo, pero solo si la variable relevante ha sido instanciada.

$ google-font: "http://fonts.googleapis.com/css?family=Alegreya"; @if (global-variable-existencia (google-font)) @import url ($ google-font); 

El resultado:

@import url ("http://fonts.googleapis.com/css?family=Alegreya");

Conclusión

En este artículo, te presenté el concepto de alcance variable en Sass. Para aclarar las cosas, vimos diferentes ejemplos, así que espero que ahora tenga una buena comprensión de cómo funciona el alcance. Puede encontrar todos los ejemplos de este artículo en esta lista de SassMeister y siéntase libre de hacer cualquier pregunta que pueda tener en los comentarios!