Sok frontend fejlesztő számára hosszú éveken keresztül teljesen természetes volt, hogy a valódi munkát nem közvetlenül CSS-ben, hanem valamilyen preprocesszorban végzik. Az egyik legismertebb és legnépszerűbb megoldás az SCSS lett, amely kényelmesebb szintaxist, nestinget, változókat, mixineket és modulárisabb struktúrát kínált.

A helyzet azonban 2026-ra látványosan megváltozott. A modern böngészők ma már natívan támogatják a CSS nestinget, a CSS custom property-k pedig rég kinőtték azt a korszakot, amikor pusztán egyszerű színváltozóknak tekintettük őket. A natív CSS ma már sokkal közelebb áll ahhoz a fejlesztői élményhez, amelyet korábban kizárólag SCSS-ben lehetett elképzelni.

A régi világ: amikor a CSS „kevés volt”

A 2010-es évek frontend fejlesztésében a CSS-t sokan egy szükséges rossznak tartották. A nyelv rendkívül egyszerű volt, de ez az egyszerűség hamar korláttá vált. Nem léteztek változók, nem volt nesting, nem lehetett függvényeket írni, hiányzott a moduláris gondolkodás, és a nagyobb projektek stíluslapjai gyakran teljesen kezelhetetlenné váltak.

Ekkor érkeztek meg a preprocesszorok. A LESS, a Stylus és végül az SCSS gyakorlatilag újradefiniálta a frontend styling világát. A fejlesztők végre írhattak ilyen struktúrákat:

.card {
    background: white;

    .title {
        font-size: 2rem;
    }

    .content {
        padding: 1rem;
    }
}

Ez akkoriban óriási előrelépésnek számított. A nesting természetesebbnek, olvashatóbbnak és karbantarthatóbbnak érződött, mint a hosszú selector-láncok.

Az SCSS emellett változókat is adott:

$primary-color: #4f46e5;
$spacing: 1rem;

Sőt, mixineket, függvényeket, partialokat és import rendszert is. A frontend fejlesztés hosszú időre összefonódott a build pipeline-okkal. Webpack, Gulp, Vite, Parcel — minden projekt része lett valamilyen fordítási folyamat.

A CSS lassú, de brutális evolúciója

Miközben a frontend világ preprocesszorokkal próbálta „megjavítani” a CSS-t, maga a CSS sem állt egy helyben.

A böngészőgyártók fokozatosan elkezdtek olyan funkciókat implementálni, amelyek korábban elképzelhetetlenek voltak natív CSS-ben. Először megjelentek a CSS custom property-k:

:root {
    --primary-color: #4f46e5;
    --spacing: 1rem;
}

Sokan eleinte legyintettek rájuk. „Ez csak egy gyengébb SCSS variable.” A valóság azonban ennél sokkal érdekesebb lett.

A CSS változók ugyanis runtime-ban működnek. Nem build time-ban fordulnak le, hanem valóban élnek a böngészőben. Ez olyan lehetőségeket nyitott meg, amelyeket SCSS-ben nem lehetett natívan megoldani.

Például:

.theme-dark {
    --background: #111;
    --text-color: #fff;
}

.theme-light {
    --background: #fff;
    --text-color: #111;
}

Vagy akár:

.card {
    background: var(--background);
    color: var(--text-color);
}

És mindez azonnal frissülhet JavaScriptből, media query-ből vagy container query-ből.

A natív CSS nesting megérkezése

A valódi fordulópont azonban a natív CSS nesting támogatás volt. Hosszú éveken keresztül úgy tűnt, hogy ez a funkció talán soha nem érkezik meg. A CSS Working Group rengeteg vitát folytatott arról, hogyan nézzen ki a szintaxis, milyen edge case-ek legyenek támogatva, és hogyan lehet mindezt visszafelé kompatibilisen implementálni.

2026-ra viszont a modern böngészők már stabilan támogatják a nestinget.

.card {
    background: white;

    & .title {
        font-size: 2rem;
    }

    & .content {
        padding: 1rem;
    }

    &:hover {
        transform: translateY(-2px);
    }
}

A frontend fejlesztők jelentős része számára ez egészen szürreális élmény. Amit korábban kizárólag SCSS-ben lehetett megvalósítani, az most közvetlenül működik a böngészőben.

