I den här artikeln tar vi en djupare titt på variabler och variabler omfattning i Sass. Omfattningen av en variabel beskriver det sammanhang inom vilket det definieras och därmed det är tillgängligt för användning.
För att börja, täcker jag vilka omfattningar Sass stöder. Sedan ska jag förklara två användbara flaggor som vi kan använda för att anpassa värdet på en variabel. Slutligen presenterar jag korta tillgängliga funktioner för att kontrollera om en variabel finns eller ej.
Sass stöder två typer av variabler: lokal variabler och global variabler.
Som standard betraktas alla variabler som definieras utanför valfri väljare globala variabler. Det betyder att de kan nås från var som helst i våra stylesheets. Till exempel här är en global variabel:
$ bg-färg: grön;
Å andra sidan är lokala variabler de som deklareras inom en väljare. Senare undersöker vi hur vi kan anpassa det beteendet. Men för nu, låt oss se vårt första exempel.
Här definierar vi en mixin och sedan btn-bg-färg
variabel inom den. Detta är en lokal variabel, och är därför endast synlig för koden i den mixin:
@mixin knappstil $ btn-bg-färg: ljusblå; färg: $ btn-bg-color;
Därefter kan vi ringa mixin enligt följande:
knappen @ include button-style;
Den resulterande CSS:
knapp färg: ljusblå;
Föreställ dig att vi också vill använda denna variabel (inte mixin) i en annan väljare:
.wrap background: $ btn-bg-color;
Detta skulle ge oss följande fel:
Odefinierad variabel: "$ btn-bg-color".
Det var att vänta, eller hur? Vi försökte komma åt en mixin-variabel, som är lokaliserad. Oroa dig inte, men som vi nämnde ovan kommer vi att åtgärda problemet i ett kommande avsnitt.
Det är också värt att nämna att om vi förklarar en variabel i en väljare, kan någon annan nestad väljare komma åt den. Här är ett exempel:
.wrap $ bg-color: red; &: efter bakgrund: ljusare ($ bg-färg, 10%);
Detta sammanställer till:
.wrap: efter background: # ff3333;
Men titta på exemplet nedan där vi definierar en funktion, använd sedan den funktionen tillsammans med en kapslad väljare:
@funktion min funktion () $ text-färg: svart; @return $ text-color; .wrap color: my-function (); &: efter bakgrund: $ text-color;
Om vi försöker kompilera detta får vi samma fel som diskuterats tidigare. Det händer igen eftersom vi inte kan komma åt text färg
variabel. Det är det inte direkt definierad inom moderväljaren, men inuti den funktion som vår väljare ringer.
Globala och lokala variabler kan ha samma namn. För att visa det beteendet arbetar vi med ett fjärde exempel:
$ textfärg: tomat; @mixin knappstil $ text-färg: lime; färg: $ text-color; @mixin länkstil $ text-färg: svart; färg: $ text-color;
Här har vi definierat tre olika variabler (text färg
) med samma namn. Den första är en global variabel, medan de andra två är lokala.
Här är några stilar som använder dem:
knappen @ include button-style; en @include länkstil; .wrap background: $ text-color;
Och den genererade CSS:
knapp färg: lime; en färg: svart; .wrap bakgrund: tomat;
Är det vad du förväntade dig?
Tänk på att vi inte kommer se dessa stilar om vi inte sammanställer med den aktuella versionen av Sass (3.4). Om vi antar att vi använder Sass 3.3, så skulle vår CSS-utgåva se ut så här:
knapp färg: lime; en färg: svart; .wrap background: black;
Notera skillnaden i bakgrundsfärgen på .slå in
väljare. Detta händer därför att enligt de tidigare Sass-versionerna (samma för LibSass), om vi lokalt omdefinierar värdet av en global variabel (t.ex.. text färg
), kommer detta att vara variabelns nya (globala) värde. Så, i vårt exempel beror de sammanställda stilerna på den ordning vi förklarar variabeln och mixins.
standard
flaggaMed denna flagg kan vi ange värdet för en variabel om det inte redan har ställts in eller dess nuvarande värde null
(behandlad som otilldelad). För att bättre förklara hur vi kan utnyttja det i ett verkligt scenario, låt oss anta att vi har ett projekt med följande struktur:
Projekt-Namn / ├── ... ├── css / │ └── app.css └──scss / ├── _config.scss ├── _variables.scss ├── _mixins.scss └── app.scss
De app.scss
filen ser så här ut:
@import "config"; @import "variabler"; @import "mixins"; knappen @ include button-style; // fler stilar
Låt oss se innehållet i delfilerna.
För det första variables.scss
filen innehåller våra variabler:
$ btn-bg-färg: lightblue! default; $ btn-bg-färg-svängare: mörkare ($ btn-bg-färg, 5%); // fler variabler
Lägg märke till standard
flagga tilldelad till btn-bg-färg
variabel.
För det andra mixins.scss
filen innehåller våra mixins:
@mixin-knappstil ($ bg-färg: $ btn-bg-färg, $ bg-färghängare: $ btn-bg-färghängare) bakgrundsfärg: $ bg-färg; // fler stilar &: sväva bakgrundsfärg: $ bg-färg-hover; // fler stilar // fler mixins
Därefter genereras app.css
filen kommer att vara enligt följande:
knapp färg: ljusblå; -knappen: svep bakgrundsfärg: # 99cfe0;
Så, våra knappar kommer med standardstilar. Men låt oss anta att vi vill ha möjlighet att skriva över dem genom att tillämpa våra anpassade värden. För att göra detta kan vi omfördela de önskade (standard) variablerna i config.scss
partiell fil:
$ btn-bg-färg: choklad; // fler variabler
Ställer värdet på denna variabel till choklad
kommer att resultera i att man ignorerar motsvarande värde (ljusblå
) som har mottagit standard
flagga. Därför ändras den genererade CSS som vi kan se nedan:
knapp färg: choklad; -knappen: svep bakgrundsfärg: # bc5e1b;
Notera: om vi inte har lagt till standard
flagga till btn-bg-färg
variabel, skulle vår CSS vara, på grund av CSSs cascading natur, enligt följande:
knapp färg: ljusblå; // svängstilar
global
flaggaDen här andra flaggan hjälper oss att ändra omfattningen av en lokal variabel.
Kommer du ihåg det fel vi såg i vårt första exempel? Jo det hände för att vi försökte använda btn-bg-färg
variabel i .slå in
väljare. Låt oss ändra vårt exempel för att inkludera den här nya flaggan. Här är de nya stilarna:
@mixin knappstil $ btn-bg-color: lightblue! global; färg: $ btn-bg-color; knappen @ include button-style; .wrap background: $ btn-bg-color;
Som du kan se nedan, tack vare denna flagga, sammanställer CSS utan några fel:
knapp färg: ljusblå; .wrap background: lightblue;
De global
flaggan är användbar, men tänk på att det inte alltid är bra att ändra variabelns räckvidd.
Sass har två introspektionsfunktioner för att testa om en variabel finns eller ej. Vi kan använda variabel-exists
och / eller global variabel existerar
Funktioner för att kontrollera om våra lokala och / eller globala variabler existerar.
Det här är till exempel ett vanligt fall där vi definierar en variabel som innehåller den absoluta sökvägen till en Google-teckensnitt. Då väljer vi att importera det tecknet i våra stylesheets, men endast om den relevanta variabeln har blivit instanserad.
$ google-typsnitt: "http://fonts.googleapis.com/css?family=Alegreya"; @if (globalt variabel-existerande (google-typsnitt)) @import url ($ google-typsnitt);
Resultatet:
@import url ("http://fonts.googleapis.com/css?family=Alegreya");
I denna artikel introducerade jag dig till begreppet variabelt räckvidd i Sass. För att göra saker tydligare såg vi på olika exempel, så förhoppningsvis har du nu en bra förståelse för hur omfattningen fungerar. Du hittar alla exemplen på den här artikeln i denna SassMeister och kan du ställa frågor som du kanske har i kommentarerna!