Sass vs. LESS vs Stylus Preprocessor Shootout

Å bruke den sanne kraften til en CSS preprocessor er et eventyr. Det finnes utallige språk, syntakser og funksjoner, alle klare til bruk akkurat nå.

I denne artikkelen vil vi dekke de ulike funksjonene og fordelene ved å bruke tre forskjellige preprosessorer-Sass, LESS og Stylus.


Introduksjon

Preprosessorer produserer CSS som fungerer i alle nettlesere.

CSS3-forprosessorer er språk skrevet med det ene formål å legge til kule, oppfinnsomme funksjoner til CSS uten å bryte nettleserkompatibiliteten. De gjør dette ved å samle koden vi skriver inn i vanlig CSS som kan brukes i hvilken som helst nettleser helt tilbake til steinalderen. Det er tusenvis av funksjoner som preprosessorer bringer til bordet, og i denne artikkelen vil vi dekke noen av de publiserte, og noen av de ikke-så-publiserte. La oss komme i gang.


syntax

Den viktigste delen av skrivingskoden i en CSS preprocessor er å forstå syntaxen. Heldigvis for oss er syntaksen (eller kan være) identisk med vanlig CSS for alle tre preprosessorer.

Sass og mindre

Sass og MINDER bruker begge standard CSS-syntaksen. Dette gjør det svært enkelt å konvertere en eksisterende CSS-fil til enten preprosessor. Sass bruker .SCSS filtype og MINDRE bruker .mindre forlengelse. Den grunnleggende Sass eller MINDRE filen kan settes opp som nedenfor:

/ * style.scss eller style.less * / h1 color: # 0982C1; 

Som du kanskje har lagt merke til, er dette bare vanlig CSS, som kompilerer perfekt både i Sass og LESS.

Det er viktig å merke seg at Sass også har en eldre syntaks, som utelater semikoloner og krøllete parenteser. Selv om dette fortsatt er rundt, er det det gammel og vi vil ikke bruke det forbi dette eksemplet. Syntaxen bruker .sass filtillegg og ser slik ut:

/ * style.sass * / h1 farge: # 0982c1

Stylus

Syntaxen for Stylus er mye mer verbose. Bruker .styl filtillegg, godtar Stylus standard CSS-syntaks, men det aksepterer også noen andre variasjoner der parenteser, kolonner og halvkolonner er alle valgfrie. For eksempel:

/ * style.styl * / h1 color: # 0982C1;  / * utelat parentes * / h1 farge: # 0982C1; / * unnlate kolonier og halvkolonner * / h1 farge # 0982C1

Bruke forskjellige variasjoner i samme stilark er også gyldig, så følgende vil kompilere uten feil.

h1 farge # 0982c1 h2 skriftstørrelse: 1.2em

variabler

Variabler kan deklareres og brukes i stilarket. De kan ha noen verdi som er en CSS-verdi (for eksempel farger, tall [inkludert enheter] eller tekst.), Og kan refereres hvor som helst i hele stilarket.

sass

Sass variabler er prepended med $ symbol og verdien og navnet er skilt med en semikolon, akkurat som en CSS-egenskap.

$ mainColor: # 0982c1; $ siteWidth: 1024px; $ borderStyle: prikket; kropp farge: $ mainColor; grense: 1px $ borderStyle $ mainColor; maksimal bredde: $ siteWidth; 

MINDRE

MINDRE variabler er nøyaktig det samme som Sass-variabler, bortsett fra at de variable navnene er prepended med @ symbol.

@mainColor: # 0982c1; @siteWidth: 1024px; @borderStyle: prikket; kropp farge: @mainColor; grense: 1px @ borderStyle @mainColor; maksimal bredde: @siteWidth; 

Stylus

Stylusvariabler krever ikke noe å bli prepended til, selv om det tillater det $ symbol. Som alltid er slutten semikolon ikke nødvendig, men et likestegn mellom verdien og variabelen er. En ting å merke seg er at Stylus (0.22.4) kompilerer hvis vi prepend @ symbol til et variabelt navn, men vil ikke bruke verdien når referert. Med andre ord, ikke gjør det.

mainColor = # 0982c1 siteWidth = 1024px $ borderStyle = prikket kroppsfarge mainColor grense 1px $ borderStyle mainColor maksimal bredde siteWidth

Utarbeidet CSS

