<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vitaliy</title>
    <description>The latest articles on DEV Community by Vitaliy (@vitalbadjo).</description>
    <link>https://dev.to/vitalbadjo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4200292%2F627ab820-352b-4f46-8e2e-35e1c88a60ec.png</url>
      <title>DEV Community: Vitaliy</title>
      <link>https://dev.to/vitalbadjo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vitalbadjo"/>
    <language>en</language>
    <item>
      <title>Liquid glass CSS — the Apple liquid glass effect with CSS only (plus SVG refraction)</title>
      <dc:creator>Vitaliy</dc:creator>
      <pubDate>Thu, 22 Oct 2026 11:02:05 +0000</pubDate>
      <link>https://dev.to/vitalbadjo/liquid-glass-css-the-apple-liquid-glass-effect-with-css-only-plus-svg-refraction-1hkd</link>
      <guid>https://dev.to/vitalbadjo/liquid-glass-css-the-apple-liquid-glass-effect-with-css-only-plus-svg-refraction-1hkd</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://webtricks.dev/blog/liquid-glass-css" rel="noopener noreferrer"&gt;webtricks.dev&lt;/a&gt;, where the &lt;a href="https://webtricks.dev/snippets/liquid-glass-card" rel="noopener noreferrer"&gt;liquid glass card snippet&lt;/a&gt; has a live playground.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Apple's &lt;strong&gt;Liquid Glass&lt;/strong&gt; (introduced across iOS, iPadOS and macOS in 2025) is&lt;br&gt;
the current reference for translucent UI. The good news: around 80% of the look&lt;br&gt;
is plain, well-supported CSS. The catch: the &lt;em&gt;bending&lt;/em&gt; refraction — where the&lt;br&gt;
background visibly warps as it passes through the glass — needs an SVG&lt;br&gt;
displacement filter that, today, only Chromium can feed into &lt;code&gt;backdrop-filter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This guide builds the effect in layers so you can stop at the layer your&lt;br&gt;
support target allows. Every block is copy-paste ready; the control-driven&lt;br&gt;
version lives in the &lt;strong&gt;&lt;a href="https://webtricks.dev/snippets/liquid-glass-card" rel="noopener noreferrer"&gt;liquid glass card snippet&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What "liquid glass" actually is
&lt;/h2&gt;

