Wenn Sie bereits Websites erstellt haben, kennen Sie sich ver­mut­lich mit CSS aus. Viel­leicht haben Sie bei der Arbeit mit der Style­sheet-Sprache einige Features vermisst. Websites mit CSS zu designen, kann sehr mühselig werden, weshalb viele Ent­wick­ler in­zwi­schen auf SASS setzen. Hinter dem Akronym steht ein Ver­spre­chen: Syn­tac­ti­cal­ly Awesome Style­sheets. SASS ist ein Prä­pro­zes­sor und eine Style­sheet-Sprache zugleich.

Dass es sich um einen Prä­pro­zes­sor handelt, liegt an der Not­wen­dig­keit zur Um­wand­lung. Bevor SASS aus­ge­spielt werden kann, muss der Quelltext in ge­wöhn­li­ches CSS kom­pi­liert werden. Auch wie dieser Schritt funk­tio­niert, erklären wir im aus­führ­li­chen SASS-Tutorial. Damit Sie SASS einfach lernen können, gehen wir Schritt für Schritt vor und erklären alles anhand von Bei­spie­len.

Tipp

In unserem Über­blicks­ar­ti­kel erhalten Sie weitere In­for­ma­tio­nen über SASS.

An­for­de­run­gen für SASS

SASS ist prin­zi­pi­ell platt­form­un­ab­hän­gig. Sie können also sowohl auf PC als auch auf Mac oder Linux damit arbeiten. SASS basiert – zumindest in der ur­sprüng­li­chen Version – auf Ruby. Deshalb müssen Sie die Pro­gram­mier­spra­che in Ihrem System in­te­griert haben. In macOS sollte Ruby bereits vor­in­stal­liert sein. Für Windows-PCs können Sie den Ru­by­In­stal­ler verwenden. Das In­stal­la­ti­ons­pa­ket enthält sowohl die Sprache als auch eine Ent­wick­lungs­um­ge­bung (die Sie al­ler­dings für SASS nicht brauchen) und eine Do­ku­men­ta­ti­on. Auch für Linux-Dis­tri­bu­tio­nen ist die In­stal­la­ti­on nicht schwierig.

Tipp

Auch für andere Systeme gibt es prak­ti­sche In­stal­la­ti­ons­pa­ke­te. Eine Liste finden Sie auf der of­fi­zi­el­len Seite von Ruby.

SASS in­stal­lie­ren

Es gibt mehrere Methoden, wie Sie SASS auf Ihr System bringen. So haben sich in­zwi­schen einige An­wen­dun­gen etabliert, die Ihnen die Arbeit mit der Style­sheet-Sprache er­leich­tern. Teilweise kosten diese Gebühren, manche wie Koala oder Scout-App sind al­ler­dings kos­ten­frei verfügbar und Open Source. Prin­zi­pi­ell brauchen Sie aber gar kein zu­sätz­li­ches Programm, um SASS auf Ihrem System nutzen zu können. Ruby enthält den Pa­ket­ma­na­ger gem, mit dem sich die Style­sheet-Sprache ganz einfach über einen Kom­man­do­zei­len­be­fehl im­ple­men­tie­ren lässt. Dafür öffnet man das Terminal bzw. die Ein­ga­be­auf­for­de­rung und gibt folgenden Befehl ein:

gem install sass

Dies sollte schon genügen. Falls Sie eine Feh­ler­mel­dung erhalten, kann es sein, dass Sie nicht über die be­nö­tig­ten Rechte zur In­stal­la­ti­on verfügen. Dies können Sie beheben, indem Sie mit dem sudo-Befehl arbeiten (macOS, Linux) oder die Ein­ga­be­auf­for­de­rung über die rechte Maustaste als Ad­mi­nis­tra­tor starten (Windows). Um zu über­prü­fen, ob die In­stal­la­ti­on er­folg­reich war und auch auf dem neuesten Stand ist, fragen Sie SASS nach der in­stal­lier­ten Version:

sass -v

Zu­sätz­lich zur In­stal­la­ti­on sollten Sie aber auch schon die Kom­pi­lie­rung ein­rich­ten. Damit Ihr SASS-Code auch auf einer Website funk­tio­niert, muss dieser zunächst zu CSS um­ge­wan­delt werden. Auch hierfür gibt es wieder ver­schie­de­ne Wege: Wenn Sie sich für eines der Programme ent­schie­den haben, um SASS zu in­stal­lie­ren, können Sie die Kom­pi­lie­rung auch damit durch­füh­ren. Falls Sie mit den Task-Runnern Grunt oder Gulp arbeiten, über­neh­men diese die Arbeit für Sie, sobald Sie sie einmal ein­ge­rich­tet haben. Sogar für einige Text­edi­to­ren gibt es Plug-ins, die die Kom­pi­lie­rung über­neh­men. Aber auch den Schritt der Um­wand­lung können Sie einfach über die Kom­man­do­zei­le erledigen.

