Glass
<r-glass>APIスタイルトークンプレイグラウンドソース
液状のガラス面です。material を選べばガラスは完成します。背後にあるものをすりガラス状にぼかし、湾曲した縁でレンズのようにそれを曲げ、縁でわずかに色を分け、縁を照らします。個々の値は同じ名前の属性で上書きできます。コンテンツはデフォルトスロットに入れ、ガラスの上で読みやすい色が付きます。
こんなときに:色や情報の豊かなコンテンツの上にパネルを置くとき(ヒーローカード、フローティングツールバー、メディアのオーバーレイなど)。平坦な背景の上では曲げるものがないため、効果は見えなくなります。
プレイグラウンド
ガラスをドラッグし、マテリアルと背景を切り替えて、マークアップをコピーできます。スニペットにはマテリアルと異なる値だけが含まれます。
<r-glass style="width:340px">
…
</r-glass><r-glass material="clear" backdrop>
<div class="panel">…</div>
</r-glass>マテリアル
ほとんどの用途は 4 つのマテリアルでまかなえます。既定は regular です。
<r-glass material="thin">…</r-glass>
<r-glass>…regular…</r-glass>
<r-glass material="thick">…</r-glass>
<r-glass material="clear">…</r-glass>| マテリアル | 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 |
画像の上に置く
ガラスを <img> や <video> の上に置くときは backdrop を付けます。値がなければガラスの親要素にある最初の画像または動画を使い、セレクターを書けば別の要素を指定できます。するとガラスはその要素のピクセルを WebGL2 で読み取り、波長ごとに異なる量で屈折させます。CSS の経路で光が曲がるのは Chromium だけですが、こちらは WebGL2 を持つすべてのエンジンで動きます。画像はページに残るので、alt テキストや周囲のコンテンツは変わりません。
<div class="hero">
<img src="hero.jpg" alt="…" />
<r-glass material="clear" backdrop rim>…</r-glass>
</div>クロスオリジンの画像を読み取るには crossorigin と CORS レスポンスが必要です。そうでなければ、ガラスは CSS のすりガラスのままです。
トーンとインク
tone はガラスの背後に何があるかを表します。暗い背景や色の濃い背景では縁が照らされ、コンテンツは白になります。明るい背景では白い縁が見えなくなるため、縁には陰が付き、コンテンツは暗い色になります。backdrop 画像の上では、指定しない限りトーンは覆っている領域の明るさに従います。現在のトーンは :state(light) と :state(dark) で取得でき、--ran-glass-ink でコンテンツの色を上書きできます。
r-glass:state(light) .badge {
border-color: rgb(0 0 0 / 0.2);
}入れ子
<r-glass> は組み合わせられます。ガラスのパネルの上にガラスのツールバーを置くように、入れ子にすれば重なったマテリアルになります。どの層も自分の背後にあるものを曲げます。
<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 リファレンス
プロパティ
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
material |
string |
regular |
thin、regular、thick、clear のいずれか。以下の光学値をまとめて設定します。 |
blur |
number |
マテリアル依存 | すりガラスのぼかし半径(px)。 |
saturate |
number |
マテリアル依存 | 背後にあるものの彩度(パーセント)。 |
displace |
number |
マテリアル依存 | 縁が背景を内側へ引き込む距離(px)。0 は平らな板です。 |
bevel |
number |
マテリアル依存 | 光を曲げる湾曲した縁の帯の幅(px)。 |
dispersion |
number |
マテリアル依存 | 縁での色の分かれ具合。displace に対するパーセント。 |
specular |
number |
マテリアル依存 | ハイライトの強さ(パーセント)。 |
radius |
number |
20 |
角丸の半径(px)。 |
tint |
string |
マテリアル依存 | すりガラスの上に重ねる塗り。任意の CSS background 値。 |
tone |
string |
dark |
dark または light。ガラスの背後に何があるか。backdrop の上で未指定なら画像に追従します。 |
backdrop |
string |
— | <img> または <video> を WebGL2 で屈折させます。空なら親要素の最初のものを、セレクターなら別の要素を指します。 |
rim |
boolean |
false |
GPU で照らした縁。外壁と内壁、キーライトとフィルライト、きらめき。パネルの形だけに依存します。 |
sheen |
boolean |
false |
表面を横切って流れるハイライト。 |
interactive |
boolean |
false |
クリックできるガラス向けの、ホバー時の浮き上がりと押し込みのフィードバック。ホストをキーボード操作できるボタンにもします:role="button"、タブ移動の対象になり、Enter と Space がクリックと同じ動作をします。 |
屈折 displace
displace は、縁が背後にあるものを中心へどれだけ引き寄せるかを決めます。これにより縁のすぐ内側の背景が縁の上に引き伸ばされ、厚い凸状の縁が拡大するのと同じ見え方になります。bevel はその湾曲した帯の幅を決めます。bevel の半分を超えると、本物の厚いガラスの縁と同じように、縁が像を折り返します。
<r-glass material="clear" displace="0">…flat…</r-glass> <r-glass material="clear" displace="40">…lensed edge…</r-glass>流れる光と操作感
sheen は動くハイライトを、interactive はホバー時の浮き上がりと押し込んで滑らかに戻る反応を加えます。
<r-glass sheen interactive>
<div>Hover & press me</div>
</r-glass>Rim — GPU によるスペキュラーエッジ(オプトイン)
rim は縁を GPU で描きます。明るい外壁と、bevel が平らな面と接する位置のかすかな内壁があり、左上からのキーライトと右下からの弱いフィルライトで照らされ、縁に沿って厚みが変わり、ときおりきらめきます。light トーンでは壁は照らされる代わりに陰になります。背景はサンプリングしません。シェーダーが知っているのはパネルのサイズ、角丸、bevel だけです。まず WebGL で描画し、ブラウザが WebGPU を持っていればバックグラウンドで移行し、どちらも使えなければ CSS のハイライトをそのまま残します。
<r-glass>…CSS highlight…</r-glass> <r-glass rim>…GPU-lit edge…</r-glass>CSS parts とトークン
内部は ::part(glass)、::part(specular)、::part(refraction)、rim 指定時は ::part(rim) でスタイルを当てるか、--ran-glass-* カスタムプロパティを上書きします:
| トークン | 用途 |
|---|---|
--ran-glass-ink |
コンテンツの色。既定は白、light トーンではほぼ黒。 |
--ran-glass-tint |
すりガラスの上の塗り。 |
--ran-glass-border |
縁のボーダー。 |
--ran-glass-shadow |
ボックスシャドウの重なり(スペキュラーと奥行き)。 |
--ran-glass-brightness |
背後にあるものの明るさ。 |
--ran-glass-specular-background |
CSS ハイライトの背景。 |
--ran-glass-specular-opacity |
CSS ハイライトの強さ。そのレイヤーでは specular より優先されます。 |
--ran-glass-reduced-transparency-background |
OS の「透明度を下げる」設定がオンのときの代替の面。 |
--ran-glass-reduced-transparency-shadow |
同じ状態での代替の影。 |
r-glass {
--ran-glass-tint: linear-gradient(135deg, rgb(0 0 0 / 0.2), transparent);
}説明
- 2 つの経路:
backdropがなければ、backdrop-filterがガラスの背後にある実際のページをすりガラス状にするので、背後のテキスト、動画、コントロールはそのまま動きます。レンズ状で色の分かれる縁は SVG フィルターで、Chromium で描画され、Safari と Firefox ではすりガラスだけが残ります。backdropがあれば、WebGL2 を持つすべてのエンジンで、その画像や動画 1 つを WebGL2 が屈折させます。 - 読みやすさ:コンテンツには
--ran-glass-inkの色が付きます。長い文章はガラスにコントラストを任せず、不透明な内側の面に置いてください。 - 透明度を下げる設定:OS の「透明度を下げる」または「コントラストを上げる」設定(
prefers-reduced-transparency: reduce)のもとでは、ガラスはテーマに追従する不透明な面(--ran-color-bg-elevated)になり、すりガラス、屈折、ハイライトはなくなります。 - モーション:面がトランジションするのは
transformだけなので、テーマの切り替えは 1 フレームで終わります。流れる光と押し込みはprefers-reduced-motionに従います。 - コスト:SVG のレンズマップは、パネルのサイズ、角丸、bevel が変わったときに作り直されます。WebGL の屈折は表示中に 1 フレームに 1 回パネルと画像を確認し、どちらかが動いたときだけ描画します。
プレイグラウンド