Zum Inhalt springen
NativeCSS

NativeCSS Design System

Reine CSS Custom Properties, kein LESS, kein Compile-Schritt. Fließende Skalen (clamp()) als Standard, Container Queries statt Viewport-Breakpoints, @layer statt Spezifitäts-Kämpfe. Diese Seite zeigt alle Bausteine live.

Typografie

H1 - Hauptüberschrift

H2 - Abschnittsüberschrift

H3 - Unterüberschrift

H4 - Kleinere Überschrift

Ein normaler Absatz mit einem Link, fettem und kursivem Text, markiertem Text und einer CSS-Abkürzung. Auch Inline-Code ist enthalten.

Ein Blockzitat mit etwas längerem Text, um zu zeigen, wie der Zeilenumbruch und der linke Rand wirken.
function hello() {
  return "ncss";
}
Spalte ASpalte B
Wert 1Wert 2
Wert 3Wert 4

Kleiner, gedämpfter Hinweistext (.ncss-text-sm .ncss-text-muted).

State-of-the-Art-Typografie

Dieser Absatz beginnt mit einem Drop Cap (.ncss-drop-cap, natives initial-letter). Überschriften oben nutzen bereits text-box-trim - der unsichtbare Leerraum über/unter dem Text (Font-Metrik-Reserve) ist weg, Abstände stimmen jetzt exakt mit den Design-Tokens überein statt "ungefähr".

Silbentrennung (.ncss-hyphenate) in einer schmalen, blockformatierten Spalte: Donaudampfschifffahrtsgesellschaftskapitän, Rechtsschutzversicherungsgesellschaften.

Tabellarische Ziffern (.ncss-nums-tabular): 1111 vs. 8888 - gleiche Breite, kein "Wackeln" nebeneinander.

Textumfluss (float + shape-outside, responsive per Container Query)

Diese Box ist mit .ncss-float-start und .ncss-float-shape-circle gefloatet - der Text hier fließt um die tatsächliche Kreisform herum, nicht nur um das rechteckige Kästchen. Container schmaler als 28rem ziehen (Ecke unten rechts) - dann fällt der Float weg und die Box wird ein normaler Block, damit der Text nicht in eine unlesbar schmale Spalte gequetscht wird. Genug Text zum Umfließen, damit der Effekt sichtbar wird - mehrere Sätze braucht es, damit die Zeilen tatsächlich neben der Form beginnen und enden.

Farben

brand
bg-subtle
surface
success
warning
danger

Text-Brand · Text-Success · Text-Warning · Text-Danger

Abgestufte Skalen (color-mix() in oklch, aus einer Basisfarbe berechnet)

brand-100
brand-300
brand-500
brand-700
brand-900
brand-2-100
brand-2-300
brand-2-500
brand-2-700
brand-2-900
neutral-100
neutral-300
neutral-500
neutral-700
neutral-900

Badges (Beispiel-Nutzung der Skala, kein Utility-Klassen-Wildwuchs)

Brand Brand-2 Neutral Success Warning Danger

Listen

Fertige Varianten für <ul>/<ol>/<dl> - components/lists.css. Vollständige Referenz im Handbuch.

.ncss-list--dot

  • Punkt eins
  • Punkt zwei
  • Punkt drei

.ncss-list--icon

  • Enthalten
  • Auch enthalten

.ncss-list--steps (ol)

  1. Dateien kopieren
  2. theme.css anpassen
  3. Fertig

.ncss-dl--stats

Nutzer
1.204
Downloads
328

Buttons

Formulare

Versuch, das Feld leer abzuschicken - erst nach Interaktion rot (:user-invalid).

Intrinsisches Grid (kein Breakpoint nötig)

Fenster/Container schmaler ziehen - die Karten fließen automatisch um, ganz ohne Media Query.

Card 1
Card 2
Card 3
Card 4

Container Queries

Diese Box per Ecke unten rechts in der Breite ziehen - die Karte darin reagiert auf IHREN Container, nicht den Viewport.

Bild-Platzhalter
Text neben dem Bild, sobald der Container breit genug ist (min-width: 32rem in layout.css).

Erweiterbares Suchfeld & Divider

.ncss-search startet schmal, wächst beim Fokussieren per reiner width-Transition auf volle Breite - kein JS. Bleibt zusätzlich breit, solange bereits Text eingegeben ist.

.ncss-divider--vertical (auf einem <hr>) für Trenner innerhalb einer Flex-Zeile, horizontal ist bereits der native <hr>-Default:


Eins
Zwei
Drei

Transform-Center