SASS gibt Nutzern die Optionen, entweder nach jeder Änderung im Quelltext die Kom­pi­lie­rung erneut durch­zu­füh­ren oder aber einen Über­wa­chungs­mo­dus ein­zu­schal­ten. Bei letzterem überprüft der Compiler entweder eine Datei oder einen ganzen Ordner und führt die Um­wand­lung au­to­ma­tisch durch. Für die Über­wa­chung na­vi­gie­ren Sie über die Kom­man­do­zei­le in den Ordner Ihres Website-Projekts und starten einen der beiden Befehle:

sass --watch beispiel.sass:beispiel.css

Hiermit über­wa­chen Sie die Datei beispiel.sass und kom­pi­lie­ren den Quelltext in die Datei beispiel.css. Wenn Sie in Ihrem Pro­jekt­ord­ner noch zwei Un­ter­ord­ner hin­zu­fü­gen – einen für SASS-Dateien einen weiteren für CSS-Dateien – und diese ent­spre­chend sass und css nennen, können Sie den gesamten Ordner über­wa­chen lassen:

sass --watch sass:css

Sobald Sie nun eine Änderung in den SASS-Dateien vornehmen und diese speichern, über­schreibt der Compiler selbst­stän­dig die vor­han­de­nen CSS-Dateien mit den neueren Versionen.

Eventuell möchten Sie mit Ihrem be­stehen­den Website-Projekt, das Sie noch tra­di­tio­nell in CSS verfasst haben, zu SASS umziehen. Dafür müssen Sie auch Ihren alten CSS-Code umwandeln. Hierfür sollten Sie sich aber zuvor überlegen, ob Sie in der ur­sprüng­li­chen SASS-Syntax arbeiten möchten (kurz: SASS) oder die neuere SCSS-Variante wählen (im IONOS Digital Guide lesen Sie mehr zu den Un­ter­schie­den zwischen SASS und SCSS; in diesem SASS-Tutorial werden wir immer beide Formen vor­stel­len). Auch für die Um­wand­lun­gen gibt es ent­spre­chen­de Befehle:

sass-convert beispiel.css beispiel.sass
sass-convert beispiel.css beispiel.scss

Die ent­spre­chen­den Formate liest der Converter aus den Da­tei­endun­gen ab. Al­ter­na­tiv können Sie eine nützliche, simple In­ter­net­sei­te verwenden: Beim CSS 2 SASS/SCSS Converter geben Sie Ihren CSS-Code in der linken Seite des Fensters ein und lassen sich den um­ge­wan­del­ten Quelltext auf der rechten Seite im ge­wünsch­ten Format anzeigen. Nun brauchen Sie den Code nur noch in eine Datei zu kopieren. Wenn Sie sich ent­schei­den, SCSS zu verwenden, ist die Kon­ver­tie­rung optional: Benennen Sie Ihre Dateien um – statt .css schreiben Sie einfach .scss. Jeglicher Code, den man mit CSS-Regeln verfasst hat, funk­tio­niert auch unter SCSS.

SASS: Die Syntax der Style­sheet-Sprache

Wie bereits erwähnt, gibt es unter SASS nicht nur eine Syntax. In­zwi­schen haben sich zwei kon­kur­rie­ren­de Formate etabliert. Ur­sprüng­lich basierte SASS auf der heute als „indented syntax“ bekannten Syntax, bei der Ein­rü­ckun­gen eine Ver­schach­te­lung auslösen und ein Zei­len­um­bruch eine Codezeile wir­kungs­voll beendet. SCSS hingegen ori­en­tiert sich stärker an dem Format, das man von CSS kennt und benötigt daher ge­schweif­te Klammern und Se­mi­ko­lons. Damit Sie – egal für welche Syntax Sie sich ent­schei­den – dieses SASS-Tutorial in die Praxis umsetzen können, stellen wir die Vor­ge­hens­wei­se immer in beiden Formaten vor. Schritt für Schritt gehen wir nun auf die Ei­gen­hei­ten von SASS ein.

Tipp

Wenn Sie die Style­sheet-Sprache zunächst nur aus­pro­bie­ren wollen, können Sie das auch direkt im Browser. Mit dem Sass.js Play­ground oder dem Angebot von Sass­Meis­ter geben Sie Ihren Code online ein und erzeugen direkt den ent­spre­chen­den Quelltext in CSS.

Variablen

Die meisten Web­ent­wick­ler schätzen die Ver­wen­dung von Variablen in SASS. Mit dieser nütz­li­chen Funktion können Sie In­for­ma­ti­on unter einem Alias ab­spei­chern und an ge­wünsch­ten Stellen wieder einsetzen. Sehr beliebt sind Variablen z. B. im Kontext von Farben und Grö­ßen­an­ga­ben. Unter einer Variablen kann man so den Hexwert einer Farbe speichern oder eine fest­ge­leg­te Größe mithilfe von ma­the­ma­ti­schen Funk­tio­nen anpassen. Variablen werden in SASS mit einem Dol­lar­zei­chen ($) ein­ge­lei­tet:

SASS

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

SCSS

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

An­schlie­ßend müssen Sie die Variablen nur an den ent­spre­chen­den Stellen im Code einfügen:

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;
}

Beim Kom­pi­lie­ren passt der Compiler die Syntax schließ­lich wieder an CSS an und löst die Variablen auf:

CSS

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

Bei der Benennung von Farb­wer­ten in Form von Variablen haben sich zwei un­ter­schied­li­che Prin­zi­pi­en etabliert. Manche Ent­wick­ler finden es praktisch, die Farbe direkt zu benennen ($pink), andere geben lieber an, welchem Zweck sie dienen soll ($bg-color). Prin­zi­pi­ell können Sie die Namen der Variablen aber frei wählen.

Es kann sinnvoll sein, für bestimmte Variablen einen vor­ein­ge­stell­ten Wert anzugeben. Wenn nicht anders definiert, greift SASS auf diese In­for­ma­ti­on zu. Das be­deu­te­tet im Um­kehr­schluss: Sobald man die Variable anders definiert, wird die vor­ein­ge­stell­te In­for­ma­ti­on ignoriert. Dies kann z. B. sinnvoll sein, wenn man als Ent­wick­ler ein nicht komplett fertiges Produkt an einen Klienten wei­ter­gibt, der noch Än­de­run­gen vornehmen möchte, oder man als Web­de­si­gner ein eigenes Template verwendet. Man erreicht eine solche Vor­ein­stel­lung, indem man ein !default-Flag setzt. Sie können sowohl normale Werte als auch bereits de­fi­nier­te Variablen eintragen:

SASS

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

SCSS

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

Im­por­tie­ren

SASS besitzt eine prak­ti­sche Direktive, die es Ihnen er­mög­licht, andere Dateien in das Style­sheet ein­zu­bin­den. Sie erstellen bei­spiels­wei­se eine Datei, in der Sie alle Variablen de­fi­nie­ren (hier können Sie z. B. alle be­nö­tig­ten Farbwerte festlegen und benennen) und im­por­tie­ren die Datei dann. An­schlie­ßend verwenden Sie die In­for­ma­tio­nen aus der im­por­tier­ten Datei einfach so, als würden Sie im aktuellen Quellcode stehen. Damit halten Sie Ihre Style­sheets über­sicht­li­cher. Man im­por­tiert beliebig viele Dateien mithilfe von @import – auch aus Un­ter­ver­zeich­nis­sen. Die Funktion kommt sogar damit klar, wenn Sie mehrere Dateien in einem Schritt im­por­tie­ren:

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";

Wenn Sie .sass- oder .scss-Dateien einbinden möchten, brauchen Sie keine Da­tei­endung anzugeben; das System geht au­to­ma­tisch davon aus, dass Sie solche Da­tei­ty­pen meinen. Es steht Ihnen aber auch frei, CSS-Dateien ein­zu­bin­den. Hierbei geben Sie aber auch die Endung mit an, damit der Computer weiß, was genau gemeint ist. Beim Kom­pi­lie­ren wird auch diese Ver­ein­fa­chung wieder aufgelöst: Der finale CSS-Code enthält nicht mehr die Direktive, sondern nur die In­for­ma­tio­nen aus den ent­spre­chen­den Dateien.

Partials

Was Sie häufiger bei der Arbeit mit SASS im­por­tie­ren werden, sind so­ge­nann­te Partials. Dabei handelt es sich um Code-Fragmente. Mit diesen erstellen Sie Module, die Sie immer wieder einfach einbauen können. Wenn Sie die Datei benennen, ist es wichtig, dem ei­gent­li­chen Namen einen Un­ter­strich vor­an­zu­stel­len. Dieser in­for­miert den Compiler, dass die ent­spre­chen­de Datei kein Pendant in CSS benötigt. Ansonsten würde das System bei ent­spre­chen­der Über­wa­chung alle SASS-Dateien in CSS umwandeln.

Wenn Sie die Partials im­por­tie­ren, lassen Sie den Un­ter­strich weg. SASS weiß auch so, welche Datei Sie meinen. Deshalb ist es aber notwendig, dass Sie keine gleich­lau­ten­den Dateien kreieren – einmal mit, einmal ohne Strich. Wenn Sie sowohl beispiel.sass als auch _beispiel.sass haben, wird dies zu einem Fehler führen. Das gilt übrigens auch für die Da­tei­endun­gen: beispiel.sass und beispiel.scss sollten deshalb nicht im gleichen Ver­zeich­nis liegen.

Mixins

