Variabele bereik in Sass begrijpen

In dit artikel gaan we dieper in op variabelen en variabelen strekking in Sass. Het bereik van een variabele beschrijft de context waarin deze is gedefinieerd en dus waar deze beschikbaar is voor gebruik.

Om te beginnen zal ik bespreken welke scopes Sass ondersteunt. Vervolgens zal ik twee nuttige vlaggen uitleggen die we kunnen gebruiken om de waarde van een variabele aan te passen. Ten slotte zal ik kort de beschikbare functies presenteren om te controleren of een variabele bestaat of niet.

Sass variabel bereik

Sass ondersteunt twee soorten variabelen: lokaal variabelen en globaal variabelen.

Standaard worden alle variabelen die buiten een selector zijn gedefinieerd als globale variabelen beschouwd. Dat betekent dat ze overal in onze stylesheets kunnen worden geopend. Hier is bijvoorbeeld een globale variabele:

$ bg-kleur: groen;

Aan de andere kant zijn lokale variabelen die welke in een selector worden gedeclareerd. Later zullen we onderzoeken hoe we dat gedrag kunnen aanpassen. Maar voor nu, laten we ons eerste voorbeeld zien.

Hier definiëren we een mixin en dan de btn-bg-color variabele erin. Dit is een lokale variabele en is daarom alleen zichtbaar voor de code in die mixin:

@mixin-knopstijl $ btn-bg-color: lichtblauw; kleur: $ btn-bg-color; 

Vervolgens kunnen we de mixin als volgt bellen:

knop @include button-style; 

De resulterende CSS:

knop kleur: lichtblauw; 

Stel je echter voor dat we deze variabele (niet de mixin) ook in een andere selector willen gebruiken:

.wrap background: $ btn-bg-color; 

Dit zou ons de volgende foutmelding geven:

Ongedefinieerde variabele: "$ btn-bg-color".

Dat was te verwachten, toch? We hebben geprobeerd toegang te krijgen tot een mixin-variabele, die lokaal wordt gebruikt. U hoeft zich echter geen zorgen te maken, zoals hierboven vermeld, zullen we dit probleem in een volgend gedeelte oplossen.

Geneste keuzemogelijkheden

Het is ook de moeite waard om te vermelden dat als we een variabele binnen een selector declareren, elke andere geneste selector er toegang toe heeft. Hier is een voorbeeld:

.wrap $ bg-color: rood; &: na background: lighten ($ bg-color, 10%);  

Dit compileert naar:

.wrap: after background: # ff3333; 

Bekijk echter het onderstaande voorbeeld waarin we een functie definiëren en gebruik die functie samen met een geneste selector:

@function my-function () $ text-color: black; @return $ text-color;  .wrap color: my-function (); &: na achtergrond: $ tekstkleur; 

Als we dit proberen te compileren, krijgen we dezelfde fout als eerder besproken. Nogmaals, dat gebeurt omdat we geen toegang hebben tot de tekst kleur variabel. Dat is het niet direct gedefinieerd in de bovenliggende selector, maar binnen de functie die onze selector oproept. 

Variabele namen

Globale en lokale variabelen kunnen dezelfde naam hebben. Om dat gedrag te demonstreren, werken we aan een vierde voorbeeld:

$ tekstkleur: tomaat; @mixin-knopstijl $ tekstkleur: limoen; kleur: $ tekstkleur;  @mixin-linkstijl $ tekstkleur: zwart; kleur: $ tekstkleur; 

Hier hebben we drie verschillende variabelen gedefinieerd (tekst kleur) met dezelfde naam. De eerste is een globale variabele, terwijl de andere twee lokaal zijn.

Hier zijn enkele stijlen die er gebruik van maken:

knop @include button-style;  een @inclusief linkstijl;  .wrap background: $ text-color; 

En de gegenereerde CSS:

knop kleur: limoen;  a color: black;  .wrap background: tomaat; 

Is dat wat je verwachtte??

Houd er rekening mee dat we deze stijlen alleen zullen zien als we compileren met de huidige versie van Sass (3.4). Stel dat we Sass 3.3 gebruiken, onze CSS-uitvoer ziet er bijvoorbeeld als volgt uit:

knop kleur: limoen;  a color: black;  .wrap background: black; 

Let op het verschil in de achtergrondkleur van de .wikkelen selector. Dit gebeurt omdat, volgens de eerdere Sass-versies (hetzelfde voor LibSass), als we lokaal de waarde van een globale variabele (bijv.. tekst kleur), dit is de nieuwe (globale) waarde van de variabele. Dus, in ons voorbeeld zijn de gecompileerde stijlen afhankelijk van de volgorde waarin we de variabele en de mixins declareren.

