CSS

Sass i SCSS – czym się różnią i jak ich używać?

9 min. czytania

Sass to preprocesor CSS, który oferuje dwie składnie: SCSS (bardziej „css‑owa”) oraz Sass – składnia wcięciowa. Różnią się wyłącznie sposobem zapisu, a nie możliwościami.

W praktyce większość nowych projektów korzysta dziś ze SCSS. Niezależnie od wyboru, narzędzie i funkcje (zmienne, zagnieżdżanie, mixiny, dziedziczenie itd.) pozostają takie same.

Czym jest Sass i po co go używać?

Sass (Syntactically Awesome Style Sheets) to język skryptowy / preprocesor CSS, który kompiluje się do zwykłego arkusza stylów CSS. Piszesz kod podobny do CSS, ale z dodatkowymi możliwościami, które przyspieszają pracę i porządkują duże projekty.

Najważniejsze możliwości w pigułce:

  • zmienne – trzymanie w jednym miejscu wartości wielokrotnego użytku (kolory, rozmiary, odstępy);
  • zagnieżdżanie selektorów – krótszy, bardziej czytelny kod powiązanych reguł;
  • mixiny – wstrzykiwanie powtarzalnych fragmentów (jak „funkcje” w CSS);
  • dziedziczenie/rozszerzanie – wspólne podstawy i warianty (np. @extend);
  • import i modułowość – dzielenie stylów na pliki i łączenie ich przy kompilacji.

Przeglądarka nie rozumie Sass bezpośrednio – zawsze otrzymuje zwykły plik .css, a Sass jest etapem pośrednim w procesie budowania.

Dla serwisu o tworzeniu stron i dostępności kluczowe jest to, że Sass sprzyja spójnemu stylowaniu (np. jednolite focusy, kolory o właściwym kontraście, powtarzalne komponenty) oraz utrzymaniu porządku w dużych arkuszach, co ułatwia egzekwowanie wymogów dostępności w całym serwisie.

Sass, SASS, SCSS – porządkujemy pojęcia

W materiałach często pojawia się chaos nazewniczy, dlatego warto to uporządkować:

  • Sass – nazwa narzędzia / preprocesora CSS jako całości;
  • Sass – składnia wcięciowa (pliki .sass) – oryginalna składnia, krótsza, oparta na wcięciach, bez nawiasów klamrowych i średników;
  • SCSS (Sassy CSS, pliki .scss) – nowsza składnia w pełni kompatybilna z CSS, korzysta z nawiasów klamrowych i średników, wygląda jak „CSS z dodatkami”.

Najważniejsze fakty:

  • w ramach jednego preprocesora Sass masz do wyboru dwie składnie: scss i sass,
  • funkcjonalnie się nie różnią – to ten sam język i te same możliwości; różni je tylko sposób zapisu,
  • pliki .scss i .sass mogą się wzajemnie importować, bo kompilowane są tym samym narzędziem.

SCSS kontra Sass – konkretne różnice

Jedyna istotna różnica to składnia. Kluczowe różnice prezentuje tabela:

Cecha SCSS (.scss) Sass – składnia wcięciowa (.sass)
Styl zapisu jak CSS – nawiasy {} i średniki ; oparty na wcięciach / białych znakach, bez {} i ;
Kompatybilność z CSS każdy poprawny CSS jest poprawnym SCSS – można zmienić rozszerzenie .css.scss standardowy CSS nie jest poprawnym .sass bez dostosowania wcięć
Historia nowsza, „główna” składnia Sass, dostępna od wersji 3 stara, oryginalna składnia z początków Sass w środowisku Ruby
Deklaracja mixin / include słowa kluczowe @mixin, @include krótszy zapis (np. = dla mixin, + dla wywołania)
Wymuszenie formatowania nawiasy i średniki decydują o strukturze wcięcia są kluczowe i wymuszają czytelne formatowanie
Popularność częściej używana, łatwiejsza dla osób znających CSS bardziej niszowa, preferowana przez fanów składni „pythonowej”
Funkcje (zmienne, mixiny, itp.) identyczny zestaw funkcji Sass identyczny zestaw funkcji Sass

Wpis ze źródeł wprost

Poniżej dosłowne cytaty podsumowujące temat:

Składnie SASS i SCSS nie różnią się zasadą działania, funkcjonalnością. JEDYNĄ różnicą między nimi jest… składnia.

SCSS (Sassy CSS) używa zapisu zbliżonego do CSS (…). SASS był oryginalnym językiem, z którego później powstał SCSS.

SCSS odnosi się do głównej składni obsługiwanej przez preprocesor CSS Sass (…). Pliki z rozszerzeniem .sass reprezentują „starszą” składnię wspieraną przez Sass, wywodzącą się ze świata Ruby.

Przykład – ten sam kod w SCSS i Sass