.ncss-transform-center zentriert ein Element auf sich selbst (position:absolute + translate:-50% -50%) - der Elterncontainer braucht dafür eine eigene position (hier position:relative per Inline-Style auf dem Platzhalter).

Zentriert
<div style="position: relative;">
  <span class="ncss-badge ncss-transform-center">Zentriert</span>
</div>

Medien (aspect-ratio)

Cards

Karten-Titel

Kurzer Beschreibungstext für diese Karte.

Mit Kopfzeile

Rahmen/Ecken/Schatten sind eigene Utilities (helpers/elevation.css), keine Card-Modifier - hier nur .ncss-radius-lg .ncss-shadow-lg, bewusst ohne .ncss-border.

Nur .ncss-border .ncss-radius-lg, ganz ohne Schatten.

.ncss-card ganz allein: kein Rahmen, keine Ecken, kein Schatten - reine Struktur.

.ncss-card--flush: gar kein Padding mehr in Body/Header/Footer (auch nicht oben/unten), Inhalt reicht bis an jeden Kartenrand.

Media-Position: links/rechts brauchen eine Klasse (Flex-Richtung dreht sich um), oben ist die natürliche Reihenfolge, unten braucht nur .ncss-card-media als LETZTES Kind im Markup. Links/rechts brauchen mindestens 24rem CONTAINER-Breite, um nebeneinander zu stehen - Box unten ziehen, um den Umbruch zu sehen:

Media links

.ncss-card--horizontal

Media rechts

.ncss-card--horizontal-end

Media unten

Einfach .ncss-card-media als letztes Kind statt erstes

Footer bleibt immer unten ausgerichtet, unabhängig von der Textlänge der Nachbarkarte (.ncss-card-body{flex:1 1 auto} füllt den Rest, der Footer folgt direkt danach):

Kurz.

Deutlich längerer Text, der mehrere Zeilen einnimmt und diese Karte höher macht als die Nachbarkarte.

Split: Text neben Bild

Bild links vs. rechts braucht keinen Modifier - reine Dokumentreihenfolge (.ncss-split-media als erstes oder letztes Kind), genau wie bei Card oben. Ab 36rem CONTAINER-Breite stehen beide Spalten nebeneinander, darunter stapeln sie sich automatisch:

Bild links

.ncss-split-media als erstes Kind. Vertikale Ausrichtung standardmäßig zentriert (--ncss-split-align).

Bild rechts, oben ausgerichtet

.ncss-split-media als letztes Kind + .ncss-split--align-start statt der zentrierten Standardausrichtung.

<div class="ncss-split-container">
  <div class="ncss-split">
    <div class="ncss-split-media"><img src="foto.jpg" alt="..."></div>
    <div class="ncss-split-content">
      <h3>Titel</h3>
      <p>Text ...</p>
    </div>
  </div>
</div>

Tile: Farbflächen-Sektionen

Bekannt aus UIkit (uk-tile-*) - volle-Breite Blöcke zum Gliedern einer langen Seite. --brand/--brand-2 kippen automatisch auf hellen Text, Karten/Code-Blöcke DARIN bleiben normal dunkel-auf-weiß:

Marken-Fläche (--brand)

Heller Text automatisch, keine eigene Klasse nötig.

Zweitfarben-Fläche (--brand-2)

Dieselbe automatische Textumschaltung, andere Markenfarbe.

Gedämpfte Fläche (--muted)

--ncss-color-bg-subtle als Hintergrund, normaler Text.

<section class="ncss-tile ncss-tile--brand">
  <h2>Titel</h2>
  <p>Text ...</p>
</section>

Ohne weiteres Zutun bleibt eine Tile innerhalb ihres Containers - für volle Bildschirmbreite bis zum Bildschirmrand zusätzlich .ncss-full-bleed kombinieren, siehe Handbuch (Landingpage-Bausteine) für ein Beispiel.

Accordion-Split: transformierendes Akkordeon

Bekannt von apple.com - Text-Akkordeon links, dazugehöriges Bild rechts wechselt automatisch. Komplett nativ (<details name> + :has()), kein JS. Fenster/Panel schmaler als 36rem ziehen, um das Bild inline im geöffneten Punkt zu sehen:

Container Queries

Komponenten reagieren auf ihren eigenen Platz, nicht auf den Viewport.

Zwei Container unterschiedlicher Breite, derselbe Kartenaufbau passt sich per Container Query an
Cascade Layers

Reihenfolge statt Spezifitäts-Kämpfe - kein !important nötig.

Vier gestapelte, versetzte Flächen (reset, base, helpers, components) symbolisieren die Layer-Reihenfolge
light-dark()

Ein Wert pro Token deckt Hell und Dunkel ab - kein zweites Stylesheet.