Eine weitere wichtige Direktive sind Mixins. Dabei handelt es sich um fest­ge­leg­te Regeln, die man immer wieder im Style­sheet aufrufen kann, ohne den kom­plet­ten Code erneut ein­zu­fü­gen. Das hilft dabei, schneller zu arbeiten und den Code schlanker zu halten. Alles, was in SASS erlaubt ist, kann in einem Mixin enthalten sein – Regeln, Parameter oder Funk­tio­nen. Auch wenn der Platz im Mixin nicht begrenzt ist, sollte man nicht mehr als zwanzig Zeilen darin un­ter­brin­gen. Ziel ist es schließ­lich, die Ein­fach­heit zu steigern, statt alles nur kom­pli­zier­ter zu machen.

Um er­folg­reich mit Mixins umgehen zu können, braucht man nur zwei Di­rek­ti­ven: @mixin und @include. Mit dem erstem erstellt man die Vorlage, mit zweitem bindet man den Code-Block ein:

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;
} 
}

Beim Erstellen des Mixins geben Sie der Vorlage einen Namen (z. B. hidden). Mit diesem binden Sie den Code-Block auch an den ge­wünsch­ten Stellen wieder ein.

SASS

@include big-blue-text

SCSS

@include big-blue-text;

Im finalen CSS-Code erscheint nun statt des Mixins der komplette Quell­text­block. Die Fest­le­gung des Mixins selbst (@mixin) taucht dort deshalb auch nicht mehr auf.

Extend

Mit der Extend-Regel sparen Sie sich jede Menge Arbeit. Die Direktive sorgt dafür, dass alle Ei­gen­schaf­ten einer Klasse auf die einer anderen übergehen sollen. Um nicht alles erneut zu de­fi­nie­ren, greifen Sie zu @extend. Die Direktive funk­tio­niert auch als Kette. Eine durch @extend de­fi­nier­te Klasse kann wiederum Teil einer dritten Klasse sein:

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;
}

Der Compiler löst den Code fol­gen­der­ma­ßen auf:

CSS

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

In manchen Si­tua­tio­nen legen Sie das Aussehen für eine Klasse fest, die Sie gar nicht auf der ei­gent­li­chen Website einsetzen möchten, sondern nur in Form von @extend verwenden. Dieser Fall tritt vor allem dann ein, wenn Sie eine eigene Bi­blio­thek bauen. Für solche Si­tua­tio­nen bietet SASS Pla­ce­hol­der-Se­lek­to­ren an. Mit einem Pro­zent­zei­chen (%) kenn­zeich­nen Sie eine Klasse, die Sie nur zu dem Zweck erstellen, Sie in anderen Klassen zu verwenden. Wenn Sie einen solchen be­stehen­den Selektor dann beim Gestalten der Website nicht im­por­tie­ren, wird SASS diesen auch nicht ins CSS kom­pi­lie­ren:

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;
}

Im finalen CSS-Code taucht die Klasse module gar nicht mehr auf. Deren Ei­gen­schaf­ten werden direkt an die Klasse post übergeben.

CSS

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

Sehr hilfreich bei Extend kann auch das !optional-Flag sein: Wenn Sie eine Extension von einer Klasse schreiben, die gar nicht existiert, wird SASS beim Kom­pi­lie­ren einen Fehler ge­ne­rie­ren. Mit !optional umgehen Sie dies. SASS wird den Befehl einfach igno­rie­ren, falls es keine passende Klasse findet.

Tipp

Die Wir­kungs­wei­se von Mixins und @extend ähneln sich stark, und in den meisten Fällen ist es sinn­vol­ler, auf Mixins zu setzen. Einen aus­führ­li­chen (eng­li­schen) Artikel über die Un­ter­schie­de finden Sie auf css­wi­zar­dry.com.

Nesting

In HTML ist es selbst­ver­ständ­lich, dass man den Code in einer hier­ar­chi­schen Baum­struk­tur un­ter­glie­dert. CSS ignoriert diese Funktion und nötigt den Nutzer dazu, Ei­gen­schaf­ten immer und immer wieder zu de­kla­rie­ren. SASS bringt die Mög­lich­keit des Nestings zurück in die Style­sheets, indem die Sprache es zulässt, dass Un­ter­ka­te­go­rien die Ei­gen­schaf­ten der Ober­ka­te­go­rie erben. Auch dies sorgt wieder dafür, dass der Code insgesamt schlanker bleibt und die Arbeit beim Schreiben und Warten geringer ausfällt. So ist es z. B. möglich, das Aussehen von Links zu de­fi­nie­ren und innerhalb des Nestings fest­zu­le­gen, wie diese Links beim Hovern – oder wenn sie bereits besucht wurden –aussehen.

Wenn man Nesting im Code einsetzt, verwendet man das kauf­män­ni­sche Und (&) – auch „ampersand“ genannt –, um einen Teil des Selektors mit dem über­ge­ord­ne­ten zu ersetzen.

SASS

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

SCSS

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