&lt;p&gt;Look at a Liquid Glass control up close and you can separate five layers.&lt;br&gt;
Each maps to one CSS feature:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;CSS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A faint white (or black) wash so the pane reads as a material, not a hole&lt;/td&gt;
&lt;td&gt;&lt;code&gt;background: rgba(255,255,255,.1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blur + saturation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frosts what is behind and pumps its colors so the glass looks thick&lt;/td&gt;
&lt;td&gt;&lt;code&gt;backdrop-filter: blur() saturate()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Specular rim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A thin bright edge, strongest at the top, where light enters the pane&lt;/td&gt;
&lt;td&gt;inset &lt;code&gt;box-shadow&lt;/code&gt; highlights + a 1px border&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sheen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A soft diagonal gloss across the surface&lt;/td&gt;
&lt;td&gt;a &lt;code&gt;::after&lt;/code&gt; with a &lt;code&gt;linear-gradient&lt;/code&gt; and &lt;code&gt;mix-blend-mode: screen&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Refraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The backdrop bends near the edges and ripples slightly&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;backdrop-filter: url(#filter)&lt;/code&gt; with &lt;code&gt;feDisplacementMap&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Classic &lt;strong&gt;glassmorphism&lt;/strong&gt; (the 2020 trend) is layers one to three. Liquid&lt;br&gt;
glass adds the sheen and refraction, and uses stronger saturation so the&lt;br&gt;
material looks lit from inside. If you only need the simpler flat version,&lt;br&gt;
the &lt;strong&gt;&lt;a href="https://webtricks.dev/snippets/glassmorphism-card" rel="noopener noreferrer"&gt;glassmorphism card&lt;/a&gt;&lt;/strong&gt; snippet is enough.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. The cross-browser core (liquid glass CSS only)
&lt;/h2&gt;

&lt;p&gt;Frosted glass is &lt;code&gt;backdrop-filter&lt;/code&gt;. Liquid glass reads as a &lt;strong&gt;thick, lit pane&lt;/strong&gt;,&lt;br&gt;
and three ingredients do that: tint, blur with saturation, and a rim built&lt;br&gt;
from inset shadows. This block works in every current browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.liquid-glass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;isolation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c"&gt;/* keeps the ::after's z-index inside this box */&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;28px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;28px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* 1. tint */&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c"&gt;/* 2. frost — blur + saturation + a touch of brightness */&lt;/span&gt;
  &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;saturate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;180%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;brightness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;saturate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;180%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;brightness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c"&gt;/* 3. specular rim: strong top highlight, softer on the other edges */&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;                 &lt;span class="c"&gt;/* lift */&lt;/span&gt;
    &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;      &lt;span class="c"&gt;/* top */&lt;/span&gt;
    &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;-1px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c"&gt;/* bottom */&lt;/span&gt;
    &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;      &lt;span class="c"&gt;/* left */&lt;/span&gt;
    &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;-1px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c"&gt;/* right */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the diagonal &lt;strong&gt;sheen&lt;/strong&gt; with a pseudo-element, so the surface looks&lt;br&gt;
glossy rather than matte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.liquid-glass&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;inset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                 &lt;span class="c"&gt;/* below the text, above the tint */&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inherit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;pointer-events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="m"&gt;135deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;28%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;transparent&lt;/span&gt; &lt;span class="m"&gt;58%&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;mix-blend-mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why the asymmetric rim? Real glass catches light from above, so the top&lt;br&gt;
inset is roughly twice as bright as the sides. Make all four equal and the&lt;br&gt;
card flattens into an outlined box. If you want to tune the lift shadow and&lt;br&gt;
the inset highlights visually, the &lt;a href="https://webtricks.dev/tools/box-shadow-generator" rel="noopener noreferrer"&gt;box-shadow generator&lt;/a&gt;&lt;br&gt;
builds layered inset shadows and copies the whole declaration.&lt;/p&gt;

&lt;p&gt;A complete, working liquid glass card then looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"liquid-glass"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Liquid glass&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Frosted, lit from the top, glossy across the surface.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put it over a &lt;strong&gt;busy, colorful background&lt;/strong&gt; — a photo, or a few overlapping&lt;br&gt;
radial gradients. Over a flat fill the blur has nothing to sample and the&lt;br&gt;
effect vanishes (see Common mistakes below).&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Light-mode variant
&lt;/h2&gt;

&lt;p&gt;On a light background, white tint plus white highlights disappear. Flip the&lt;br&gt;
tint toward the background color, lower the saturation boost, and switch the&lt;br&gt;
rim to a mix of white (top) and dark (bottom) so the edge still reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.liquid-glass.light&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;saturate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;140%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;saturate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;140%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.90&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;-1px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.06&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.liquid-glass.light&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="m"&gt;135deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;30%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;transparent&lt;/span&gt; &lt;span class="m"&gt;60%&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;mix-blend-mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c"&gt;/* screen does nothing useful over white */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two rules of thumb for light mode: more blur (12–16px) because light&lt;br&gt;
backgrounds have less contrast to frost, and a higher tint alpha (0.4–0.6)&lt;br&gt;
because the text needs a more opaque surface to stay readable.&lt;br&gt;
If you theme with tokens, drop your brand color into the&lt;br&gt;
&lt;a href="https://webtricks.dev/tools/color-converter" rel="noopener noreferrer"&gt;color converter&lt;/a&gt; to get it as &lt;code&gt;rgb()&lt;/code&gt; so you can&lt;br&gt;
append an alpha: &lt;code&gt;rgb(14 165 233 / 0.12)&lt;/code&gt; makes a tinted glass in one line.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Real refraction with SVG displacement
&lt;/h2&gt;

&lt;p&gt;To make the backdrop actually &lt;em&gt;bend&lt;/em&gt;, displace it with an SVG filter.&lt;br&gt;
Procedural noise from &lt;code&gt;feTurbulence&lt;/code&gt; drives an &lt;code&gt;feDisplacementMap&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"position:absolute"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;filter&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"liquid"&lt;/span&gt; &lt;span class="na"&gt;x=&lt;/span&gt;&lt;span class="s"&gt;"-20%"&lt;/span&gt; &lt;span class="na"&gt;y=&lt;/span&gt;&lt;span class="s"&gt;"-20%"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"140%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"140%"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;feTurbulence&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"fractalNoise"&lt;/span&gt; &lt;span class="na"&gt;baseFrequency=&lt;/span&gt;&lt;span class="s"&gt;"0.008 0.012"&lt;/span&gt;
                  &lt;span class="na"&gt;numOctaves=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;seed=&lt;/span&gt;&lt;span class="s"&gt;"9"&lt;/span&gt; &lt;span class="na"&gt;result=&lt;/span&gt;&lt;span class="s"&gt;"noise"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;feGaussianBlur&lt;/span&gt; &lt;span class="na"&gt;in=&lt;/span&gt;&lt;span class="s"&gt;"noise"&lt;/span&gt; &lt;span class="na"&gt;stdDeviation=&lt;/span&gt;&lt;span class="s"&gt;"1.4"&lt;/span&gt; &lt;span class="na"&gt;result=&lt;/span&gt;&lt;span class="s"&gt;"soft"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;feDisplacementMap&lt;/span&gt; &lt;span class="na"&gt;in=&lt;/span&gt;&lt;span class="s"&gt;"SourceGraphic"&lt;/span&gt; &lt;span class="na"&gt;in2=&lt;/span&gt;&lt;span class="s"&gt;"soft"&lt;/span&gt; &lt;span class="na"&gt;scale=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt;
                       &lt;span class="na"&gt;xChannelSelector=&lt;/span&gt;&lt;span class="s"&gt;"R"&lt;/span&gt; &lt;span class="na"&gt;yChannelSelector=&lt;/span&gt;&lt;span class="s"&gt;"G"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@supports&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url('#liquid')&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.liquid-glass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;saturate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;180%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;brightness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="sx"&gt;url('#liquid')&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How it works: &lt;code&gt;feTurbulence&lt;/code&gt; produces an RGB noise image. &lt;code&gt;feDisplacementMap&lt;/code&gt;&lt;br&gt;
reads the &lt;strong&gt;red channel&lt;/strong&gt; to shift each backdrop pixel horizontally and the&lt;br&gt;
&lt;strong&gt;green channel&lt;/strong&gt; to shift it vertically. A channel value of 0.5 means "no&lt;br&gt;
move", so values above and below push pixels in opposite directions, and&lt;br&gt;
&lt;code&gt;scale&lt;/code&gt; sets how far (in user units) a full-strength value can move a pixel.&lt;br&gt;
The &lt;code&gt;feGaussianBlur&lt;/code&gt; in between softens the noise so the distortion looks&lt;br&gt;
like water, not static.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tuning the three numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Low values&lt;/th&gt;
&lt;th&gt;High values&lt;/th&gt;
&lt;th&gt;Good range for glass&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;baseFrequency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Large, slow waves (0.002 — a single swell across the card)&lt;/td&gt;
&lt;td&gt;Fine ripples (0.05+ — looks like frosted texture, not liquid)&lt;/td&gt;
&lt;td&gt;0.005–0.015; use two values (&lt;code&gt;x y&lt;/code&gt;) for a slightly stretched, less "random" wobble&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;numOctaves&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 — smooth, blobby&lt;/td&gt;
&lt;td&gt;4+ — adds fine detail on top of the big waves, much more expensive&lt;/td&gt;
&lt;td&gt;1–2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scale&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5–15 — barely visible shimmer&lt;/td&gt;
&lt;td&gt;80+ — the backdrop tears into chunks&lt;/td&gt;
&lt;td&gt;20–50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Change &lt;code&gt;seed&lt;/code&gt; to get a different noise layout with the same character. The&lt;br&gt;
filter region (&lt;code&gt;x="-20%"&lt;/code&gt; etc.) is widened on purpose: displacement pulls&lt;br&gt;
pixels in from outside the element, and with the default region the edges&lt;br&gt;
clip to hard lines.&lt;/p&gt;
&lt;h3&gt;
  
  
  A static alternative: feImage
&lt;/h3&gt;

&lt;p&gt;Noise gives you an organic, random wobble. Apple's real effect is not random:&lt;br&gt;
the distortion is strongest at the edges (like a lens) and flat in the middle.&lt;br&gt;
You get that by replacing the turbulence with a &lt;strong&gt;hand-made displacement&lt;br&gt;
map&lt;/strong&gt; — a PNG or inline SVG where the red/green channels encode the push&lt;br&gt;
direction, grey in the center, ramping toward the edges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;filter&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"lens"&lt;/span&gt; &lt;span class="na"&gt;x=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;y=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;feImage&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"lens-map.png"&lt;/span&gt; &lt;span class="na"&gt;preserveAspectRatio=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt;
           &lt;span class="na"&gt;result=&lt;/span&gt;&lt;span class="s"&gt;"map"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;feDisplacementMap&lt;/span&gt; &lt;span class="na"&gt;in=&lt;/span&gt;&lt;span class="s"&gt;"SourceGraphic"&lt;/span&gt; &lt;span class="na"&gt;in2=&lt;/span&gt;&lt;span class="s"&gt;"map"&lt;/span&gt; &lt;span class="na"&gt;scale=&lt;/span&gt;&lt;span class="s"&gt;"32"&lt;/span&gt;
                     &lt;span class="na"&gt;xChannelSelector=&lt;/span&gt;&lt;span class="s"&gt;"R"&lt;/span&gt; &lt;span class="na"&gt;yChannelSelector=&lt;/span&gt;&lt;span class="s"&gt;"G"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The map is stretched to the element with &lt;code&gt;preserveAspectRatio="none"&lt;/code&gt;, so one&lt;br&gt;
image fits any card size. Paint it with a radial gradient from&lt;br&gt;
&lt;code&gt;rgb(128,128,128)&lt;/code&gt; in the middle to red/green-shifted corners, or generate it&lt;br&gt;
from a small canvas script. This is the technique the in-depth walkthroughs at&lt;br&gt;
&lt;a href="https://blog.logrocket.com/how-create-liquid-glass-effects-css-and-svg/" rel="noopener noreferrer"&gt;LogRocket&lt;/a&gt;&lt;br&gt;
and &lt;a href="https://habr.com/ru/articles/974058/" rel="noopener noreferrer"&gt;this Habr article&lt;/a&gt; build up to,&lt;br&gt;
and it is much closer to the native look than raw noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser support
&lt;/h2&gt;

&lt;p&gt;Two separate features matter: &lt;code&gt;backdrop-filter&lt;/code&gt; itself, and whether a browser&lt;br&gt;
accepts an &lt;strong&gt;SVG filter reference&lt;/strong&gt; (&lt;code&gt;url(#id)&lt;/code&gt;) inside &lt;code&gt;backdrop-filter&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Chrome / Edge&lt;/th&gt;
&lt;th&gt;Safari&lt;/th&gt;
&lt;th&gt;Firefox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;backdrop-filter&lt;/code&gt; (blur, saturate…)&lt;/td&gt;
&lt;td&gt;76+&lt;/td&gt;
&lt;td&gt;9+ with &lt;code&gt;-webkit-&lt;/code&gt; prefix, 18+ unprefixed&lt;/td&gt;
&lt;td&gt;103+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@supports (backdrop-filter: …)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;url(#svg-filter)&lt;/code&gt; inside &lt;code&gt;backdrop-filter&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no (declaration is dropped)&lt;/td&gt;
&lt;td&gt;not reliable — treat as no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;url(#svg-filter)&lt;/code&gt; inside plain &lt;code&gt;filter&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;prefers-reduced-transparency&lt;/code&gt; media query&lt;/td&gt;
&lt;td&gt;118+&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;behind a flag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practical consequence: keep &lt;code&gt;-webkit-backdrop-filter&lt;/code&gt; for older Safari,&lt;br&gt;
and always gate the SVG refraction behind&lt;br&gt;
&lt;code&gt;@supports (backdrop-filter: url('#id'))&lt;/code&gt;. Browsers that fail the check keep&lt;br&gt;
the frosted layer, which already looks good. Do not combine the two in one&lt;br&gt;
unguarded declaration — Safari rejects the whole &lt;code&gt;backdrop-filter&lt;/code&gt; value if&lt;br&gt;
any part of it is invalid, and you lose the blur too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contrast is unpredictable.&lt;/strong&gt; Text over glass sits on whatever scrolls
behind it. WCAG's 4.5:1 ratio must hold against the &lt;em&gt;worst&lt;/em&gt; part of the
backdrop, not the average. Raise the tint alpha, add a subtle
&lt;code&gt;text-shadow: 0 1px 2px rgb(0 0 0 / .4)&lt;/code&gt;, or keep glass for chrome
(toolbars, pills) and put long text on solid surfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect reduced transparency.&lt;/strong&gt; Users who turn on "Reduce transparency"
in macOS or iOS expect opaque panels:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-transparency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.liquid-glass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="m"&gt;38&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;0.92&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;-webkit-backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced motion.&lt;/strong&gt; If you animate the displacement (for instance by
animating &lt;code&gt;baseFrequency&lt;/code&gt; with an SVG &lt;code&gt;animate&lt;/code&gt; element), disable it under
&lt;code&gt;prefers-reduced-motion: reduce&lt;/code&gt;. A rippling backdrop behind text is a
real problem for readers with vestibular disorders.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;backdrop-filter&lt;/code&gt; forces the browser to composite everything behind the&lt;br&gt;
element into a texture, blur it, and re-composite every frame something&lt;br&gt;
behind it moves. Three rules keep it smooth:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keep it off scrolling lists.&lt;/strong&gt; One glass header over a scrolling page is
fine; 50 glass cards &lt;em&gt;inside&lt;/em&gt; a scrolling list means 50 blurs per frame.
Use glass for the container, not the items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blur radius is the cost knob.&lt;/strong&gt; &lt;code&gt;blur(8px)&lt;/code&gt; is cheap; &lt;code&gt;blur(40px)&lt;/code&gt; on a
full-width panel can drop a mid-range phone below 60fps. Liquid glass
wants a small blur (4–10px) anyway — the saturation does the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVG displacement is the expensive layer.&lt;/strong&gt; &lt;code&gt;feTurbulence&lt;/code&gt; with
&lt;code&gt;numOctaves="2"&lt;/code&gt; recomputed every frame on a large element is noticeably
heavier than any CSS filter. Keep displaced elements small (buttons,
pills, a single card), keep &lt;code&gt;numOctaves&lt;/code&gt; at 1–2, and never animate the
noise on more than one element.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;will-change: backdrop-filter&lt;/code&gt; is rarely useful: the element is already&lt;br&gt;
promoted to its own compositor layer by the filter. Adding &lt;code&gt;will-change:&lt;br&gt;
transform&lt;/code&gt; to a glass element that moves (a draggable card, a slide-in&lt;br&gt;
sheet) does help, because it stops the browser re-rasterizing the pane&lt;br&gt;
while it moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flat background.&lt;/strong&gt; The most frequent "it doesn't work" report. Glass only
shows over variation. Test over a photo or stacked radial gradients first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting &lt;code&gt;isolation: isolate&lt;/code&gt;.&lt;/strong&gt; The sheen uses &lt;code&gt;z-index: -1&lt;/code&gt;. Without
its own stacking context, the pseudo-element drops &lt;em&gt;behind the parent's
background&lt;/em&gt; and disappears — or, worse, behind the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;::after&lt;/code&gt; covering the text.&lt;/strong&gt; If you set &lt;code&gt;z-index: 1&lt;/code&gt; instead, the
gloss sits on top of the text and washes it out. Keep the sheen at &lt;code&gt;-1&lt;/code&gt;
and the text at auto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing &lt;code&gt;position: relative&lt;/code&gt;.&lt;/strong&gt; The &lt;code&gt;inset: 0&lt;/code&gt; on the pseudo-element
is relative to the nearest positioned ancestor; without it the sheen
stretches over the whole page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;overflow: hidden&lt;/code&gt; on the glass element.&lt;/strong&gt; It clips the outer lift
shadow. Use &lt;code&gt;border-radius: inherit&lt;/code&gt; on children instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Equal highlights on all sides.&lt;/strong&gt; Reads as an outline, not a rim. Keep
the top highlight the strongest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blur too strong.&lt;/strong&gt; Beyond ~16px the backdrop turns into a uniform smear
and the material reads as "frosted plastic", not glass.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I do liquid glass with CSS only, no SVG?
&lt;/h3&gt;

&lt;p&gt;Yes. Tint, blur, saturation, the specular rim and the sheen are all plain&lt;br&gt;
CSS and work in every current browser. You only lose the refraction (the&lt;br&gt;
visible bending of the backdrop), which is the one part that needs an SVG&lt;br&gt;
&lt;code&gt;feDisplacementMap&lt;/code&gt; and currently works only in Chromium.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between glassmorphism and liquid glass?
&lt;/h3&gt;

&lt;p&gt;Glassmorphism is a translucent tint plus a blur and a thin border. Liquid&lt;br&gt;
glass adds strong saturation, an asymmetric specular rim, a glossy sheen and&lt;br&gt;
edge refraction so the panel looks like a thick lens rather than frosted&lt;br&gt;
film. Compare the &lt;a href="https://webtricks.dev/snippets/glassmorphism-card" rel="noopener noreferrer"&gt;glassmorphism card&lt;/a&gt; and the&lt;br&gt;
&lt;a href="https://webtricks.dev/snippets/liquid-glass-card" rel="noopener noreferrer"&gt;liquid glass card&lt;/a&gt; side by side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does my backdrop-filter not work in Safari?
&lt;/h3&gt;

&lt;p&gt;Older Safari needs the &lt;code&gt;-webkit-backdrop-filter&lt;/code&gt; prefix (unprefixed support&lt;br&gt;
arrived in Safari 18). Also, if any part of the value is unsupported — such&lt;br&gt;
as &lt;code&gt;url(#filter)&lt;/code&gt; — Safari discards the whole declaration, so put the SVG&lt;br&gt;
part inside &lt;code&gt;@supports&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does liquid glass hurt performance?
&lt;/h3&gt;

&lt;p&gt;A single glass element with a small blur is cheap. The cost scales with the&lt;br&gt;
element's area, the blur radius, and how often what is behind it changes.&lt;br&gt;
Avoid glass on many list items, keep the blur under ~10px, and reserve the&lt;br&gt;
SVG displacement for small controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I make the glass tinted with my brand color?
&lt;/h3&gt;

&lt;p&gt;Replace the white tint with your color at low alpha, for example&lt;br&gt;
&lt;code&gt;background: rgb(14 165 233 / 0.14)&lt;/code&gt;, and keep the highlights white. Use the&lt;br&gt;
&lt;a href="https://webtricks.dev/tools/color-converter" rel="noopener noreferrer"&gt;color converter&lt;/a&gt; to get your hex as space-separated&lt;br&gt;
&lt;code&gt;rgb()&lt;/code&gt; so you can add the alpha channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it live
&lt;/h2&gt;

&lt;p&gt;Open the &lt;a href="https://webtricks.dev/snippets/liquid-glass-card" rel="noopener noreferrer"&gt;liquid glass card snippet&lt;/a&gt; and drag&lt;br&gt;
the blur, saturation, radius and tint controls, then copy the CSS with your&lt;br&gt;
settings. Browse all &lt;a href="https://webtricks.dev/snippets" rel="noopener noreferrer"&gt;snippets&lt;/a&gt; or subscribe via &lt;a href="https://webtricks.dev/rss.xml" rel="noopener noreferrer"&gt;RSS&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>design</category>
    </item>
  </channel>
</rss>