Hver av de ovennevnte filene vil kompilere til samme CSS. Du kan bruke fantasien din til å se hvor nyttige variabler kan være. Vi trenger ikke lenger å endre en farge og må skrive den på nytt tjue ganger, eller ønsker å endre bredden på nettstedet og må grave rundt for å finne den. Her er CSS etter samling:

kropp farge: # 0982c1; border: 1px prikket # 0982c1; maksimal bredde: 1024px; 

nesting

Hvis vi trenger å referere til flere elementer med samme forelder i vårt CSS, kan det være kjedelig å fortsette å skrive foreldrene om og om igjen.

delen margin: 10px;  seksjon nav høyde: 25px;  seksjon nav en farge: # 0982C1;  delen nav a: hover text-decoration: understreke; 

I stedet, ved hjelp av en preprosessor, kan vi skrive barnselektorene inne i foreldrenes braketter. Også, den & symbol refererer til foreldrevelgeren.

Sass, MINDER, & Stylus

Alle tre preprosessorer har samme syntaks for nesting selektorer.

delen margin: 10px; nav høyde: 25px; en farge: # 0982C1; &: hover text-decoration: understreke; 

Utarbeidet CSS

Dette er kompilert CSS fra koden ovenfor. Det er akkurat det samme som når vi startet - hvor praktisk!

delen margin: 10px;  seksjon nav høyde: 25px;  seksjon nav en farge: # 0982C1;  delen nav a: hover text-decoration: understreke; 

mixins

Mixins er funksjoner som tillater gjenbruk av egenskaper i hele stilarket. Snarere enn å måtte gå gjennom hele stilarket vårt og endre en eiendom flere ganger, kan vi nå bare endre det i vår mixin. Dette kan være veldig nyttig for spesifikk styling av elementer og leverandør prefikser. Når mixins kalles fra en CSS-väljare, blir mixin-argumentene gjenkjent og stilene i mixin blir brukt til väljeren.

sass

/ * Sass mixin-feil med (valgfritt) argument $ borderWidth som standard til 2px hvis ikke spesifisert * / @mixin error ($ borderWidth: 2px) border: $ borderWidth solid # F00; farge: # F00;  .generisk-feil polstring: 20px; margin: 4px; @include error (); / * Gjelder stiler fra mixin feil * / .login-error left: 12px; posisjon: absolutt; topp: 20px; @include feil (5px); / * Gjelder stiler fra mixin-feil med argument $ borderWidth lik 5px * /

MINDRE

/ * Mindre blandingsfeil med (valgfritt) argument @borderWidth som standard til 2px hvis ikke spesifisert * / .error (@borderWidth: 2px) border: @borderWidth solid # F00; farge: # F00;  .generisk-feil polstring: 20px; margin: 4px; .feil(); / * Gjelder stiler fra mixin feil * / .login-error left: 12px; posisjon: absolutt; topp: 20px; .error (5 px); / * Gjelder stiler fra mixin-feil med argument @borderWidth lik 5px * /

Stylus

/ * Stylus mixin-feil med (valgfritt) argument borderWidth som standard til 2px hvis ikke spesifisert * / error (borderWidth = 2px) border: borderWidth solid # F00; farge: # F00;  .generisk-feil polstring: 20px; margin: 4px; feil(); / * Gjelder stiler fra mixin feil * / .login-error left: 12px; posisjon: absolutt; topp: 20px; error (5 px); / * Gjelder stiler fra mixin error med argument borderWidth lik 5px * /

Utarbeidet CSS

Alle forprosessorer samler til samme kode nedenfor:

.generisk feil polstring: 20px; margin: 4px; grense: 2px solid # f00; farge: # f00;  .login-error left: 12px; posisjon: absolutt; topp: 20px; grense: 5px solid # f00; farge: # f00; 

Arv

Når vi skriver CSS på den gammeldags måten, kan vi bruke følgende kode for å bruke de samme stilene til flere elementer samtidig:

p, ul, ol / * stiler her * /

Det fungerer bra, men hvis vi trenger å utforme elementene individuelt, må det opprettes en annen velger for hver, og den kan raskt bli mer messig og vanskeligere å vedlikeholde. For å motvirke dette kan arv brukes. Arv er evnen til andre CSS-selgere å arve egenskapene til en annen velger.

Sass & Stylus