Bei der Kom­pi­lie­rung muss die Ver­schach­te­lung wieder aufgelöst werden. Im CSS taucht jeder Zustand gesondert definiert wieder auf.

CSS

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

Neben der Auflösung des Nestings sorgt die Kom­pi­lie­rung natürlich auch dafür, dass aus den Variablen (deren De­fi­ni­ti­on wir im Beispiel aus­ge­las­sen haben) wieder Hexwerte werden.

Hinweis

Nesting ist ein sehr hilf­rei­ches Mittel, um den Quelltext des Style­sheets schlank und effizient zu halten. Man neigt aber leicht dazu, diese Mög­lich­keit der Ver­schach­te­lung zu stark aus­zu­nut­zen und so den ei­gent­li­chen Effekt um­zu­keh­ren und ein kom­pli­zier­tes Glie­de­rungs­sys­tem auf­zu­bau­en. Gerade bei Än­de­run­gen und Wartungen können so Probleme entstehen. Deshalb sollte man von Glie­de­run­gen ab der dritten Ebene absehen.

Durch Nesting können Sie auch so­ge­nann­te Pro­per­ties wei­ter­ge­ben. CSS kennt einige Ei­gen­schaf­ten, die der gleichen Familie angehören. So gehören z. B. alle Angaben zur Schrift­for­ma­tie­rung der gleichen Familie (font) an, müssen aber in CSS jeweils als einzelne Punkte definiert werden – mit ihren kom­plet­ten Property-Namen. SASS gibt Ihnen die Mög­lich­keit, die einzelnen Ei­gen­schaf­ten unter den Fa­mi­li­en­na­men zu gliedern.

SASS

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

SCSS

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

Funk­tio­nen

SASS kennt zahl­rei­che Funk­tio­nen, die Ihnen die Arbeit im Style­sheet er­leich­tern. Dabei handelt es sich um vor­ge­fer­tig­te Ar­beits­ab­läu­fe, die Sie ansonsten per Hand durch­füh­ren müssten. Die Funk­tio­nen lassen sich ver­schie­de­nen Ka­te­go­rien zuordnen:

  • Farben: Mit diesen Funk­tio­nen können Sie Farbwerte, Sättigung, Trans­pa­renz und viele weitere Ei­gen­schaf­ten anpassen. So können Sie z. B. mit mix() aus zwei Farben eine neue mischen.
  • Listen: Bei Listen (Reihen von CSS-Ei­gen­schafts­wer­ten) können Sie mithilfe von Funk­tio­nen z. B. die Anzahl der Einträge auslesen oder mehrere Listen zu einer zu­sam­men­füh­ren.
  • Strings: Bei Strings handelt es sich um feste Zei­chen­fol­gen, wie man sie etwa in Texten verwendet. Funk­tio­nen aus diesem Gebiet setzen z. B. eine Zei­chen­fol­ge au­to­ma­tisch in An­füh­rungs­zei­chen oder einen kom­plet­ten Text in Groß­buch­sta­ben.
  • Selectors: Mit Funk­tio­nen dieser Kategorie ma­ni­pu­lie­ren Sie komplette Se­lek­to­ren. So haben Sie bei­spiels­wei­se mit selector-unify() die Mög­lich­keit, aus zwei Se­lek­to­ren einen zu machen. Das spart Ihnen u. U. sehr viel Schreib­ar­beit.
  • Zahlen: Rund um das Thema Zahlen, Werte oder Einheiten finden Sie Funk­tio­nen, die z. B. auf- und abrunden können, die größte Zahl einer Menge her­aus­su­chen oder eine Zu­falls­zahl ausgeben.
  • Maps: Maps sind bei SASS Da­ten­struk­tu­ren aus Schlüs­seln und Ei­gen­schaf­ten. Die ent­spre­chen­den Funk­tio­nen ma­ni­pu­lie­ren die Samm­lun­gen. Sie können z. B. zwei Maps zu­sam­men­fü­gen oder einen spe­zi­fi­schen Key aus einer Map löschen.
  • In­tro­s­pec­tion: Funk­tio­nen aus diesem Bereich bieten Einsicht in den Inhalt des kom­plet­ten Style­sheets. Sie über­prü­fen etwa, ob ein be­stimm­tes Feature, Mixin oder eine spe­zi­fi­sche Funktion in Ihrem Code existiert.
  • Ver­schie­de­nes: Unter dem Punkt „Mis­cel­la­neous“ fasst SASS auch die hilf­rei­che if()-Funktion. Diese ist nicht zu ver­wech­seln mit der gleich­na­mi­gen Direktive. Auf den Un­ter­schied gehen wir unten im Punkt „Ver­zwei­gung“ ein.
Tipp

Eine komplette Liste der SASS-Funk­tio­nen, die bereits im In­stal­la­ti­ons­pa­ket verankert sind, gibt es in der of­fi­zi­el­len Do­ku­men­ta­ti­on der Style­sheet-Sprache. Dort finden Sie auch zu jeder Funktion eine kleine Erklärung.