Ein Kreis halb hell mit Sonne, halb dunkel mit Mond und Sternen
Zwei Container unterschiedlicher Breite, derselbe Kartenaufbau passt sich per Container Query an Vier gestapelte, versetzte Flächen (reset, base, helpers, components) symbolisieren die Layer-Reihenfolge Ein Kreis halb hell mit Sonne, halb dunkel mit Mond und Sternen

Ausführliches Beispiel inkl. reproduzierbarem Code im Handbuch (Landingpage-Bausteine).

Randnotizen (Marginnote)

Bild oder Text bricht aus der Textspalte aus, bleibt aber NEBEN dem Fließtext statt am Bildschirmrand zu landen (das leistet bereits .ncss-bleed-start/-end) - Sidenote-Muster, komplett nativ per CSS Grid. Panel schmaler als 60rem ziehen, um den Fallback (Randnotiz stapelt normal im Text) zu sehen:

CSS Grids Auto-Placement platziert Elemente in Dokumentreihenfolge und nutzt dieselbe Zeile weiter, solange die eigene Spalte darin noch frei ist. Eine Randnotiz, die im Markup direkt NACH diesem Absatz steht, landet dadurch automatisch auf gleicher Höhe daneben.

Zweiter Absatz, mit einer Notiz links daneben.

Dritter Absatz, ganz ohne Randnotiz - der Platz daneben bleibt einfach leer.

Ausführliches Beispiel inkl. reproduzierbarem Code im Handbuch (Landingpage-Bausteine).

Feste Spaltenzahl, Spannweiten & Bento-Grid

minmax(MIN, MAX) steckt schon länger hinter .ncss-grid - MIN verhindert zu schmale Spalten, MAX begrenzt zusätzlich das Wachstum nach oben (Default 1fr, unbegrenzt). Nur 2 Karten in einem breiten Grid, einmal ungedeckelt und einmal mit --ncss-grid-max:

Ohne --ncss-grid-max
Wächst unbegrenzt
Wächst unbegrenzt
--ncss-grid-max: 10rem
Gedeckelt
Gedeckelt

.ncss-grid--cols-3 statt der intrinsischen .ncss-grid - immer exakt 3 Spalten (ab 36rem Containerbreite, darunter 1 Spalte). Eine Karte mit .ncss-col-span-2 nimmt 2 der 3 Spalten ein, die nächste füllt den Rest:

2/3 Breite (.ncss-col-span-2)
1/3 Breite
1/3
1/3
1/3

.ncss-bento: gemischte Kachelgrößen, grid-auto-flow: dense füllt Lücken automatisch mit nachfolgenden kleineren Kacheln auf:

Groß (2×2)
1×1
1×1
Breit (2×1)
1×1
1×1

Responsive Tabelle (Scroll-Strategie, a11y-sicher)

NameRolleTeamStandortStartStatus
Beispiel AEntwicklungWebBerlin2024Aktiv
Beispiel BDesignWebKöln2023Aktiv

Karten-Stapel-Variante (Container schmaler ziehen):

NameRolleTeam
Beispiel AEntwicklungWeb
Beispiel BDesignWeb

Tree-Navigation (Sidebar-Variante)

Sticky & Scroll-Reveal

Bleibt oben (ncss-sticky-container)

Langer Inhalt Zeile 1

Zeile 2

Zeile 3

Zeile 4

Zeile 5

Zeile 6

Zeile 7

Zeile 8

Der Balken oben (.ncss-scroll-progress) und der schmale Streifen am rechten Bildschirmrand zeigen beide denselben Lesefortschritt. Farbe/Verlauf brauchen KEINE eigene Klasse - einfach .ncss-gradient-brand/-subtle oder .ncss-surface--brand-2/-neutral dazu kombinieren (wie beim oberen Balken). Vertikal statt horizontal: .ncss-scroll-progress--vertical (+ optional --end für die rechte statt linke Kante, wie beim seitlichen Streifen hier).

Dieses Element blendet ein, sobald es beim Scrollen in den Viewport kommt (.ncss-animate-on-scroll, kein JS).

Sichtbarkeits-Helper

Karte mit Hover-Aktion (Maus drüber bewegen)

Dieser Text ist NUR beim Drucken sichtbar.

Dieser Text ist nur am Bildschirm sichtbar (beim Drucken ausgeblendet).

Gleich hohe Cards (automatisch, kein Extra-CSS)

Kurz.

Deutlich längerer Text, der mehrere Zeilen einnimmt und diese Karte höher macht.

Mittellang.

Masonry (CSS columns)

Kurzer Inhalt.