Załóżmy prosty komponent przycisku, z naciskiem na dostępność: wyraźny focus, właściwy kontrast, spójne odstępy.

SCSS

Poniżej przykład w składni SCSS:

// _variables.scss
$primary-color: #005fcc;
$primary-color-contrast: #ffffff;
$focus-outline-color: #ffbf47;
$border-radius: 4px;
$spacing-sm: 0.5rem;
$spacing-md: 1rem;

// _mixins.scss
@mixin focus-ring {
outline: 2px solid $focus-outline-color;
outline-offset: 2px;
}

// buttons.scss
@use 'variables';
@use 'mixins';

.button {
display: inline-flex;
align-items: center;
justify-content: center;
padding: variables.$spacing-sm variables.$spacing-md;
border-radius: variables.$border-radius;
border: 1px solid transparent;
background: variables.$primary-color;
color: variables.$primary-color-contrast;
font-weight: 600;
text-decoration: none;

&:hover,
&:focus-visible {
background: darken(variables.$primary-color, 7%);
}

&:focus-visible {
@include mixins.focus-ring;
}

&--secondary {
background: transparent;
border-color: variables.$primary-color;
color: variables.$primary-color;

&:hover,
&:focus-visible {
background: rgba(variables.$primary-color, 0.1);
}
}
}

Sass (składnia wcięciowa)

Ten sam komponent zapisany w .sass:

// _variables.sass
$primary-color: #005fcc
$primary-color-contrast: #ffffff
$focus-outline-color: #ffbf47
$border-radius: 4px
$spacing-sm: 0.5rem
$spacing-md: 1rem

// _mixins.sass
=focus-ring
outline: 2px solid $focus-outline-color
outline-offset: 2px

// buttons.sass
@use 'variables'
@use 'mixins'

.button
display: inline-flex
align-items: center
justify-content: center
padding: variables.$spacing-sm variables.$spacing-md
border-radius: variables.$border-radius
border: 1px solid transparent
background: variables.$primary-color
color: variables.$primary-color-contrast
font-weight: 600
text-decoration: none

&:hover, &:focus-visible
background: darken(variables.$primary-color, 7%)

&:focus-visible
+mixins.focus-ring

&--secondary
background: transparent
border-color: variables.$primary-color
color: variables.$primary-color

&:hover, &:focus-visible
background: rgba(variables.$primary-color, 0.1)

Różni się wyłącznie sposób zapisu – kompilator i wynikowy CSS pozostają takie same.

Co wybrać – Sass czy SCSS?

SCSS to dziś domyślny wybór społeczności front‑endowej.

Dlaczego w praktyce wygrywa SCSS:

  • jeśli znasz CSS, nauka scss jest bardzo prosta, bo składnia jest niemal identyczna,
  • możesz wziąć istniejący plik .css, zmienić rozszerzenie na .scss i od razu korzystać,
  • łatwiej wdrożyć nowe osoby do projektu, bo kod wygląda jak „CSS plus kilka słów kluczowych”,
  • scss jest „oficjalną”, główną składnią Sass – uznawaną za standardową.

Głos społeczności bywa zgodny:

Nie ma lepszej. To tylko i wyłącznie kwestia preferencji.

Z punktu widzenia utrzymania zespołowego kodu i onboardingu nowych deweloperów SCSS jest zwykle bezpieczniejszym wyborem.

Jak zacząć używać Sass/SCSS w projekcie?

Podstawowy workflow

Typowy schemat pracy wygląda tak:

  1. Tworzysz katalog ze źródłami (np. src/scss/) i pliki .scss lub .sass.
  2. Kompilujesz je narzędziem Sass do jednego lub kilku plików .css (np. do public/css/ lub dist/css/).
  3. W HTML podłączasz tylko wynikowy CSS, np. <link rel="stylesheet" href="css/main.css">.

Kompilacja może się odbywać:

  • z linii komend (np. sass src/scss:dist/css),
  • przez narzędzia build (Webpack, Vite, Gulp, Parcel),
  • przez edytor – np. Visual Studio Code z wtyczką Easy Sass, która po zapisaniu pliku .scss generuje odpowiadający mu .css.

Struktura plików

Popularny i czytelny schemat (do adaptacji według potrzeb projektu):

src/
scss/
base/
_reset.scss
_typography.scss
components/
_buttons.scss
_forms.scss
_alerts.scss
layout/
_grid.scss
_header.scss
_footer.scss
utilities/
_variables.scss
_mixins.scss
_accessibility.scss
main.scss

Pliki zaczynające się od _ to tzw. partiale, które są importowane do pliku głównego i same nie generują osobnego CSS.

W main.scss łączysz wszystko następująco:

@use 'utilities/variables';
@use 'utilities/mixins';
@use 'utilities/accessibility';

@use 'base/reset';
@use 'base/typography';

@use 'layout/grid';
@use 'layout/header';
@use 'layout/footer';