De standaard vlag

Met deze vlag kunnen we de waarde van een variabele instellen voor het geval deze nog niet is ingesteld of de huidige waarde is nul (behandeld als niet-toegewezen). Om beter uit te leggen hoe we er in een echt scenario van kunnen profiteren, laten we veronderstellen dat we een project hebben met de volgende structuur:

Project-Name / ├── ... ├── css / │ └── app.css └── scss / ├── _config.scss ├── _variables.scss ├── _mixins.scss └── app.scss

De app.scss bestand ziet er als volgt uit:

@import "config"; @import "variabelen"; @import "mixins"; knop @include button-style;  // meer stijlen

Laten we de inhoud van de deelbestanden bekijken.

Ten eerste, de variables.scss bestand bevat onze variabelen:

$ btn-bg-color: lightblue! standaard; $ btn-bg-color-hover: donkerder ($ btn-bg-color, 5%); // meer variabelen

Let op de standaard vlag toegewezen aan de btn-bg-color veranderlijk.

Ten tweede, de mixins.scss bestand bevat onze mixins:

@mixin-knopstijl ($ bg-kleur: $ btn-bg-color, $ bg-color-hover: $ btn-bg-color-hover) background-color: $ bg-color; // meer stijlen &: hover background-color: $ bg-color-hover; // meer stijlen // meer mixins

Vervolgens wordt het gegenereerd app.css bestand zal als volgt zijn:

knop kleur: lichtblauw;  knop: hover background-color: # 99cfe0; 

Onze knoppen zijn dus voorzien van standaardstijlen. Maar laten we veronderstellen dat we de optie willen hebben om ze te overschrijven door onze aangepaste waarden toe te passen. Om dit te doen, kunnen we de gewenste (standaard) variabelen opnieuw toewijzen in de config.scss gedeeltelijk bestand:

$ btn-bg-color: chocolade; // meer variabelen

De waarde van deze variabele instellen op chocolade zal resulteren in het negeren van de bijbehorende waarde (lichtblauw) die het standaard vlag. Daarom verandert de gegenereerde CSS zoals we hieronder kunnen zien:

knop kleur: chocolade;  knop: hover background-color: # bc5e1b; 

Notitie: voor het geval we het niet hebben toegevoegd standaard vlag naar de btn-bg-color variabele, zou onze CSS, als gevolg van de cascadering van CSS, als volgt zijn:

knop kleur: lichtblauw;  // zweefstijlen

De globaal vlag

Met deze tweede vlag kunnen we de reikwijdte van een lokale variabele wijzigen.

Herinner je je de fout die we in ons eerste voorbeeld zagen? Welnu, dat gebeurde omdat we probeerden het te gebruiken btn-bg-color variabele in de .wikkelen selector. Laten we ons voorbeeld aanpassen om deze nieuwe vlag op te nemen. Dit zijn de nieuwe stijlen:

@mixin-knopstijl $ btn-bg-color: lightblue! global; kleur: $ btn-bg-color;  knop @include button-style;  .wrap background: $ btn-bg-color; 

Zoals u hieronder kunt zien, compileert de CSS, dankzij deze vlag, zonder fouten:

knop kleur: lichtblauw;  .wrap achtergrond: lichtblauw; 

De globaal vlag is handig, maar houd er rekening mee dat het niet altijd een goede gewoonte is om het bereik van een variabele te wijzigen. 

Controleren of er een variabele bestaat

Sass biedt twee introspectie-functies om te testen of een variabele bestaat of niet. We kunnen de gebruiken variabele bestaat en / of global-variabele bestaat functies om te controleren of onze lokale en / of globale variabelen respectievelijk bestaan.

Dit is bijvoorbeeld een standaardgebruiksgeval waarbij we een variabele definiëren die het absolute pad naar een Google-lettertype bevat. Vervolgens kiezen we ervoor om dat lettertype in onze stylesheets te importeren, maar alleen als de relevante variabele is geïnstantieerd.

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

Het resultaat:

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

Conclusie

In dit artikel heb ik je in Sass laten kennismaken met het concept van variabele reikwijdte. Om de zaken duidelijker te maken, hebben we verschillende voorbeelden bekeken, dus hopelijk heb je nu een goed begrip van hoe de scope werkt. Je kunt alle voorbeelden van dit artikel vinden in deze SassMeister-kern en je kunt gerust vragen stellen in de opmerkingen.!