Etwas längerer Inhalt mit mehr Text als die Nachbarkarten, um den Masonry-Effekt zu zeigen.

Kurz.

Noch mehr Text hier, damit die Spalten unterschiedlich hoch werden und der Effekt sichtbar wird.

Mittel.

Animationen

Einblend-Animationen

fade-in
slide-in-up
slide-in-down
slide-in-left
slide-in-right
scale-in

Endlos-Animationen (Aufmerksamkeit/Ladezustand)

Laufen unter prefers-reduced-motion: reduce automatisch nur einen einzigen, praktisch unsichtbaren Frame (globale Regel in reset.css) - kein Extra-Code pro Animation nötig.

.ncss-animate-spin
Live .ncss-animate-pulse
.ncss-animate-shake (per JS getriggert)
.ncss-skeleton

Mikro-Interaktionen (Hover/Press)

Transition-basiert, kein animation - reagieren auf Zustand statt einmalig abzulaufen. Maus drüber bewegen bzw. klicken/halten:

hover-lift
hover-grow
+ gpu-boost

.ncss-gpu-boost (transform: translateZ(0)) lässt sich gefahrlos mit hover-lift/-grow kombinieren, weil diese die eigenständigen translate/scale-Eigenschaften nutzen, nicht transform - nur gezielt bei sichtbarem Ruckeln einsetzen, nicht vorsorglich überall (jede zusätzliche Compositor-Ebene kostet Grafikspeicher).

Slideshow (Scroll-Snap, ohne JS)

  • Slide 1
  • Slide 2
  • Slide 3

Off-Canvas-Sidebar (eigenständig, nicht nur im Mobile-Nav)

Dasselbe .ncss-offcanvas, das die Navigation oben unterhalb 64rem Viewport-Breite nutzt - hier unabhängig davon, immer über den Button auslösbar.

Off-Canvas-Inhalt

Schiebt sich von der Kante ein (@starting-style + translate), mit Backdrop und Fokus-Trap - alles vom nativen <dialog>.

Klassischer Breakpoint-Escape-Hatch

Sichtbar ab 768px (.ncss-hide-below-md).

Sichtbar unter 768px (.ncss-hide-from-md).

Full-Bleed-Sektion

Drei Varianten, damit klar wird, was .ncss-full-bleed genau tut - der Trick bricht immer auf 100vw aus, egal wie breit oder schmal der umgebende Container gerade ist.

1. Hintergrund randlos, Inhalt bleibt normal breit (der häufigste Fall)

Diese <section> bleibt strukturell in <main class="ncss-container"> verschachtelt, bricht optisch aber randlos aus (.ncss-full-bleed) - der innere .ncss-container hält den Text wieder in normaler Spaltenbreite, nur der Hintergrund geht bis zum Bildschirmrand.

2. Ohne inneren .ncss-container: der Inhalt bricht mit aus

Fehlt der innere .ncss-container, läuft auch der TEXT bis an den Bildschirmrand - meist nur für ein einzelnes randloses Bild, Video oder ein reines Farbband sinnvoll, nicht für Fließtext.

3. Bricht auch aus einem schmalen Eltern-Container heraus

Dieser Block steckt in einem schmalen .ncss-container--narrow - der Full-Bleed-Trick bricht trotzdem bis zum echten Bildschirmrand aus, unabhängig davon, wie eng sein direkter Elternrahmen gerade ist.

4. Einseitig ("Lesezeichen"): .ncss-bleed-end bricht nur nach rechts aus

Links bleibt dieses Zitat normal in der Textspalte, rechts bricht es bis zum Bildschirmrand aus - wie ein Lesezeichen, das aus dem Inhalt herausragt. Die spiegelverkehrte Variante .ncss-bleed-start bricht stattdessen nach links aus.

5. Ab der Mitte nach rechts: .ncss-bleed-half-end - die START-Kante (links) sitzt exakt auf der Mitte des Elternelements, die END-Kante (rechts) bricht bis zum Bildschirmrand aus

Beginnt in der Mitte, bricht nach rechts bis zum Bildschirmrand aus.

6. Ab der Mitte nach links: .ncss-bleed-half-start - spiegelverkehrt zu Nr. 5

Bricht nach links bis zum Bildschirmrand aus, endet in der Mitte.

7. Symmetrisch aus der Mitte: .ncss-bleed-center wächst auf beiden Seiten gleich weit um einen festen Betrag, bleibt aber auf der Mitte des Elternelements zentriert (anderer Mechanismus, kein Bezug zum Viewport - funktioniert daher auch in einem nicht zentrierten Container)

Wächst um 1.5rem auf jeder Seite über die Karte hinaus, bleibt aber zentriert.