CSS mask-image – Bilder maskieren

CSS mask-image maskiert Elemente anhand von Bildern oder Verläufen (gradient) frei. Das Originalbild bleibt erhalten, denn CSS mask-image ist »nicht-destruktiv« und die Maske oder Schablone kann jederzeit per CSS geändert – und auch animiert – werden.

CSS mask

Motive mit weichem Rand einbinden

CSS mask-image arbeitet mit einer Schablone, die als PNG, PNG-24, WebP oder SVG gespeichert wird, aber auch ein CSS-Verlauf kann die Rolle der Maske übernehmen. Nur unter den opakten Bereichen der Maske wird das maskierte Element sichtbar.

mask-spieluhr-460 + maske-spieluhr = mask-spieluhr-460
.soft {
	mask-image: url("maske.webp");
	mask-repeat: no-repeat;
	mask-size: 100% 100%;
}

Heute können wir anstelle von PNG24-Freistellern das sparsame WebP für die Schablone einsetzen. Die Farbe der Maske / Schablone spielt keine Rolle, nur die Deckkraft zählt.

mask-image animieren

Macht das WebP-Dateiformat für Bilder CSS mask-image nicht überflüssig? Im Grunde genommen – ja. WebP speichert eine Alpha-Maske mit weichen und harten Übergängen effizienter als das volle Bild zzgl. Maske.

mask-spieluhr-460
Volles Bild 7KB
maske-spieluhr
Maske 6KB
mask-spieluhr-freigestellt-460
WebP mit integrierter Maske 11KB

Allerdings bringt mask-image bringt Animationen in die Maske – hier ändert animiert CSS die Maske.

<div class="pattern"></div>
.pattern {
	background: url('katz.webp');
	mask-image: url('circle-mask.svg');
	mask-repeat: no-repeat;
}
<svg width="100%" height="100%" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
<radialGradient id="c1" cx="0.5" cy="0.5" r="0.5">
    <stop offset="0" stop-color="hsla(0,0%,0%,1)" />
    <stop offset=".8" stop-color="hsla(0,0%,0%,0.5)" />
    <stop offset="1" stop-color="hsla(0,0%,0%,0)" />
</radialGradient>
<style>
circle {
	animation: grow 10s infinite;
	transform-origin: center center;
}

@keyframes grow {
	from {transform: scale(1) }
	to {transform: scale(4) }
}
</style>
<circle cx="250" cy="250" r="50" style="fill:url(#c1)"/>
</svg>

mask-image mit CSS gradient

Als Maske kann anstelle eines Bildes ein Verlauf – linear Gradient – eingesetzt werden. Bei Chrome wirkt aber allem Anschein nach nur -webkit-mask: …, während Safari und Firefox auch ohne Präfix mitmachen.

mask-image mit CSS gradient
<img class="lg" loading="lazy" src="spieluhr-920.webp"
	srcset="spieluhr-460.webp 460w,
			spieluhr-920.webp 920w"
	sizes="(max-width: 460px) 100vw, 920px"
	width="920" height="771" alt="mask-image mit CSS gradient">
.lg {
    mask: linear-gradient( to top, transparent 5%, black 20%, black 80%, transparent 90%);
    -webkit-mask: linear-gradient( to top, transparent 5%, black 20%, black 80%, transparent 90%);
}

Text-Masken für Bilder

Text kann ebenfalls als Maske verwendet werden – das Verfahren nutzt CSS background-clip.

.tmask {
	font-size: clamp(8rem, 16vw, 16rem);
	background: url(spieluhr.webp);
	background-clip: text;
	color: transparent;
}
ROBIN

Am Rande: Schriftgröße mit vw an den ViewPort anpassen oder Schriftgröße mit CSS clamp anpassen

Text maskieren

So ziemlich alle HTML-Elemente können mit CSS mask-image maskiert werden – Text genauso wie das Video.

Auf Browser, die mask nicht unterstützen, wirken sich die Masken nicht aus: Bilder und Videos werden weiterhin angezeigt, wenn auch ohne Alphamaske.

Suchen auf mediaevent.de