Sie fügen Funk­tio­nen immer nach dem gleichen Muster in Ihren Code ein: Jede Funktion besitzt einen in­di­vi­du­el­len Namen und enthält in Klammern bestimmte Parameter, die durch Kommas von­ein­an­der getrennt werden. Am Ende gibt die Funktion einen einzelnen Wert aus. Am Beispiel der einfachen, aber sehr nütz­li­chen Funktion mix() erklären wir die SASS-Syntax:

SASS

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

SCSS

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

In dieser Funktion ver­mi­schen Sie die beiden Farbwerte, die Sie zuvor in Variablen fest­ge­legt haben (Sie müssen die Farbwerte al­ler­dings nicht zwingend zuvor in Variablen speichern; es steht Ihnen frei, die Hex-Werte direkt in der Funktion un­ter­zu­brin­gen). Als dritten Parameter geben Sie an, wie das Misch­ver­hält­nis sein soll: In unserem Beispiel fließen 30 Prozent von $color-1 in das End­re­sul­tat ein. Wenn Sie den letzten Parameter leer lassen, geht SASS von einer 50/50-Mischung aus. Im CSS selbst erscheint nur noch ein einzelner Wert – der Hex-Wert der re­sul­tie­ren­den Farbe:

CSS

Die bisher an­ge­spro­che­nen Funk­tio­nen befinden sich allesamt bereits im Aus­lie­fe­rungs­zu­stand von SASS. Die Style­sheet-Sprache gibt Ihnen aber auch die Mög­lich­keit, eigene Funk­tio­nen für ein Projekt zu de­fi­nie­ren. So können Sie häufig auf­tre­ten­de Ar­beits­schrit­te leichter und schneller erledigen. Damit ähneln Funk­tio­nen Mixins. Während letztere aber Code­zei­len als Output haben, liefern Funk­tio­nen nur einen Wert. Sie erstellen Funk­tio­nen mit der ent­spre­chen­den Direktive @function. Tat­säch­lich erzeugen Sie eine Funktion aber immer mit einem Di­rek­ti­ven-Paar. Neben dem initialen @function ist ein ein­ge­glie­der­tes @return notwendig, mit dem Sie den Output-Wert de­fi­nie­ren:

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);

Mit dieser bei­spiel­haf­ten Funktion führen wir eine einfache Be­rech­nung für die Spal­ten­brei­te für ein Layout-Gitter durch. Wir nehmen zunächst 12 Spalten an. Im nächsten Schritt benennen Sie die Funktion und legen fest, wie viele Parameter diese enthält – in unserem Beispiel eine Zahl. Weiterhin legen wir fest, was die Funktion machen soll und damit auch, welchen Wert sie ausgibt. In diesem Fall mul­ti­pli­ziert column-width die Zahl, die man als Parameter eingibt, mit 100 Prozent und dividiert das Ergebnis durch die Spal­ten­an­zahl. Hat man die Funktion einmal definiert, kann man diese immer wieder mit wech­seln­den Pa­ra­me­tern einsetzen. Im finalen CSS findet nur der re­sul­tie­ren­de Wert Platz:

CSS

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

Beim Erstellen von Funk­tio­nen können Sie in den Namen entweder Binde- oder Un­ter­stri­che verwenden. Wenn Sie die Funktion später aufrufen, ist die Un­ter­schei­dung egal. Sowohl function-name als auch function_name rufen die gleiche Funktion auf.

Schleifen

Loops geben der Style­sheet-Sprache den Anklang einer richtigen Pro­gram­mier­spra­che. Mit Schleifen erstellen Sie in SASS An­wei­sungs­blö­cke, die solange wie­der­holt werden, bis eine von Ihnen spe­zi­fi­zier­te Bedingung eintritt. Um Schleifen zu erzeugen, stehen Ihnen drei ver­schie­de­ne Di­rek­ti­ven zur Verfügung:

  • @for
  • @while
  • @each

Die @for-Schleife ist der Stan­dard­fall eines Loops im Kontext der Pro­gram­mie­rung. Die Schleife beginnt am Start und wie­der­holt den Auftrag so lang, bis ein Aus­stiegs­zu­stand erreicht ist und damit das Ende erreicht wird. In SASS kommt diese Direktive in zwei ver­schie­de­nen Varianten vor: Entweder der letzte Zyklus wird beim Erreichen des Ziels noch einmal durch­lau­fen oder die Schleife wird schon vorher verlassen.

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; }
}