.blokkere margin: 10px 5px; polstring: 2px;  p @extend .block; / * Arve stiler fra '.block' * / border: 1px solid #EEE;  ul, ol @extend .block; / * Arve stiler fra '.block' * / color: # 333; tekst-transformer: store bokstaver; 

Utarbeidet CSS (Sass & Stylus)

.blokk, p, ul, ol margin: 10px 5px; polstring: 2px;  p grense: 1px solid #EEE;  ul, ol farge: # 333; tekst-transformer: store bokstaver; 

MINDRE

MINDRE støtter virkelig ikke arvelige stiler som Sass og Stylus. I stedet for å legge til flere selektorer til et sett med egenskaper, behandler det arv som en blanding uten argumenter og importerer stilene til egne selektorer. Ulempen med dette er at egenskapene gjentas i ditt sammensatte stilark. Slik gjør du det:

.blokkere margin: 10px 5px; polstring: 2px;  p .blokk; / * Arve stiler fra '.block' * / border: 1px solid #EEE;  ul, ol .block; / * Arve stiler fra '.block' * / color: # 333; tekst-transformer: store bokstaver; 

Samlet CSS (MINDRE)

.blokkere margin: 10px 5px; polstring: 2px;  p margin: 10px 5px; polstring: 2px; grense: 1px solid #EEE;  ul, ol margin: 10px 5px; polstring: 2px; farge: # 333; tekst-transformer: store bokstaver; 

Som du kan se, stilene fra .blokkere ble satt inn i selektorer som vi ønsket å gi arven til. Det er viktig å merke seg at prioritet kan bli et problem her, så vær forsiktig.


importerer

I CSS-fellesskapet blir det importert CSS på grunn av at det krever flere HTTP-forespørsler. Importerer med en preprosessor fungerer imidlertid annerledes. Hvis du importerer en fil fra noen av de tre preprosessorer, vil det bokstavelig talt inkludere Importen under kompileringen, oppretter bare en fil. Vær oppmerksom på at det importeres regelmessig .css filer kompilerer med standard @import "file.css"; kode. Også, mixins og variabler kan importeres og brukes i ditt hovedformatark. Import gjør det mulig å skape separate filer for organisasjonen.

Sass, MINDER, & Stylus

/ * fil. type * / body background: #EEE; 
@import "reset.css"; @import "-filen. type"; p bakgrunn: # 0982C1; 

Utarbeidet CSS

@import "reset.css"; kropp bakgrunn: #EEE;  p bakgrunn: # 0982C1; 

Fargefunksjoner

Fargefunksjoner er bygd i funksjoner som vil forvandle en farge ved kompilering. Dette kan være ekstremt nyttig for å lage gradienter, mørkere svingerfarger og mye mer.

sass

lysere ($ farge, 10%); / * returnerer en farge 10% lettere enn $ farge * / mørkere ($ farge, 10%); / * returnerer en farge 10% mørkere enn $ farge * / saturate ($ color, 10%); / * returnerer en farge 10% mer mettet enn $ farge * / desaturat ($ farge, 10%); / * returnerer en farge 10% mindre mettet enn $ farge * / gråtoner ($ farge); / * returnerer gråskala på $ color * / complement ($ color); / * returnerer komplementfargen på $ color * / invert ($ color); / * returnerer invertert farge på $ color * / mix ($ color1, $ color2, 50%); / * bland $ color1 med $ color2 med en vekt på 50% * /

Dette er bare en kort liste over de tilgjengelige fargefunksjonene i Sass, en fullstendig liste over tilgjengelige Sass-fargefunksjoner kan bli funnet ved å lese Sass-dokumentasjonen.

Fargefunksjoner kan brukes hvor som helst en farge er gyldig CSS. Her er et eksempel:

$ farge: # 0982C1; h1 bakgrunn: $ color; grense: 3px solid mørkere ($ farge, 50%); 

MINDRE

lette (@color, 10%); / * returnerer en farge 10% lettere enn @color * / darken (@color, 10%); / * returnerer en farge 10% mørkere enn @color * / saturate (@color, 10%); / * returnerer en farge 10% mer mettet enn @color * / desaturate (@color, 10%); / * returnerer en farge 10% mindre mettet enn @color * / spin (@color, 10); / * returnerer en farge med en 10 grader større i fargetone enn @color * / spin (@color, -10); / * returnerer en farge med en 10 graders mindre nyanse enn @color * / mix (@ color1, @ color2); / * returner en blanding av @ color1 og @ color2 * /

