CSS mask
mask blendet Teile eines Elements aus – ähnlich wie clip-path. Im Unterschied zu clip-path kann mask jedoch Gradients, Bilder und SVG-Masken verwenden. Dadurch entstehen weiche Übergänge, Fade-Effekte und teiltransparente Bereiche, die mit clip-path nicht möglich sind.
Typische Einsatzgebiete
- Hero-Bilder weich ausblenden
- Fade-Effekte für Texte und Bilder
- Bildmasken mit Gradients oder SVG
- Weiche Übergänge und transparente Bereiche
mask vs. clip-path
clip-pathNur harte Kanten – ein Pixel ist entweder sichtbar oder komplett unsichtbarmaskErlaubt weiche Übergänge – Grauwerte bzw. Transparenz der Maske steuern die Deckkraft
Mask-Eigenschaften
mask-imageDefiniert die Maske – als Gradient, Bild oder SVGmask-sizeGrösse der Maske, wiebackground-sizemask-positionPosition der Maske, wiebackground-positionmask-repeatWiederholung der Maske, wiebackground-repeatmask-clipBegrenzt die Maske aufborder-box,padding-boxodercontent-boxmask-originBezugspunkt fürmask-position(Standard:border-box)mask-modeHelligkeit (luminance) oder Alphakanal (alpha) auswertenmask-compositeVerrechnet mehrere Masken (add, subtract, intersect, exclude)-webkit-mask-*Safari benötigt die Eigenschaften zusätzlich mit Präfix
mask-image
mask-image definiert die Maske eines Elements. Als Maske können Gradients, Bilder oder SVG-Dateien verwendet werden. Schwarze Bereiche bleiben sichtbar, transparente Bereiche werden ausgeblendet und Grauwerte erzeugen weiche Übergänge.
Harte und weiche Masken
Bei einer Maske gilt: schwarz (bzw. transparent) blendet aus, weiss (bzw. opak) zeigt an – alles dazwischen wird teiltransparent.
.hart {
mask-image: linear-gradient(black 50%, transparent 50%);
/* harter Schnitt bei 50% – wie clip-path */
}
.weich {
mask-image: linear-gradient(black, transparent);
/* fliessender Verlauf von sichtbar zu unsichtbar */
}
Wichtig: Safari braucht weiterhin das Präfix -webkit-mask-image zusätzlich zur unpräfixten Version.
Bild als Maske: Foto-Vignette
Ein radialer Verlauf als Maske erzeugt einen klassischen Vignette-Effekt – das Foto verblasst weich zu den Rändern hin, statt hart abgeschnitten zu werden.
img {
mask-image: radial-gradient(circle, black 55%, transparent 100%);
-webkit-mask-image: radial-gradient(circle, black 55%, transparent 100%);
}
Text-Fade (Read-more-Effekt)
Ein häufiger Praxisfall: ein Textblock mit fester Höhe, der nicht hart abgeschnitten, sondern weich ausgeblendet wird – z.B. bevor ein "Weiterlesen"-Link folgt.
Überall dieselbe alte Leier. Das Layout ist fertig, der Text lässt auf sich warten. Damit das Layout nun nicht nackt im Raume steht und sich klein und leer vorkommt, springe ich ein: der Blindtext. Und damit auch jeder Buchstabe genau an seinem Platz erscheint, muss ich noch ein wenig weiterschreiben.
.text-fade {
height: 80px;
overflow: hidden;
mask-image: linear-gradient(black 40%, transparent 100%);
-webkit-mask-image: linear-gradient(black 40%, transparent 100%);
}
Hero-Fade: Bild läuft weich aus
Ein sehr typischer Einsatz für mask: Ein grosses Bild endet nicht mit einer harten Kante, sondern läuft weich in die Section-Farbe aus. Das wirkt bei Hero-Bildern, Landingpages, Portfolios oder Reisewebseiten deutlich ruhiger.
Weicher Übergang
Das Bild bleibt Teil der Gestaltung, ohne unten hart abgeschnitten zu wirken.
.hero img {
width: 100%;
display: block;
object-fit: cover;
-webkit-mask-image: linear-gradient(black 65%, transparent 100%);
mask-image: linear-gradient(black 65%, transparent 100%);
}
Gallery-Fade: Seiten weich ausblenden
Bei horizontal scrollbaren Galerien können die äusseren Bereiche weich auslaufen. So wirkt die Galerie weniger hart begrenzt und zeigt gleichzeitig: Hier geht es seitlich weiter.
.gallery {
display: flex;
gap: 16px;
overflow-x: auto;
-webkit-mask-image: linear-gradient(
to right,
transparent,
black 10%,
black 90%,
transparent
);
mask-image: linear-gradient(
to right,
transparent,
black 10%,
black 90%,
transparent
);
}
Scroll-Fade: Inhalt läuft oben und unten aus
Auch scrollbare Textbereiche profitieren von einer Maske. Statt oben und unten hart abzuschneiden, zeigt der Verlauf subtil, dass der Inhalt weitergeht.
Masken eignen sich nicht nur für Bilder. Sie können auch Layoutbereiche, Listen oder Textboxen weich ausblenden. Gerade bei begrenzter Höhe wirkt ein Verlauf natürlicher als ein harter Schnitt.
Der Inhalt bleibt scrollbar. Die Maske verändert nur die Sichtbarkeit am Rand, nicht die eigentliche Grösse des Elements.
Das ist praktisch für Teaser, Sidebars, mobile Navigationen oder kleine Panels mit mehr Inhalt als Platz.
Wichtig bleibt: Der Inhalt darf nicht nur visuell versteckt werden, wenn er für die Bedienung oder Barrierefreiheit zentral ist.
.scroll-fade {
height: 170px;
overflow: auto;
-webkit-mask-image: linear-gradient(
transparent,
black 14%,
black 86%,
transparent
);
mask-image: linear-gradient(
transparent,
black 14%,
black 86%,
transparent
);
}
mask-size
mask-size legt fest, wie gross die Maske dargestellt wird – genau wie background-size. Häufige Werte sind contain (Maske vollständig einpassen, ohne sie zu verzerren), cover (Maske füllt das Element komplett aus) oder feste Masse wie 100px 100px.
autoIntrinsische Grösse der Maske (Standard)containMaske vollständig einpassen, Seitenverhältnis bleibt erhaltencoverMaske füllt das Element komplett aus, kann dabei beschnitten werden100px 50px/50% 100%Feste Breite und Höhe
SVG oder Bild als Formmaske
.element {
mask-image: url('stern.svg');
mask-size: contain;
}
mask-repeat
mask-repeat bestimmt, ob eine kleiner bemessene Maske (über mask-size) gekachelt wiederholt wird – genau wie background-repeat. Ohne Wiederholung bleibt nur die eine Kachel übrig, der Rest des Elements wird ausgeblendet.
repeatMaske wird horizontal und vertikal wiederholt (Standard)repeat-xWiederholung nur horizontalrepeat-yWiederholung nur vertikalno-repeatMaske wird nur einmal angezeigt
.element {
mask-image: radial-gradient(circle, black 40%, transparent 41%);
mask-size: 40px 40px; /* kleine Kachel */
}
.repeat { mask-repeat: repeat; } /* Punktmuster über die ganze Fläche */
.no-repeat { mask-repeat: no-repeat; } /* nur ein Punkt oben links, Rest ausgeblendet */
Achtung: Bei no-repeat bleibt nicht etwa die restliche Fläche voll sichtbar – ausserhalb der einen Kachel gibt es keine Maskeninformation, also wird dort alles ausgeblendet.
mask-position
mask-position legt fest, wo die Maske innerhalb des Elements sitzt – genau wie background-position. Zusammen mit mask-size und mask-repeat: no-repeat lässt sich eine einzelne kleine Maske gezielt platzieren.
top/right/bottom/left/centerSchlüsselwörter, auch kombinierbar (z.B.bottom right)50% 50%Prozentwerte –0% 0%(Standard) ist oben links,50% 50%die Mitte20px 10pxFeste Längenangabenright 20px bottom 10px4-Werte-Syntax mit Kantenversatz von einer bestimmten Seite aus
.element {
mask-image: radial-gradient(circle, black 40%, transparent 41%);
mask-size: 80px 80px;
mask-repeat: no-repeat;
}
.a { mask-position: top left; }
.b { mask-position: center; }
.c { mask-position: bottom right; }
mask-clip & mask-origin
mask-clip und mask-origin gehören eng zusammen, weil beide denselben Bezugs-Kasten verwenden (Border-, Padding- oder Content-Box) – nur für unterschiedliche Zwecke: mask-clip begrenzt die Sichtbarkeit der Maske, mask-origin legt den Nullpunkt für mask-position fest. Beide funktionieren analog zu background-clip und background-origin.
mask-clip
Bei mask-clip: content-box wird alles ausserhalb des Inhalts abgeschnitten – unabhängig davon, was der Gradient eigentlich vorsieht.
border-boxMaske bezieht sich auf Inhalt, Padding und Border (Standard)padding-boxMaske bezieht sich auf Inhalt und Paddingcontent-boxMaske bezieht sich nur auf den Inhaltsbereich
.box {
padding: 20px;
border: 15px dashed rgba(0, 0, 0, 0.4);
mask-image: radial-gradient(circle, black 60%, transparent 100%);
}
.border-box { mask-clip: border-box; } /* Maske reicht bis unter den Border */
.content-box { mask-clip: content-box; } /* Border & Padding komplett ausgeblendet */
mask-origin
mask-origin legt fest, von wo aus mask-position gezählt wird – der Standardwert ist hier allerdings border-box, nicht padding-box wie bei background-origin.
border-boxZählung ab der Aussenkante des Borders (Standard)padding-boxZählung ab der Innenkante des Borderscontent-boxZählung ab der Innenkante des Paddings
.box {
padding: 20px;
border: 15px dashed rgba(0, 0, 0, 0.4);
mask-image: radial-gradient(circle, black 40%, transparent 41%);
mask-size: 40px 40px;
mask-repeat: no-repeat;
mask-position: top left; /* immer "oben links" - aber wo genau? */
}
.a { mask-origin: border-box; } /* oben links der Border-Aussenkante */
.b { mask-origin: content-box; } /* oben links des Inhalts, spürbar weiter innen */
Bei border-box sitzt der Kreis direkt in der Ecke des Borders, bei content-box rutscht er sichtbar weiter nach innen – gleiche mask-position, unterschiedlicher Nullpunkt.
mask-mode
mask-mode legt fest, ob die Maske anhand ihrer Helligkeit (luminance) oder ihres Alphakanals (alpha) ausgewertet wird. Relevant wird der Unterschied erst, wenn die Maske Transparenz oder unterschiedliche Helligkeiten enthält.
luminanceHelligkeit der Maske entscheidet über die Deckkraft (Standard)alphaNur der Transparenzgrad (Alphakanal) der Maske entscheidet über die Deckkraft
.element {
mask-image: linear-gradient(black, white); /* beide Farben 100% opak */
}
.luminance { mask-mode: luminance; } /* schwarz = unsichtbar, weiss = sichtbar */
.alpha { mask-mode: alpha; } /* Alpha ist bei beiden Farben 100% -> keine Wirkung! */
Der Haken: Bei alpha bleibt die Box komplett sichtbar, weil Schwarz und Weiss beide voll deckend sind (Alpha = 100%) – nur ein Verlauf mit echter Transparenz (z.B. black, transparent) hätte im Alpha-Modus einen Effekt.
mask-composite
Wie bei background lassen sich mehrere Masken kommagetrennt als Ebenen übereinanderlegen – jede mit eigener Grösse, Position und Wiederholung. Mit mask-composite lassen sich diese Ebenen miteinander verrechnen – z.B. um aus zwei Kreisen ein Loch auszuschneiden (wie bei einer Brille).
addMasken werden addiert (Standard)subtractZweite Maske wird von der ersten abgezogenintersectNur der gemeinsame Bereich bleibt sichtbarexcludeNur der nicht-überlappende Bereich bleibt sichtbar
.element {
mask-image:
radial-gradient(circle at 35% 50%, black 40%, transparent 41%),
radial-gradient(circle at 65% 50%, black 40%, transparent 41%);
mask-composite: exclude; /* Standard-Syntax */
-webkit-mask-composite: destination-out; /* Safari-Syntax, andere Werte! */
}
Achtung: Die Werte von -webkit-mask-composite (z.B. destination-out) folgen einer älteren Syntax und stimmen nicht mit mask-composite überein – beide Zeilen sind nötig, aber mit unterschiedlichen Werten.
Selten gebraucht: mask-border ist das Pendant zu border-image, nur für Masken am Rand eines Elements. Und das SVG-<mask>-Element ist eine zweite, unabhängige Möglichkeit, Masken zu definieren – direkt in SVG statt in CSS, referenziert über mask: url(#meine-maske). Für die allermeisten Anwendungsfälle reicht aber mask-image aus dieser Lektion völlig.
Browser-Kompatibilität
- mask-image mit Gradients/Bildern – Alle modernen Browser
- Safari – benötigt weiterhin
-webkit-mask-*zusätzlich zu den unpräfixten Eigenschaften - mask-composite – Safari nutzt eine andere Werte-Syntax über
-webkit-mask-composite
Cheat Sheet
mask-imageGradient, Bild oder SVG als Maskemask-sizeGrösse der Maskemask-repeatWiederholung der Maskemask-positionPosition der Maskemask-clipSichtbaren Bereich begrenzenmask-originBezugspunkt fürmask-positionmask-modeluminanceoderalphamask-compositeMehrere Masken verrechnen-webkit-mask-*Safari-Präfix
Kurz gesagt
maskblendet Teile eines Elements hart oder weich aus.- Im Unterschied zu
clip-patherlaubtmaskweiche Übergänge über Gradients, Bilder oder SVG. - Schwarz/transparent blendet aus, Weiss/opak zeigt an – dazwischen wird teiltransparent.
- Klassische Einsätze: Hero-Fades, Gallery-Fades, Text-Fade-Effekte, Foto-Vignetten und weiche Bildränder.
mask-size,mask-repeatundmask-positionsteuern Grösse, Wiederholung und Position der Maske.mask-origin(Bezugspunkt fürmask-position) ist standardmässigborder-box– anders als beibackground-origin, wopadding-boxStandard ist.mask-mode: alphawirkt nur bei Masken mit echter Transparenz – bei voll deckenden Farben passiert nichts.mask-compositeverrechnet mehrere Masken (add, subtract, intersect, exclude).- Safari braucht weiterhin
-webkit-mask-*zusätzlich – beimask-compositesogar mit anderer Werte-Syntax.
Für harte, geometrische Formen ist clip-path die passende CSS-Eigenschaft.