Sie geben nach der Direktive zunächst eine beliebige Variable ($i) an und de­fi­nie­ren dann den Start- (1) und den Zielpunkt (4). Mit through geben Sie an, dass auch die vierte Wie­der­ho­lung durch­ge­führt werden soll, während die Schleife bei to nach dem dritten Durchlauf stoppt. Wenn Sie für den Startwert einen höheren Wert als den Endwert angeben, zählt SASS rückwärts. Im Loop ein­ge­glie­dert haben Sie zwei Elemente: Als erstes wird die Be­zeich­nung im CSS gewählt, die durch #{$i} eine höhere Nummer bekommt. Die Variable – und somit auch die Be­zeich­nung – wird bei jedem Durchlauf um 1 erhöht.

Fakt

#{} ist in SASS eine so­ge­nann­te In­ter­po­la­ti­on. Damit können Sie eine Variable mit einem selbst ver­ge­be­nen Be­zeich­ner kom­bi­nie­ren.

Zweitens schreiben Sie in ge­schweif­te Klammern bzw. ein­ge­rückt, was ei­gent­lich geschehen soll. In unserem Beispiel wird bei jedem Durchlauf eine Grö­ßen­an­ga­be mit einem stei­gen­den Wert ma­ni­pu­liert. Im CSS erscheint an­schlie­ßend für jeden Durchlauf ein eigener Eintrag:

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;
}

Die Direktive @while funk­tio­niert ganz ähnlich wie @for. Während aber letztere fest­ge­leg­te Start- und Ziel­punk­te hat, be­inhal­tet eine @while-Schleife eine logische Abfrage: Solange ein Zustand wahr ist, werden die An­wei­sun­gen wie­der­holt. Wie Sie sehen werden, können wir mit der @while-Funktion exakt das gleiche Ergebnis erreichen:

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;
}

Bei dieser Schlei­fen­art müssen Sie der Variablen zunächst einen Wert zuweisen, da die Direktive selbst keinen Startwert erfordert. In der Schleife geben Sie an, bis zu welchem Zustand die Wie­der­ho­lun­gen durch­ge­führt werden. In unserem Beispiel läuft der Loop, solange die Variable kleiner als 5 ist. Die Anweisung innerhalb der Schleife ist vorerst die gleiche wie im @for-Beispiel. Wieder lassen Sie die Be­zeich­nung des Elements der Variablen anpassen und die Größe steigern. Zu­sätz­lich müssen Sie aber noch einen Befehl in die Schleife in­te­grie­ren, mit dem $i bei jedem Durchlauf erhöht wird, da sonst die Schleife solange läuft, bis der SASS-Compiler gestoppt wird. Am Ende erhalten Sie aber den gleichen CSS-Code wie bei der @for-Schleife.

Die @each-Direktive arbeitet hingegen etwas anders. Grundlage dieser Schleife ist eine Liste: Die Schleife durch­läuft eine von Ihnen fest­ge­leg­te Sammlung von Daten. Für jeden Eintrag macht @each eine eigene Wie­der­ho­lung. So wäre es bei­spiels­wei­se möglich, wieder das gleiche Ergebnis wie bei den anderen Schleifen zu erzeugen, indem Sie eine Liste mit den Werten 1, 2, 3 und 4 angeben. Der wirkliche Vorteil dieses Loops liegt al­ler­dings darin, dass Sie auch andere Angaben außer Zah­len­wer­ten in die Liste eintragen können – z. B. fügen Sie mit @each un­ter­schied­li­che Bilder in Ihr Design ein. Sie können die Daten entweder direkt in die Direktive eintragen oder die Liste erst in eine Variable eintragen und dann aufrufen.

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'); }
}

Auch hier benötigen Sie wieder eine Variable. Diese nimmt bei jedem Durchlauf die Be­zeich­nung einer der Einträge der Liste an. Der Name wird sowohl in die Be­zeich­nung des Code-Blocks als auch in den Da­tei­na­men des Bildes in­te­griert. Damit das Design später auch funk­tio­niert, müssen Sie die ent­spre­chen­den Bilder unter dem an­ge­ge­be­nen Pfad natürlich auch hin­ter­legt haben. Die Schleife sorgt selbst­stän­dig dafür, dass die Variable den nächsten Eintrag übernimmt.

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");
}

Ver­zwei­gung

Neben Schleifen er­mög­licht Ihnen SASS noch ein weiteres Mittel, das man sonst aus der Pro­gram­mie­rung kennt: Ver­zwei­gun­gen nach dem Prinzip Wenn-dann-sonst. Mit der @if-Direktive lassen Sie eine Anweisung nur dann ausführen, wenn ein be­stimm­ter Zustand besteht, ansonsten greift ein anderer Befehl. Neben der Direktive gibt es auch eine Funktion if(). Beide sind un­ab­hän­gig von­ein­an­der, können aber auch gemeinsam auftreten. Die Funktion selbst ist schnell erklärt. In ihr enthalten sind drei Parameter: die Kondition und zwei ver­schie­de­ne Outputs. Der erste Output wird aus­ge­ge­ben, falls der erste Parameter wahr ist, ansonsten spielt die Funktion den dritten Parameter aus.

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);
}