En liste over alle MINDRE funksjonene kan bli funnet ved å lese MINDRE dokumentasjonen.

Her er et eksempel på hvordan du bruker en fargefunksjon i mindre:

@color: # 0982C1; h1 bakgrunn: @color; grense: 3px solid mørkere (@color, 50%); 

Stylus

lysere (farge, 10%); / * returnerer en farge 10% lettere enn 'farge' * / mørkere (farge, 10%); / * returnerer en farge 10% mørkere enn 'farge' * / mettet (farge, 10%); / * returnerer en farge 10% mer mettet enn 'farge' * / desaturat (farge, 10%); / * returnerer en farge 10% mindre mettet enn 'farge' * /

En fullstendig liste over alle Stylus-fargefunksjonene kan bli funnet ved å lese Stylus Documentation.

Her er et eksempel ved hjelp av Stylus-fargefunksjoner:

farge = # 0982C1 h1 bakgrunnsfarge grense 3px solid mørkere (farge, 50%)

operasjoner

Å gjøre matte i CSS er ganske nyttig, og nå fullt mulig. Det er enkelt, og dette er hvordan du gjør det:

Sass, MINDER, & Stylus

kropp margin: (14px / 2); topp: 50px + 100px; høyre: 100px - 50px; venstre: 10 * 10; 

Praktiske applikasjoner

Vi har dekket mange funksjoner og nye ting som forprosessorer kan gjøre, men vi har ikke dekket noe praktisk eller praktisk. Her er en kort liste over virkelige applikasjoner der bruk av en preprosessor er en livredder.

Leverandørprefikser

Dette er en av de hyped opp grunnene til å bruke en preprocessor og med en veldig god grunn - det sparer masse tid og tårer. Å lage en mixin for å håndtere leverandørprefikser er enkelt og sparer mye repetisjon og smertefull redigering. Slik gjør du det:

sass

@mixin border-radius ($ values) -webkit-border-radius: $ values; -moz-grense-radius: $ verdier; border-radius: $ verdier;  div @ include border-radius (10px); 

MINDRE

.border-radius (@values) -webkit-border-radius: @values; -moz-grense-radius: @verdier; border-radius: @values;  div .border-radius (10px); 

Stylus

border-radius (values) -webkit-border-radius: values; -moz-grense-radius: verdier; grense-radius: verdier;  div border-radius (10px); 

Utarbeidet CSS

div -webkit-border-radius: 10px; -moz-grense-radius: 10px; border-radius: 10px; 

3D-tekst

Faking 3D-tekst ved hjelp av flere tekst-skygger er en smart idé. Det eneste problemet er at bytte farge etter at det er vanskelig og tungvint. Ved å bruke mixins og fargefunksjoner, kan vi lage 3D-tekst og endre fargen på fluen!

sass

@mixin text3d ($ color) farge: $ color; tekstskygge: 1px 1px 0px mørkere ($ farge, 5%), 2px 2px 0px mørkere ($ farge, 10%), 3px 3px 0px mørkere ($ farge, 15%), 4px 4px 0px mørkere ), 4px 4px 2px # 000;  h1 font-size: 32pt; @include text3d (# 0982c1); 

MINDRE

.text3d (@color) farge: @color; tekstskygge: 1px 1px 0px mørkere (@color, 5%), 2px 2px 0px mørkere (@color, 10%), 3px 3px 0px mørkere (@color, 15%), 4px 4px 0px mørkere (@color, 20% ), 4px 4px 2px # 000;  span font-size: 32pt; .text3d (# 0982c1); 

Stylus

tekst3d (farge) farge: farge tekstskygge: 1px 1px 0px mørkere (farge, 5%), 2px 2px 0px mørkere (farge, 10%), 3px 3px 0px mørkere (farge, 15%), 4px 4px 0px mørkere , 20%), 4px 4px 2px # 000 span skriftstørrelse: 32pt text3d (# 0982c1)

Jeg valgte å skrive Stylus tekst-skygger på en linje fordi jeg utelatt de krøllete parentesene.

Utarbeidet CSS

