Cascade Layers
Reihenfolge statt Spezifitäts-Kämpfe - tokens < reset < base < helpers < components. Kein !important, keine ID-Selektoren als Notbremse.
NativeCSS ist ein Design-System, das komplett auf bereits existierende Browser-Features setzt - Cascade Layers, Container Queries, light-dark(), natives <dialog>, scroll-getriebene Animationen. Kein Preprocessor, kein Kompilierschritt, kein Framework-Lock-in.
<link rel="stylesheet" href="ncss.css">
<link rel="stylesheet" href="theme.css">
<!-- fertig. kein npm install, kein Build. -->
Warum natives CSS
Die letzten Jahre haben CSS mehr echte Sprachfeatures gebracht als das letzte Jahrzehnt Tooling. NativeCSS baut ausschließlich darauf auf, statt sie hinter einem Preprocessor zu verstecken.
Reihenfolge statt Spezifitäts-Kämpfe - tokens < reset < base < helpers < components. Kein !important, keine ID-Selektoren als Notbremse.
EIN Wert pro Token deckt Hell und Dunkel ab - kein zweites Dark-Stylesheet, keine .dark-Klasse, die durch jede Komponente gereicht werden muss.
Komponenten reagieren auf ihren eigenen Platz, nicht auf den Viewport - eine Karte in der Sidebar verhält sich anders als dieselbe Karte im Hauptbereich, automatisch.
<dialog> und <details> statt JS-Nachbauten für Modal/Dropdown/Off-Canvas - Fokus-Handling, ESC-Taste und ::backdrop kommen kostenlos vom Browser.
animation-timeline: view()/scroll() - Lesefortschritt, Scroll-Reveal, gestapelte Karten, alles ganz ohne IntersectionObserver oder Scroll-Event-Listener.
Ganze Farbskalen (100-900, -on-soft) per color-mix() aus EINEM Basiswert berechnet - eine Marke in theme.css ändern, die ganze Skala zieht automatisch mit.
Jede Komponente eine eigene, kleine Datei (components/card.css, components/modal.css, ...) - nur einbinden, was gebraucht wird. Kein Bundler, der ungenutztes CSS erst per Purge wieder herausschneiden muss.
Features im Scrollverlauf
Diese Sektion ist selbst ein NativeCSS-Feature: .ncss-stack-section (components/scroll-stack.css) - Karten stapeln sich beim Scrollen, komplett ohne JavaScript, mit einem funktionierenden Fallback für Browser ohne view()-Unterstützung.
Eine einzige theme.css - Markenfarben, Radien, Schriften, Bewegung. Kein !important, kein zweiter Ort, an dem Werte gepflegt werden müssen.
Jede Datei liegt in einem benannten Layer. Reihenfolge entscheidet, nicht Spezifität - Web-Awesome-Bridge gewinnt garantiert gegen Web Awesomes eigenes Theme.
Lesefortschritt, Vollbild-Sektionen, diese Stapel-Karten hier, eine sich selbst zeichnende Roadmap-Linie - alles animation-timeline, kein JS.
Selbst gehostete Web Awesome + Font Awesome Komponenten (Rating, Tree, Popover) - niemals fürs Seitengerüst, damit die Seite nicht von ES-Modulen abhängt.
prefers-reduced-motion global respektiert, :focus-visible-Ringe, WCAG-geprüfte Kontraste - kein nachträgliches a11y-Audit nötig.
Alle Features im Überblick
Noch ein NativeCSS-Feature in eigener Sache: .ncss-stack-section--horizontal - dieselbe Stapel-Mechanik wie oben, nur seitlich statt vertikal.
clamp())color-mix()light-dark(), keine zweite Datei[data-palette]theme.css für allesnode_modules@supports-Fallbacks für neue CSS-Featuresprefers-reduced-motion globalCode-Beispiele
<article class="ncss-card ncss-radius-lg ncss-border ncss-shadow-sm">
<div class="ncss-card-body">
<h3>Titel</h3>
<p>Text ...</p>
<button class="ncss-btn ncss-btn--primary">
Aktion
</button>
</div>
</article>
theme.css:root {
--ncss-color-brand:
light-dark(#6f6f6e, #b7b7b6);
--ncss-color-bg:
light-dark(#154a86, #0b1c33);
}
/* Skalen (100-900), Badges, Buttons,
Cards ziehen automatisch mit. */
<div class="ncss-stack-section"
style="--ncss-stack-count: 4;">
<div class="ncss-stack-stage">
<article class="ncss-stack-card"
style="--ncss-stack-index: 0">
...
</article>
<!-- ... -->
</div>
</div>
<dialog><button command="show-modal"
commandfor="d">Öffnen</button>
<dialog id="d" class="ncss-modal">
<div class="ncss-modal-body">
Kein JS-Framework nötig.
</div>
</dialog>
Vergleich
Kein Framework ist per se "falsch" - hier die ehrliche Gegenüberstellung, wofür NativeCSS eine andere Wahl trifft.
| Kriterium | Tailwind CSS | NativeCSS |
|---|---|---|
| Build-Schritt | Ja, PostCSS-Pipeline + Purge nötig | Nein - <link> reicht |
| Ansatz | Utility-Klassen im Markup | Kuratierte Komponenten + kleine Utility-Sets |
| Theming | Config-Datei, eigenes Build nötig | EINE theme.css, kein Build |
| Dark Mode | dark:-Präfix auf jeder Klasse | light-dark(), ein Wert pro Token |
| Markup-Lesbarkeit | Viele Klassen pro Element | Wenige, sprechende Klassennamen |
| Bundle/Dateigröße | Abhängig vom Purge-Ergebnis | Statisches CSS, kein Purge nötig |
| Lernkurve | Eigene Utility-Namenskonvention | Normales CSS + Custom Properties |
| Kriterium | UIkit 3 | NativeCSS |
|---|---|---|
| Preprocessor | LESS, Build zum Anpassen nötig | Keiner - reines CSS |
| JS-Abhängigkeit | Eigenes JS für Modal/Dropdown/Off-Canvas | Natives <dialog>/<details> |
| Theming-Mechanik | LESS-Variablen, neu kompilieren | CSS Custom Properties, live |
| Responsive | Viewport-Breakpoints | Container Queries pro Komponente |
| Dark Mode | Separates Theme/Klasse | light-dark() eingebaut |
| Web-Component-Ergänzung | Nein | Web Awesome optional, nur wo nötig |
| Cascade-Kontrolle | Spezifität/Reihenfolge im LESS | Cascade Layers, explizite Reihenfolge |
Ehrlich bleiben
NativeCSS nutzt bewusst auch Features, die noch nicht in JEDEM Browser Baseline sind (z.B. animation-timeline oder container-type: scroll-state). Das ist kein Widerspruch zu "kein Build-Schritt, kein JS" - es bedeutet nur, dass jedes dieser Features per @supports-Feature-Detection ODER einer kleinen, opt-in JS-Datei abgesichert ist, die sich SELBST abschaltet, sobald der Browser die native Technik ohnehin schon beherrscht.
@supports prüft, ob eine Technik verfügbar ist, und liefert bei Bedarf eine einfachere, aber funktionale Alternative - z.B. animation-timeline: view() (Scroll-Reveal, gestapelte Karten): ohne Unterstützung erscheint der Inhalt einfach normal, ganz ohne Animation, kein Fehlerzustand. Genauso backdrop-filter (.ncss-glass) und initial-letter (Drop Caps, inkl. -webkit--Präfix für Safari).
Für die seltenen Fälle, wo CSS allein nicht reicht: eine winzige, eigenständige JS-Datei, NUR auf Seiten eingebunden, die sie brauchen. Sie prüft selbst per CSS.supports(...), ob die native Technik bereits greift, und tut in dem Fall schlicht nichts. Beispiel: hide-on-scroll-fallback.js für .ncss-hide-on-scroll (nativ nur in Chromium via container-type: scroll-state) oder command-fallback.js für command/commandfor.
Jede nicht-triviale Änderung wird während der Entwicklung in allen drei Rendering-Engines geprüft - Screenshot und berechnete Stile, nicht nur Doku-Annahmen:
| Engine | Repräsentiert |
|---|---|
| Chromium | Chrome, Edge, Brave, Opera u.a. |
| WebKit | Safari (macOS/iOS) |
| Firefox | Firefox (Gecko) |
Kein Ersatz für echte Geräte-Tests vor einem Produktiv-Einsatz, aber die drei Engines decken die überwiegende Mehrheit real genutzter Browser ab.
Kein Signup, kein Build. Repo klonen, ncss.css einbinden, loslegen.