Glass
<r-glass>APITokens de estiloPrueba interactivaCódigo fuente
Una superficie de vidrio líquido. Elige un material y el panel está listo: esmerila lo que tiene detrás, lo curva en un borde redondeado como lo haría una lente, separa ligeramente los colores en el filo e ilumina el borde. Cualquier valor suelto se puede sobrescribir con un atributo del mismo nombre. El contenido va en el slot por defecto y toma un color de tinta legible sobre el vidrio.
Úsalo cuando un panel quede sobre contenido rico y colorido: una tarjeta destacada, una barra de herramientas flotante, una capa sobre un vídeo. Sobre un fondo plano no hay nada que curvar y el efecto desaparece.
Campo de pruebas
Arrastra el vidrio, cambia el material y el fondo, y copia el marcado. El fragmento solo lleva lo que difiere del material.
<r-glass style="width:340px">
…
</r-glass><r-glass material="clear" backdrop>
<div class="panel">…</div>
</r-glass>Materiales
Cuatro materiales cubren la mayoría de los usos. regular es el predeterminado.
<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 |
Sobre una imagen
Añade backdrop cuando el vidrio esté sobre un <img> o un <video>. Sin valor usa la primera imagen o vídeo del padre del vidrio; un selector nombra otro. El vidrio lee entonces los píxeles de ese elemento con WebGL2 y refracta cada longitud de onda en su propia medida, en cualquier motor con WebGL2, mientras que la vía CSS solo curva la luz en Chromium. La imagen sigue en la página, así que su texto alternativo y el contenido de alrededor no cambian.
<div class="hero">
<img src="hero.jpg" alt="…" />
<r-glass material="clear" backdrop rim>…</r-glass>
</div>Una imagen de otro origen necesita crossorigin y una respuesta CORS para poder leerse; si no, el vidrio conserva su esmerilado CSS.
Tono y tinta
tone indica qué hay detrás del vidrio. Sobre un fondo oscuro o colorido el borde se ilumina y el contenido es blanco; sobre uno claro un borde blanco desaparece, así que el borde se sombrea y el contenido pasa a ser oscuro. Sobre una imagen backdrop el tono sigue el brillo de la zona cubierta, salvo que lo fijes. El tono en vigor está disponible como :state(light) y :state(dark), y --ran-glass-ink sustituye el color del contenido.
r-glass:state(light) .badge {
border-color: rgb(0 0 0 / 0.2);
}Anidamiento
<r-glass> se compone: anida uno dentro de otro para tener materiales en capas, como una barra de herramientas de vidrio sobre un panel de vidrio. Cada capa curva lo que tiene detrás.
<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>Referencia de la API
Propiedades
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
material |
string |
regular |
thin, regular, thick o clear: fija de una vez todos los valores ópticos de abajo. |
blur |
number |
del material | Radio del esmerilado, en px. |
saturate |
number |
del material | Saturación de lo que hay detrás, en porcentaje. |
displace |
number |
del material | Cuánto tira el borde del fondo hacia dentro, en px. 0 es un cristal plano. |
bevel |
number |
del material | Ancho de la franja curva del borde que desvía la luz, en px. |
dispersion |
number |
del material | Cuánto se separan los colores en el borde, como porcentaje de displace. |
specular |
number |
del material | Intensidad de los brillos, en porcentaje. |
radius |
number |
20 |
Radio de las esquinas, en px. |
tint |
string |
del material | Relleno sobre el esmerilado: cualquier valor CSS de fondo. |
tone |
string |
dark |
dark o light: qué hay detrás del vidrio. Sin fijar sobre un backdrop, sigue a la imagen. |
backdrop |
string |
— | Refracta un <img> o <video> con WebGL2. Vacío usa el primero del padre; un selector nombra otro. |
rim |
boolean |
false |
Un borde iluminado por GPU: paredes exterior e interior, una luz principal y una de relleno, destellos. Solo depende de la forma del panel. |
sheen |
boolean |
false |
Un brillo que barre la superficie. |
interactive |
boolean |
false |
Elevación al pasar el cursor y respuesta al pulsar, para vidrio clicable. También convierte el host en un botón operable con teclado: role="button", una parada de tabulación, Enter y Espacio actúan como un clic. |
Refracción displace
displace fija cuánto tira el borde de lo que hay detrás hacia el centro, de modo que el fondo justo dentro del filo se estira sobre él, igual que aumenta un borde convexo grueso. bevel fija el ancho de esa franja curva. Por encima de la mitad del bevel, el borde vuelve a plegar la imagen sobre sí misma, como hace el filo de un vidrio grueso real.
<r-glass material="clear" displace="0">…flat…</r-glass> <r-glass material="clear" displace="40">…lensed edge…</r-glass>Brillo e interacción
sheen añade un brillo en movimiento; interactive añade una elevación al pasar el cursor y una pulsación que vuelve a su sitio sin rebote.
<r-glass sheen interactive>
<div>Hover & press me</div>
</r-glass>Rim — filo especular por GPU (opcional)
rim dibuja el borde en la GPU: una pared exterior brillante y una interior más tenue donde el bevel se une con la cara plana, iluminadas por una luz principal desde arriba a la izquierda y un relleno tenue desde abajo a la derecha, con un grosor que varía a lo largo del borde y destellos ocasionales. Con un tono light las paredes se sombrean en su lugar. Nunca muestrea el fondo: el shader solo conoce el tamaño, el radio y el bevel del panel. Se dibuja primero con WebGL, pasa a WebGPU en segundo plano cuando el navegador lo tiene y deja intacto el brillo CSS cuando no hay ninguno de los dos.
<r-glass>…CSS highlight…</r-glass> <r-glass rim>…GPU-lit edge…</r-glass>Parts y tokens CSS
Da estilo al interior con ::part(glass), ::part(specular), ::part(refraction) y, cuando rim está activo, ::part(rim), o sobrescribe las propiedades personalizadas --ran-glass-*:
| Token | Para qué sirve |
|---|---|
--ran-glass-ink |
Color del contenido. Blanco por defecto, o casi negro en un tono claro. |
--ran-glass-tint |
Relleno sobre el esmerilado. |
--ran-glass-border |
Borde del filo. |
--ran-glass-shadow |
Pila de sombras (especular y profundidad). |
--ran-glass-brightness |
Brillo de lo que hay detrás. |
--ran-glass-specular-background |
Fondo del brillo CSS. |
--ran-glass-specular-opacity |
Intensidad del brillo CSS; sustituye a specular en esa capa. |
--ran-glass-reduced-transparency-background |
Superficie de respaldo cuando el ajuste del sistema «reducir transparencia» está activo. |
--ran-glass-reduced-transparency-shadow |
Sombra de respaldo en ese mismo estado. |
r-glass {
--ran-glass-tint: linear-gradient(135deg, rgb(0 0 0 / 0.2), transparent);
}Notas
- Dos vías. Sin
backdrop,backdrop-filteresmerila la página real que hay detrás del vidrio, así que el texto, el vídeo y los controles de detrás siguen funcionando; el borde de lente con colores separados es un filtro SVG que se dibuja en Chromium, y Safari y Firefox conservan el esmerilado. Conbackdrop, WebGL2 refracta esa única imagen o vídeo en cualquier motor que tenga WebGL2. - Legibilidad. El contenido toma
--ran-glass-ink. Mantén el texto largo sobre una superficie interior opaca en lugar de confiar el contraste al vidrio. - Transparencia reducida. Con el ajuste del sistema «reducir transparencia» o «aumentar contraste» (
prefers-reduced-transparency: reduce), el vidrio pasa a ser una superficie sólida que sigue el tema (--ran-color-bg-elevated), sin esmerilado, refracción ni brillos. - Movimiento. La superficie solo transiciona
transform, así que un cambio de tema se resuelve en un fotograma. El brillo y la pulsación respetanprefers-reduced-motion. - Coste. El mapa de lente SVG se reconstruye cuando cambian el tamaño, el radio o el bevel del panel. La refracción WebGL comprueba el panel y la imagen una vez por fotograma mientras está visible y solo dibuja cuando alguno de los dos se ha movido.
Prueba interactiva