span font-size: 32pt; farge: # 0982c1; tekstskygge: 1px 1px 0px # 097bb7, 2px 2px 0px # 0875ae, 3px 3px 0px # 086fa4, 4px 4px 0px # 07689a, 4px 4px 2px # 000; 

Sluttresultat

kolonner

Bruke talloperasjoner og variabler for kolonner er en ide jeg kom opp da jeg først spilte med CSS preprosessorer. Ved å erklære en ønsket bredde i en variabel, kan vi enkelt bytte den nedover veien uten mental matematikk. Slik er det gjort:

sass

$ siteWidth: 1024px; $ gutterWidth: 20px; $ sidebar Bredde: 300px; kropp margin: 0 auto; bredde: $ siteWidth;  .content float: left; bredde: $ siteWidth - ($ sidebar Bredde + $ gutterWidth);  .sidebar float: left; margin-left: $ gutterWidth; bredde: $ sidebjelke Bredde; 

MINDRE

@siteWidth: 1024px; @gutterWidth: 20px; @sidebar Bredde: 300px; kropp margin: 0 auto; bredde: @siteWidth;  .content float: left; bredde: @siteWidth - (@ sidebarWidth + @ gutterWidth);  .sidebar float: left; margin-venstre: @gutterWidth; bredde: @sidebarWidth; 

Stylus

siteWidth = 1024px; gutterWidth = 20px; sidebarWidth = 300px; kropp margin: 0 auto; bredde: siteWidth;  .content float: left; bredde: siteWidth - (sidebar Bredde + gutterWidth);  .sidebar float: left; margin-left: gutterWidth; bredde: sidebar Bredde; 

Utarbeidet CSS

kropp margin: 0 auto; bredde: 1024px;  .content float: left; bredde: 704px;  .sidebar float: left; margin-venstre: 20px; bredde: 300px; 

Merkbare quirks

Det er ganske mange quirks å bruke en CSS preprocessor. Jeg kommer til å gå over noen av de morsomme, men hvis du er veldig interessert i å finne dem alle, anbefaler jeg deg å skure dokumentasjonen, eller bedre, bare begynn å bruke en preprosessor i din daglige koding.

Feilrapportering

Hvis du har skrevet CSS for en anstendig tid, er jeg sikker på at du har nådd et punkt der du hadde en feil et sted og bare ikke kunne finne den. Hvis du er noe som meg, brukte du nok på ettermiddagen å trekke håret ut og kommenterte forskjellige ting for å jage feilen.

CSS preprocessors rapporterer feil. Det er bare så enkelt. Hvis det er noe galt med koden din, forteller det deg hvor, og hvis du er heldig: hvorfor. Du kan sjekke ut dette blogginnlegget hvis du er interessert i å se hvordan feil rapporteres i de forskjellige preprosessorer.

kommentarer

Når du kompilerer med en CSS-forprosessor, blir noen dobbelt-slash-kommentar fjernet (f.eks. //kommentar) og eventuelle slash-asterisk kommentarer forblir (f.eks. /* kommentar */). Når det er sagt, bruk dobbeltstrekk for kommentarer du vil ha på den ikke-sammensatte siden og skråstrek-asterisken for kommentarer du vil ha synlig etter samlingen.

Bare et notat: Hvis du kompilerer minifisert, blir alle kommentarer fjernet.


Konklusjon

Hver CSS preprosessor vi dekket (Sass, LESS og Stylus) har sin egen unike måte å utføre den samme oppgaven, noe som gir utviklere muligheten til å bruke nyttige, ikke-støttede funksjoner samtidig som nettleserkompatibiliteten og kodens renhet holdes.

Selv om det ikke er et krav til utvikling, kan preprosessorer spare mye tid og ha noen svært nyttige funksjoner.

Jeg oppfordrer dere alle til å prøve så mange preprosessorer som mulig, slik at du effektivt kan velge en favoritt og vite hvorfor det er begunstiget over de mange andre. Hvis du ennå ikke har prøvd å bruke en preprocessor til å skrive CSS, anbefaler jeg at du gir den en prøve.

Har du en favoritt CSS preprocessor-funksjon jeg ikke nevnte? Er det noe man kan gjøre som en annen ikke kan? Gi oss beskjed i kommentarene nedenfor!

En spesiell takk til Karissa Smith, en super talentfull venn av meg som skapte forhåndsvisningsminiaturen for denne artikkelen.