@use 'components/buttons';
@use 'components/forms';
@use 'components/alerts';

Składnia i możliwości SCSS w praktyce

Zmienne

W SCSS definiujesz zmienne na kolory, rozmiary, odstępy czy z‑indexy, aby trzymać kluczowe wartości w jednym miejscu:

$color-primary: #005fcc;
$color-danger: #d4351c;
$font-size-base: 1rem;
$line-height-base: 1.5;

$spacing-xs: 0.25rem;
$spacing-sm: 0.5rem;
$spacing-md: 1rem;

Pod kątem dostępności warto trzymać w zmiennych sprawdzone pary kolorów (tło + tekst) oraz stałe odstępy dla przewidywalnego rytmu wizualnego.

Zagnieżdżanie selektorów

Zagnieżdżanie upraszcza pisanie reguł powiązanych z jednym komponentem:

.card {
padding: $spacing-md;
border-radius: 6px;
background: #fff;

&__title {
font-size: 1.25rem;
margin-bottom: $spacing-sm;
}

&__content {
margin-bottom: $spacing-sm;
}

&__actions {
display: flex;
gap: $spacing-sm;
}
}

Dobrą praktyką jest łączenie Sass z metodologiami typu BEM, aby unikać nadmiernej złożoności i trudnej do nadpisania specyficzności.

Mixiny

Mixiny działają jak funkcje – przyjmują argumenty i wstrzykują wielokrotne fragmenty CSS:

@mixin visually-hidden {
position: absolute !important;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
border: 0;
clip: rect(0 0 0 0);
overflow: hidden;
}

.sr-only {
@include visually-hidden;
}

W dostępności pomagają m.in. mixiny na visually hidden, focus‑ring, preferencje ruchu czy kontrastowe warianty przycisków – dzięki nim stosujesz te same wzorce w całym serwisie.

Dziedziczenie (@extend)

Dziedziczenie pozwala oprzeć warianty na wspólnej bazie:

.message {
padding: $spacing-sm $spacing-md;
border-radius: 4px;
border: 1px solid transparent;
}

.message--success {
@extend .message;
background: #e6f4ea;
border-color: #0b8a3a;
}

.message--error {
@extend .message;
background: #fce5e3;
border-color: #d4351c;
}

To ułatwia zachowanie spójnej typografii i kontrastu w różnych wariantach komunikatów.

Operacje i funkcje

Sass obsługuje operacje na liczbach, kolorach, listach i mapach oraz funkcje wbudowane (np. lighten, darken, mix):

$base-font-size: 16px;

body {
font-size: $base-font-size;
}

small {
font-size: $base-font-size * 0.875;
}

Dla kolorów (warto pilnować minimalnego kontrastu):

$button-bg: #005fcc;
$button-bg-hover: darken($button-bg, 7%);

Sass a dostępność – jak Sass może w tym realnie pomóc?

Sass sam w sobie nie zapewnia dostępności, ale daje narzędzia, by wdrożyć i utrzymać spójne, dostępne wzorce w całym serwisie oraz szybko poprawiać błędy (np. kontrast) w jednym miejscu.

Przykłady technik: zdefiniowana paleta par kolorów przetestowanych pod kątem kontrastu oraz komponentowe mixiny stosowane konsekwentnie w projekcie.

Przykładowy mixin na widoczny focus, który zastosujesz globalnie:

@mixin focus-outline($color: $focus-outline-color) {
outline: 2px solid $color;
outline-offset: 2px;
}

a,
button,
input,
textarea {
&:focus-visible {
@include focus-outline;
}
}

Dzięki temu każdy element interaktywny ma wyraźny focus, a zmiana jego wyglądu to edycja jednego miejsca.

Media queries jako mixiny – spójna obsługa preferencji systemowych użytkownika:

@mixin prefers-reduced-motion {
@media (prefers-reduced-motion: reduce) {
@content;
}
}

.anim-fade-in {
animation: fade-in 300ms ease-out;

@include prefers-reduced-motion {
animation: none;
}
}

Warto utrzymywać osobny moduł np. _accessibility.scss z wzorcami (focus, skip‑link, visually hidden, komunikaty błędów) i wczytywać go w pliku głównym.

Kiedy warto rozważyć składnię wcięciową Sass?

Mimo dominacji SCSS, składnia wcięciowa Sass ma zalety: jest bardziej zwięzła (brak nawiasów i średników) i wymusza konsekwentne wcięcia, co może podnosić czytelność w zespołach do tego przyzwyczajonych.

Jednak w praktyce pojawiają się ograniczenia:

  • wymaga świadomego wyboru całego zespołu,
  • jest mniej popularna, co może utrudnić onboarding nowych osób,
  • większość materiałów, snippetów i projektów open‑source używa dziś scss.

Jeżeli tworzysz artykuły, kursy czy biblioteki dla szerokiej publiczności, SCSS pozostaje najbezpieczniejszym standardem.