Glass
<r-glass>APITokens de estiloÁrea de testesCódigo-fonte
Uma superfície de vidro líquido. Escolha um material e o painel está pronto: ele fosca o que está atrás, curva isso numa borda arredondada como faz uma lente, separa levemente as cores na beirada e ilumina a borda. Qualquer valor isolado pode ser sobrescrito por um atributo de mesmo nome. O conteúdo vai no slot padrão e recebe uma cor de tinta legível sobre o vidro.
Use quando um painel fica sobre conteúdo rico e colorido: um cartão de destaque, uma barra de ferramentas flutuante, uma camada sobre mídia. Sobre um fundo liso não há nada para curvar e o efeito desaparece.
Playground
Arraste o vidro, troque o material e o fundo e copie a marcação. O trecho só traz o que difere do material.
<r-glass style="width:340px">
…
</r-glass><r-glass material="clear" backdrop>
<div class="panel">…</div>
</r-glass>Materiais
Quatro materiais cobrem a maioria dos usos. regular é o padrão.
<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 uma imagem
Adicione backdrop quando o vidro estiver sobre um <img> ou <video>. Sem valor, ele usa a primeira imagem ou vídeo do pai do vidro; um seletor aponta outro. O vidro então lê os pixels desse elemento com WebGL2 e refrata cada comprimento de onda na sua própria medida, em qualquer motor com WebGL2, enquanto o caminho CSS só curva a luz no Chromium. A imagem continua na página, então o texto alternativo e o conteúdo ao redor não mudam.
<div class="hero">
<img src="hero.jpg" alt="…" />
<r-glass material="clear" backdrop rim>…</r-glass>
</div>Uma imagem de outra origem precisa de crossorigin e de uma resposta CORS para ser lida; caso contrário, o vidro mantém o fosco CSS.
Tom e tinta
tone diz o que está atrás do vidro. Sobre um fundo escuro ou colorido, a borda é iluminada e o conteúdo é branco; sobre um claro, uma borda branca some, então a borda é sombreada e o conteúdo fica escuro. Sobre uma imagem backdrop, o tom acompanha o brilho da área coberta, a menos que você o defina. O tom em vigor está disponível como :state(light) e :state(dark), e --ran-glass-ink substitui a cor do conteúdo.
r-glass:state(light) .badge {
border-color: rgb(0 0 0 / 0.2);
}Aninhamento
O <r-glass> se compõe: aninhe um dentro do outro para ter materiais em camadas, como uma barra de ferramentas de vidro sobre um painel de vidro. Cada camada curva o que está atrás dela.
<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>Referência da API
Propriedades
| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
material |
string |
regular |
thin, regular, thick ou clear: define de uma vez todos os valores ópticos abaixo. |
blur |
number |
do material | Raio do fosco, em px. |
saturate |
number |
do material | Saturação do que está atrás, em porcentagem. |
displace |
number |
do material | Quanto a borda puxa o fundo para dentro, em px. 0 é uma chapa plana. |
bevel |
number |
do material | Largura da faixa curva da borda que desvia a luz, em px. |
dispersion |
number |
do material | Quanto as cores se separam na borda, como porcentagem de displace. |
specular |
number |
do material | Intensidade dos brilhos, em porcentagem. |
radius |
number |
20 |
Raio dos cantos, em px. |
tint |
string |
do material | Preenchimento sobre o fosco: qualquer valor CSS de fundo. |
tone |
string |
dark |
dark ou light: o que está atrás do vidro. Sem definir sobre um backdrop, acompanha a imagem. |
backdrop |
string |
— | Refrata um <img> ou <video> com WebGL2. Vazio usa o primeiro do pai; um seletor aponta outro. |
rim |
boolean |
false |
Uma borda iluminada por GPU: paredes externa e interna, uma luz principal e uma de preenchimento, reflexos. Depende só da forma do painel. |
sheen |
boolean |
false |
Um brilho que varre a superfície. |
interactive |
boolean |
false |
Elevação ao passar o cursor e retorno ao pressionar, para vidro clicável. Também transforma o host num botão operável pelo teclado: role="button", uma parada de tabulação, Enter e Espaço agem como um clique. |
Refração displace
displace define quanto a borda puxa o que está atrás em direção ao centro, de modo que o fundo logo dentro da beirada se estica sobre ela, como uma borda convexa grossa amplia. bevel define a largura dessa faixa curva. Acima da metade do bevel, a borda dobra a imagem de volta sobre si mesma, como faz a beirada de um vidro grosso de verdade.
<r-glass material="clear" displace="0">…flat…</r-glass> <r-glass material="clear" displace="40">…lensed edge…</r-glass>Brilho e interação
sheen adiciona um brilho em movimento; interactive adiciona uma elevação ao passar o cursor e um pressionar que volta ao lugar sem ressalto.
<r-glass sheen interactive>
<div>Hover & press me</div>
</r-glass>Rim — borda especular por GPU (opcional)
rim desenha a borda na GPU: uma parede externa brilhante e uma interna mais fraca onde o bevel encontra a face plana, iluminadas por uma luz principal vinda do canto superior esquerdo e um preenchimento fraco vindo do inferior direito, com espessura que varia ao longo da borda e reflexos ocasionais. Num tom light, as paredes são sombreadas em vez disso. Nunca amostra o fundo: o shader só conhece o tamanho, o raio e o bevel do painel. Renderiza primeiro em WebGL, passa para WebGPU em segundo plano quando o navegador tem suporte e deixa o brilho CSS como está quando nenhum dos dois existe.
<r-glass>…CSS highlight…</r-glass> <r-glass rim>…GPU-lit edge…</r-glass>Parts e tokens CSS
Estilize o interior com ::part(glass), ::part(specular), ::part(refraction) e, quando rim está ativo, ::part(rim), ou sobrescreva as propriedades personalizadas --ran-glass-*:
| Token | Para que serve |
|---|---|
--ran-glass-ink |
Cor do conteúdo. Branco por padrão, ou quase preto num tom claro. |
--ran-glass-tint |
Preenchimento sobre o fosco. |
--ran-glass-border |
Contorno da borda. |
--ran-glass-shadow |
Pilha de sombras (especular e profundidade). |
--ran-glass-brightness |
Brilho do que está atrás. |
--ran-glass-specular-background |
Fundo do brilho CSS. |
--ran-glass-specular-opacity |
Intensidade do brilho CSS; substitui specular nessa camada. |
--ran-glass-reduced-transparency-background |
Superfície alternativa quando a opção de sistema "reduzir transparência" está ativa. |
--ran-glass-reduced-transparency-shadow |
Sombra alternativa nesse mesmo estado. |
r-glass {
--ran-glass-tint: linear-gradient(135deg, rgb(0 0 0 / 0.2), transparent);
}Notas
- Dois caminhos. Sem
backdrop, obackdrop-filterfosca a página real atrás do vidro, então texto, vídeo e controles atrás dele continuam funcionando; a borda de lente com cores separadas é um filtro SVG que renderiza no Chromium, e Safari e Firefox mantêm o fosco. Combackdrop, o WebGL2 refrata aquela única imagem ou vídeo em qualquer motor que tenha WebGL2. - Legibilidade. O conteúdo recebe
--ran-glass-ink. Mantenha textos longos sobre uma superfície interna opaca em vez de deixar o contraste por conta do vidro. - Transparência reduzida. Com a opção de sistema "reduzir transparência" ou "aumentar contraste" (
prefers-reduced-transparency: reduce), o vidro vira uma superfície sólida que acompanha o tema (--ran-color-bg-elevated), sem fosco, refração nem brilhos. - Movimento. A superfície só faz transição de
transform, então uma troca de tema se resolve em um quadro. O brilho e o pressionar respeitamprefers-reduced-motion. - Custo. O mapa de lente SVG é refeito quando o tamanho, o raio ou o bevel do painel mudam. A refração WebGL verifica o painel e a imagem uma vez por quadro enquanto está visível e só desenha quando um deles se moveu.
Área de testes