Glass
<r-glass>APIStyle-TokensSpielwieseQuellcode
Eine flüssige Glasfläche. Wähle ein material, und die Scheibe ist fertig: Sie mattiert, was dahinter liegt, bricht es an einem gekrümmten Rand wie eine Linse, trennt die Farben am Rand leicht auf und beleuchtet die Kante. Jeder einzelne Wert lässt sich mit einem gleichnamigen Attribut überschreiben. Der Inhalt kommt in den Default-Slot und erhält eine Farbe, die auf dem Glas lesbar ist.
Einsetzen, wenn eine Fläche über reichem, farbigem Inhalt liegt: eine Hero-Karte, eine schwebende Werkzeugleiste, eine Ebene über Medien. Über einem flachen Hintergrund gibt es nichts zu brechen, und der Effekt verschwindet.
Spielwiese
Zieh das Glas, wechsle Material und Hintergrund und kopiere das Markup. Der Ausschnitt enthält nur, was vom Material abweicht.
<r-glass style="width:340px">
…
</r-glass><r-glass material="clear" backdrop>
<div class="panel">…</div>
</r-glass>Materialien
Vier Materialien decken die meisten Fälle ab. regular ist der Standard.
<r-glass material="thin">…</r-glass>
<r-glass>…regular…</r-glass>
<r-glass material="thick">…</r-glass>
<r-glass material="clear">…</r-glass>| Material | blur |
saturate |
displace |
bevel |
dispersion |
specular |
|---|---|---|---|---|---|---|
thin |
8 | 160 | 12 | 20 | 20 | 80 |
regular |
16 | 180 | 18 | 28 | 25 | 100 |
thick |
28 | 200 | 22 | 32 | 25 | 100 |
clear |
2 | 130 | 28 | 40 | 40 | 120 |
Über einem Bild
Füge backdrop hinzu, wenn das Glas über einem <img> oder <video> liegt. Ohne Wert nimmt es das erste Bild oder Video im Elternelement des Glases; ein Selektor benennt ein anderes. Das Glas liest dann die Pixel dieses Elements mit WebGL2 und bricht jede Wellenlänge um ihren eigenen Betrag, in jeder Engine mit WebGL2, während der CSS-Weg Licht nur in Chromium bricht. Das Bild bleibt in der Seite, sodass sein Alt-Text und der umgebende Inhalt unverändert bleiben.
<div class="hero">
<img src="hero.jpg" alt="…" />
<r-glass material="clear" backdrop rim>…</r-glass>
</div>Ein Bild von einem anderen Origin braucht crossorigin und eine CORS-Antwort, um lesbar zu sein; sonst behält das Glas seine CSS-Mattierung.
Ton und Tinte
tone sagt, was hinter dem Glas liegt. Auf dunklem oder farbigem Hintergrund wird der Rand beleuchtet und der Inhalt ist weiß; auf hellem verschwindet ein weißer Rand, also wird der Rand abgedunkelt und der Inhalt dunkel. Über einem backdrop-Bild folgt der Ton der Helligkeit der verdeckten Fläche, sofern du ihn nicht setzt. Der aktive Ton steht als :state(light) und :state(dark) zur Verfügung, und --ran-glass-ink überschreibt die Inhaltsfarbe.
r-glass:state(light) .badge {
border-color: rgb(0 0 0 / 0.2);
}Verschachtelung
<r-glass> lässt sich kombinieren: Verschachtle eines im anderen für geschichtete Materialien, etwa eine Glas-Werkzeugleiste auf einem Glas-Panel. Jede Ebene bricht, was hinter ihr liegt.
<r-glass radius="28">
<div class="panel">
Outer panel
<r-glass material="thin" radius="16">
<div class="toolbar">Nested glass toolbar</div>
</r-glass>
</div>
</r-glass>API-Referenz
Eigenschaften
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
material |
string |
regular |
thin, regular, thick oder clear: setzt alle optischen Werte darunter auf einmal. |
blur |
number |
vom Material | Mattierungsradius, in px. |
saturate |
number |
vom Material | Sättigung dessen, was dahinter liegt, in Prozent. |
displace |
number |
vom Material | Wie weit der Rand den Hintergrund nach innen zieht, in px. 0 ist eine flache Scheibe. |
bevel |
number |
vom Material | Breite des gekrümmten Randbands, das Licht bricht, in px. |
dispersion |
number |
vom Material | Wie weit sich die Farben am Rand auftrennen, in Prozent von displace. |
specular |
number |
vom Material | Stärke der Glanzlichter, in Prozent. |
radius |
number |
20 |
Eckenradius, in px. |
tint |
string |
vom Material | Füllung über der Mattierung: ein beliebiger CSS-Hintergrundwert. |
tone |
string |
dark |
dark oder light: was hinter dem Glas liegt. Über einem backdrop ungesetzt, folgt es dem Bild. |
backdrop |
string |
— | Bricht ein <img> oder <video> mit WebGL2. Leer nimmt das erste im Elternelement; ein Selektor benennt ein anderes. |
rim |
boolean |
false |
Ein per GPU beleuchteter Rand: Außen- und Innenwand, Haupt- und Fülllicht, Glitzer. Hängt nur von der Form der Fläche ab. |
sheen |
boolean |
false |
Ein Glanzlicht, das über die Oberfläche streicht. |
interactive |
boolean |
false |
Anheben beim Hover und Rückmeldung beim Drücken, für klickbares Glas. Macht den Host außerdem zu einem per Tastatur bedienbaren Button: role="button", ein Tab-Stopp, Enter und Leertaste wirken wie ein Klick. |
Brechung displace
displace legt fest, wie weit der Rand das Dahinterliegende zur Mitte zieht, sodass der Hintergrund direkt innerhalb des Rands über ihn gedehnt wird, so wie ein dicker konvexer Rand vergrößert. bevel legt fest, wie breit dieses gekrümmte Band ist. Oberhalb der halben Bevel-Breite faltet der Rand das Bild auf sich selbst zurück, wie es der Rand echten dicken Glases tut.
<r-glass material="clear" displace="0">…flat…</r-glass> <r-glass material="clear" displace="40">…lensed edge…</r-glass>Schimmer und Interaktion
sheen fügt ein wanderndes Glanzlicht hinzu; interactive fügt ein Anheben beim Hover und ein Drücken, das ohne Nachfedern zurückkehrt hinzu.
<r-glass sheen interactive>
<div>Hover & press me</div>
</r-glass>Rim — spekulare GPU-Kante (optional)
rim zeichnet den Rand auf der GPU: eine helle Außenwand und eine schwächere Innenwand dort, wo der Bevel auf die flache Fläche trifft, beleuchtet von einem Hauptlicht von oben links und einem schwachen Fülllicht von unten rechts, mit einer Dicke, die entlang des Rands variiert, und gelegentlichem Glitzern. Bei light-Ton werden die Wände stattdessen abgedunkelt. Den Hintergrund tastet es nie ab: Der Shader kennt nur Größe, Radius und Bevel der Fläche. Es rendert zuerst mit WebGL, wechselt im Hintergrund zu WebGPU, wenn der Browser es hat, und lässt das CSS-Glanzlicht unangetastet, wenn keins von beiden verfügbar ist.
<r-glass>…CSS highlight…</r-glass> <r-glass rim>…GPU-lit edge…</r-glass>CSS-Parts und Tokens
Gestalte das Innere mit ::part(glass), ::part(specular), ::part(refraction) und, wenn rim gesetzt ist, ::part(rim), oder überschreibe die Custom Properties --ran-glass-*:
| Token | Wofür |
|---|---|
--ran-glass-ink |
Inhaltsfarbe. Standardmäßig Weiß, auf hellem Ton nahezu Schwarz. |
--ran-glass-tint |
Füllung über der Mattierung. |
--ran-glass-border |
Randlinie. |
--ran-glass-shadow |
Schattenstapel (Glanz und Tiefe). |
--ran-glass-brightness |
Helligkeit dessen, was dahinter liegt. |
--ran-glass-specular-background |
Hintergrund des CSS-Glanzlichts. |
--ran-glass-specular-opacity |
Stärke des CSS-Glanzlichts; überschreibt specular für diese Ebene. |
--ran-glass-reduced-transparency-background |
Ersatzfläche, wenn die Systemeinstellung „Transparenz reduzieren“ aktiv ist. |
--ran-glass-reduced-transparency-shadow |
Ersatzschatten im selben Zustand. |
r-glass {
--ran-glass-tint: linear-gradient(135deg, rgb(0 0 0 / 0.2), transparent);
}Hinweise
- Zwei Wege. Ohne
backdropmattiertbackdrop-filterdie echte Seite hinter dem Glas, sodass Text, Video und Bedienelemente dahinter weiter funktionieren; der linsenförmige, farbgetrennte Rand ist ein SVG-Filter, der in Chromium rendert, Safari und Firefox behalten die Mattierung. Mitbackdropbricht WebGL2 dieses eine Bild oder Video in jeder Engine, die WebGL2 hat. - Lesbarkeit. Der Inhalt nimmt
--ran-glass-ink. Halte langen Text auf einer deckenden inneren Fläche, statt dich für den Kontrast auf das Glas zu verlassen. - Reduzierte Transparenz. Unter der Systemeinstellung „Transparenz reduzieren“ oder „Kontrast erhöhen“ (
prefers-reduced-transparency: reduce) wird das Glas zu einer deckenden, themenbewussten Fläche (--ran-color-bg-elevated), ohne Mattierung, Brechung oder Glanzlichter. - Bewegung. Die Fläche animiert nur
transform, sodass ein Themenwechsel in einem Bild erledigt ist. Schimmer und Drücken achten aufprefers-reduced-motion. - Kosten. Die SVG-Linsenkarte wird neu erzeugt, wenn sich Größe, Radius oder Bevel der Fläche ändern. Die WebGL-Brechung prüft Fläche und Bild einmal pro Frame, solange sie sichtbar ist, und zeichnet nur, wenn sich eines davon bewegt hat.
Spielwiese