CSS Image-Sprites
Optional Advanced hat gerade !important behandelt — ein seltener Override-Schalter. Diese Session ist ein anderes optionales Thema: Image-Sprites. Du triffst sie in älteren Stylesheets und manchen Legacy-Icon-Sets. Die Idee ist einfach: eine Bilddatei, viele Icons, und background-position wählt, welche Kachel durch ein kleines Fenster schaut.
Direkte Antwort
Ein CSS Image-Sprite ist ein einziges Sheet-Bild, das mehrere Icons (oder Button-Zustände) nebeneinander speichert. Jedes UI-Element bekommt feste Breite und Höhe, dasselbe background-image und ein background-position, das das Sheet verschiebt, bis die gewünschte Kachel die Box füllt. Sprites senkten die Request-Zahl im alten „eine Datei pro Icon“-Web. Für neue Arbeit bevorzugst du SVG-Icons, Inline-SVG oder ein kleines Icon-System — behalte Sprites, wenn du ein vorhandenes Sheet pflegst oder ein Legacy-Design treffen musst.
Warum es Sprites gab
Früher bedeutete jedes Icon oft einen weiteren HTTP-Roundtrip. Zwanzig winzige PNGs in einem Sheet zu bündeln hieß ein Download und ein Cache-Eintrag. Browser malten dann mit CSS unterschiedliche „Fenster“ auf dieses Sheet. HTTP/2 und modernes Bundling haben diesen Schmerz verringert, und skalierbare Vektor-Icons wirken meist schärfer — aber das Positionierungsmuster bleibt nützliche Literacy, wenn du alten CSS öffnest.
Die drei Bausteine
Du brauchst:
- Ein Sheet — z. B.
icons.pngmit Kacheln in einer Reihe oder einem Raster - Eine Box —
widthundheightpassend zu einer Kachel (oft mitdisplay: inline-blockoder einem Block-Link) - Einen Offset —
background-position, damit die richtige Kachel unter der Box sitzt
background-repeat: no-repeatverhindert, dass das Sheet kachelt. Du lädst keine eigene Datei pro Icon; du schneidest über Position.
Erste Kachel auf einem gemeinsamen Sheet
Stell dir ein Sheet vor, in dem jedes Icon 32×32 Pixel groß ist. Das erste sitzt oben links. Die Element-Box ist 32×32, und der Hintergrund startet bei 0 0:
.icon {
display: inline-block;
width: 32px;
height: 32px;
background-image: url("icons.png");
background-repeat: no-repeat;
background-position: 0 0;
}
Die Box wirkt wie ein Viewport. Sichtbar ist nur die oberen linken 32×32 von icons.png. Der Rest des Sheets ist da — nur durch die Elementgröße abgeschnitten.
Zweites Icon: Sheet verschieben
Beginnt das nächste Icon 32px weiter rechts, verschiebe den Hintergrund um 32px nach links (negatives X). Dasselbe Bild, dieselbe Boxgröße, anderes Fenster:
.icon-home {
display: inline-block;
width: 32px;
height: 32px;
background-image: url("icons.png");
background-repeat: no-repeat;
background-position: 0 0;
}
.icon-search {
display: inline-block;
width: 32px;
height: 32px;
background-image: url("icons.png");
background-repeat: no-repeat;
background-position: -32px 0;
}
Negatives X zieht das Sheet nach links, bis die zweite Kachel das Fenster füllt. Eine zweite Icon-Zeile ändert auch den Y-Wert (z. B. -32px -32px). Miss an deinem echten Sheet — rate Offsets nicht aus dem Gedächtnis.
Hover aus einer anderen Kachel
Button-Sets legen oft Standard und Hover (oder Active) auf dasselbe Sheet. Bei :hover änderst du nur background-position:
.btn-icon {
display: inline-block;
width: 40px;
height: 40px;
background-image: url("btn-sheet.png");
background-repeat: no-repeat;
background-position: 0 0;
}
.btn-icon:hover {
background-position: -40px 0;
}
Keine zweite Bilddatei — nur ein anderer Ausschnitt. Die Boxgröße stabil halten, damit das Control nicht springt.
Ruhige Sheet-Gewohnheiten
Kombiniere das Sheet immer mit einer expliziten Box und no-repeat. Benenne Klassen nach der Rolle, nicht nur nach Pixelrechnung:
.sprite {
display: inline-block;
background-image: url("icons.png");
background-repeat: no-repeat;
}
.sprite--mail {
width: 24px;
height: 24px;
background-position: 0 -48px;
}
.sprite--bell {
width: 24px;
height: 24px;
background-position: -24px -48px;
}
Dokumentiere das Kachel-Raster kurz im Kommentar (Kachelgröße, Zeilenreihenfolge), damit der nächste Maintainer keine Magiezahlen reverse-engineeren muss.
Sprites damals vs. Icons heute
📊 Sprite sheets vs modern icon approaches
| Approach | Best when | Watch out |
|---|---|---|
| CSS image sprite (PNG sheet) | Legacy UI you must keep; one cached sheet already in the project | Raster scales poorly; offsets break if the sheet changes |
| Inline SVG / SVG sprite | Crisp UI icons at any size; easy theming with currentColor |
Slightly more markup or build setup |
| Icon font | Very old stacks that already ship one | Accessibility and ligature quirks; harder to theme than SVG |
| Separate PNG per icon | Rare one-off graphics | Many requests on old HTTP/1 connections |
Real <img> photos |
Content images, galleries, product shots | Not a job for background-position sprites |
Die Lektionen Image gallery und responsive images nutzen echte <img> (Flex-Thumbs, object-fit, srcset). Sprites sind meist dekoratives UI-Chrome im Hintergrund — kein Ersatz für inhaltliche Fotos mit sinnvollem alt.
Für neue UI moderne Icons bevorzugen
Bei einer frischen Oberfläche mit SVG starten (inline oder kleines SVG-Sprite-System). Du bekommst schärfere Kanten, einfachere Farbwechsel und keine fragilen Pixel-Offsets. Zum klassischen PNG-Sprite greifen nur, wenn das Design-Pack schon ein Sheet ist — oder wenn du CSS patchst, das bereits davon abhängt.
/* Content photo — use <img>, not a sprite crop */
.hero-photo {
max-width: 100%;
height: auto;
}
/* UI chrome — sprite OK only if the sheet already exists */
.toolbar .icon-save {
width: 16px;
height: 16px;
background-image: url("legacy-toolbar.png");
background-repeat: no-repeat;
background-position: -64px 0;
}
Selbst ausprobieren
- Skizziere eine 3-Icon-Reihe auf Papier (oder öffne ein echtes Sprite). Notiere die Kachelbreite (z. B. 32px).
- Erstelle
.icon-amitbackground-position: 0 0und passender Box. - Füge
.icon-bmit-32px 0hinzu (oder deinem echten zweiten Offset). - Schreibe eine Hover-Regel zur dritten Kachel, ohne width/height zu ändern.
- Schreibe einen Satz als Kommentar: warum dieses Sheet noch existiert (Legacy) oder warum du nächstes Mal SVG nimmst.
Typische Fehler
- Content-Fotos in ein Sprite stecken und
alt/ Semantik verlieren - width und height vergessen, sodass das ganze Sheet sichtbar wird oder nichts sauber croppt
- Positive Offsets nutzen, obwohl das Sheet in die andere Richtung rutschen sollte
background-repeatanlassen, sodass Kacheln in der Box duplizieren- Eine brandneue App standardmäßig auf PNG-Sprites statt SVG bauen
- Offsets aus einem Tutorial kopieren, ohne dein Sheet zu messen
Kurzfassung
- Ein Sprite ist ein Sheet;
background-positionwählt, welche Kachel eine feste Box füllt - Historisch reduzierte das HTTP-Requests für viele kleine Icons
no-repeat, stabile Größen und benannte Rollen behalten; Raster dokumentieren- Für neue UI SVG (oder ähnlich) bevorzugen; Sprites für Legacy-Sheets behalten
- Content-Bilder bleiben echte
<img>— Galerie und responsive images sind eine andere Aufgabe - Optional Advanced geht als Nächstes mit Mehrspalten (
multi-column) weiter
🧠 Testen Sie Ihr Wissen
Testen Sie Ihr Wissen
Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen
📝 Anweisungen
- Lesen Sie jede Frage sorgfältig
- Wählen Sie die beste Antwort für jede Frage
- Sie können das Quiz so oft wiederholen, wie Sie möchten
- Ihr Fortschritt wird oben angezeigt