Ráadásul nem valamilyen polyfill vagy fordító segítségével, hanem natívan.

A scope-olt változók ereje

A CSS custom property-k egyik legfontosabb tulajdonsága, hogy scope-olhatók.

Ez elsőre talán nem tűnik forradalmi ötletnek, de valójában elképesztően erős architektúrát tesz lehetővé.

.dialog {
    --dialog-background: white;
    --dialog-padding: 2rem;

    background: var(--dialog-background);
    padding: var(--dialog-padding);
}

Majd:

.dialog.danger {
    --dialog-background: crimson;
}

És kész is a lokális theming.

SCSS-ben a változók statikusak voltak. A fordítás után eltűntek. A CSS variable viszont öröklődik, él, változik, reagál.

Ez teljesen új szemléletet hozott a komponens alapú fejlesztésbe. React, Vue, Angular vagy Web Components környezetben a CSS custom property-k gyakorlatilag natív design token rendszerré váltak.

Container query-k és a modern CSS reneszánsza

Mintha mindez nem lett volna elég, a modern CSS további olyan képességeket kapott, amelyek korábban kizárólag JavaScriptes hackekkel voltak megoldhatók.

A container query-k például lehetővé teszik, hogy egy komponens saját mérete alapján reagáljon, ne csak a viewport szélessége alapján.

.card-wrapper {
    container-type: inline-size;
}

.card {
    padding: 1rem;

    @container (min-width: 500px) {
        padding: 2rem;
    }
}

Ez radikálisan megváltoztatta a reszponzív tervezést. A komponensek valóban izolált egységekké váltak.

És itt kezdett igazán érdekes lenni a kérdés: ha a CSS már tud nestinget, tud változókat, tud scope-olást, tud container query-t, tud color-mixet, tud calcot, tud cascade layer-eket, akkor pontosan mi maradt az SCSS kizárólagos előnye?

Az SCSS még mindig erős

Természetesen az SCSS nem tűnt el. Rengeteg enterprise projekt használja továbbra is, és sok fejlesztő számára a mixinek, loopok és függvények még mindig komoly produktivitási előnyt jelentenek.

@for $i from 1 through 12 {
    .col-#{$i} {
        width: calc(100% / 12 * #{$i});
    }
}

Az ilyen dinamikus generálás továbbra sem része a natív CSS-nek.

Emellett sok projekt build pipeline-ja már eleve tartalmaz SCSS fordítást, így különösebb oka sincs az átállásnak.

Sok csapatnál az SCSS egyszerűen megszokásból maradt meg. A fejlesztők szeretik, ismerik, és az évek alatt kialakított architektúrák is erre épülnek.

De valami megváltozott

A különbség inkább pszichológiai.

2016 körül az SCSS szinte kötelező eszköznek számított. A natív CSS túl gyenge volt.

2026-ban viszont egyre több fejlesztő teszi fel ugyanazt a kérdést:

„Valóban szükségem van preprocesszorra?”

Egy kisebb vagy közepes projekt esetén ma már teljesen reális döntés kizárólag natív CSS-t használni.

A nesting működik. A változók működnek. A scope-olás működik. A design tokenek működnek. A theming működik.

Sőt, sok esetben a natív CSS rugalmasabb, mert runtime-ban képes reagálni a környezetre.

Az elmúlt években a frontend világ megszokta, hogy minden problémára újabb tooling a válasz. Build step. Plugin. Compiler. Transformer.

De talán most először történik meg az, hogy maga a platform kezd felzárkózni.

A nagy kérdés

A modern CSS ma már sokkal erősebb, mint amit néhány éve elképzelhetőnek tartottunk.

A natív nesting stabil. A custom property-k elképesztően fejlettek. A container query-k új korszakot nyitottak. A cascade layer-ek pedig végre valamilyen szintű rendet próbálnak vinni a specifikussági káoszba.

Talán nem az a kérdés, hogy az SCSS rossz-e. Mert nem rossz. Valószínűleg még hosszú évekig velünk marad.

A valódi kérdés inkább az:

Ha a böngésző natívan tudja mindazt, amiért régen preprocesszort használtunk, akkor vajon tényleg szükség van még SCSS-re 2026-ban?