In unserem Beispiel überprüft die Funktion, ob die Variable $text-color auf black (schwarz) gestellt ist. Sollte dies zutreffen (wie im Beispiel), wird der Hin­ter­grund weiß dar­ge­stellt. In jedem anderen Fall würde das CSS den Hin­ter­grund auf schwarz setzen. Wie man an diesem Beispiel schon erkennen kann, eignen sich die Ver­zwei­gun­gen nicht unbedingt für die Ge­stal­tung einer ganzen Website. Sowohl Direktive als auch Funktion sind in erster Linie in Mixins oder Partials sinnvoll. So kann die Vorlage besser darauf reagieren, was beim finalen Design für Werte vorkommen. Umgekehrt gilt: Wenn Sie ohnehin wissen, dass Ihre Textfarbe schwarz ist, müssen Sie keine komplexe Ver­zwei­gung schreiben, damit der Hin­ter­grund weiß dar­ge­stellt wird.

Funk­tio­nen haben die Ei­gen­schaft, einen einzelnen Wert wie­der­zu­ge­ben. Für kom­ple­xe­re Ansprüche verwenden Sie daher die @if-Direktive. Diese hat auch den Vorteil, dass sie mehr als zwei Fälle von­ein­an­der un­ter­schei­den können:

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);
}

Die Syntax der Direktive er­mög­licht es Ihnen theo­re­tisch, für jeden vor­ge­se­he­nen Wert einen Fall zu kreieren. Achten Sie dabei darauf, dem an­fäng­li­chen @if die Direktive @else folgen zu lassen, die Sie in Kom­bi­na­ti­on mit if so häufig aufrufen dürfen, wie Sie möchten. Nur das letzte @else bleibt frei, und Sie decken damit alle anderen Fälle ab.

Kom­men­ta­re

Auch bei SASS ist es sinnvoll, den Quelltext mit Kom­men­ta­ren zu versehen. Durch eine sinnvolle Kom­men­tie­rung bleibt das Dokument auch in der Zukunft für Sie und andere noch ver­ständ­lich. Besonders wenn Sie Vorlagen für andere Nutzer ein­rich­ten, helfen Sie diesen mit Kom­men­ta­ren bei der Be­ar­bei­tung. Viele Web­de­si­gner benutzen Kom­men­ta­re auch, um den Code über­sicht­li­cher gliedern zu können. Die meisten Pro­gram­mier- und Aus­zeich­nungs­spra­chen besitzen die Mög­lich­keit, Text in den Code ein­zu­fü­gen, der beim Kom­pi­lie­ren oder Parsen nicht beachtet wird. Dieser Text ist aus­schließ­lich für den Menschen in­ter­es­sant und nicht für den Computer.

Pro­gram­mie­rer und Web­de­si­gner benutzen Kom­men­ta­re auch, um korrekten Code aus­zu­kom­men­tie­ren: Hierbei setzen Sie einen Code-Block, den Sie aktuell nicht brauchen, aber auch nicht final aus dem Quelltext löschen möchten, in die ent­spre­chen­den Kom­men­tar­mar­kie­run­gen.

Jede Sprache hat eine spe­zi­fi­sche Methode, Text aus­zu­kom­men­tie­ren. In SASS erledigen Sie dies auf zwei ver­schie­de­ne Arten. Zum einen steht Ihnen die gleiche Mög­lich­keit zur Verfügung, die Sie auch in CSS haben: /* */. Mit dieser Methode können Sie direkt mehrere Zeilen aus­kom­men­tie­ren. Oft finden Sie Kom­men­ta­re in CSS oder SASS, bei der jede Zeile im Kom­men­tar­block mit einem Sternchen beginnt. Dies ist al­ler­dings nur eine Kon­ven­ti­on und keine Not­wen­dig­keit.

/* Dies ist ein Kommentar.
Alles zwischen den entsprechenden Markierungen
wird nicht beachtet. */
Fakt

Beim Kom­men­tie­ren ist es nicht wichtig, ob Sie Ihren Code in SCSS oder in der „indented syntax“ schreiben. In beiden SASS-Syntaxen funk­tio­nie­ren Kom­men­ta­re gleich.

Außer mit der aus CSS bekannten Methode können Sie in SASS mit // auch einzelne Zeilen aus­kom­men­tie­ren:

// Diese Ziele ist ein Kommentar.
// Und diese Zeile auch.

Der Un­ter­schied zwischen beiden Methoden besteht auch darin, dass mit den Stan­dard­ein­stel­lun­gen die erste Variante ins kom­pi­lier­te CSS über­nom­men wird, während die zweite Variante einfach verloren geht. So oder so sollten Sie aber kein CSS-Dokument mit Kom­men­ta­ren im Code als Pro­duk­tiv­ver­si­on online gehen lassen. Hierfür verwenden Sie eine mi­ni­mier­te Fassung, die Browser schneller laden können.

Zum Hauptmenü