HTML5无内置冰霜滤镜,需用CSS filter组合blur、contrast、brightness、hue-rotate等模拟,再配合伪元素或Canvas绘制霜纹,WebGL适用于需厚度、光照响应的真实霜效。
HTML5 本身没有内置的“冰霜滤镜”这种现成效果,filter CSS 属性也不提供名为 frost、frosty 或 ice 的标准函数。所谓“冰霜效果”,是通过组合多个基础滤镜(如 blur()、contrast()、brightness()、hue-rotate())并叠加半透明白色/浅蓝图层模拟出来的视觉结果。
filter 模拟冰霜质感核心思路是:轻微模糊 + 提高对比度 + 增加冷色调 + 降低饱和度,再配合伪元素叠加霜花纹理或高光。直接写在元素上即可生效:
frost-element {
filter: blur(1.2px) contrast(1.3) brightness(0.95) hue-rotate(-10deg) saturate(0.85);
}
blur(1.2px) 模拟霜面微散射,别超过 2px,否则像失焦contrast(1.3) 让边缘更“硬”,强化霜的结晶感brightness(0.95) 略微压暗,避免发灰;设为 1.05 则偏“结霜反光”感hue-rotate(-10deg) 往青蓝偏移,是“冷”的关键;-5°~-15° 之间微调最自然filter 效果单薄,建议搭配 ::after 叠加 radial-gradient 模拟霜斑若需动态霜迹(比如鼠标划过结霜、随时间蔓延),CSS 不够用,得用 Canvas 2D 绘制噪点+径向渐变+alpha 渐变路径。关键不是画“图案”,而是控制透明度衰减和边缘毛刺:
ctx.globalCompositeOperation = 'overlay' 叠加在原图上,比 source-over 更接近霜附着感createImageData() 手动生成像素级霜点rgba(240, 248, 255, 0.18) 这类带蓝调的浅色更可信ctx.filter = 'blur(0.8px)' 再 drawImage,能软化边缘,防止锯齿当需要真实霜层厚度、光照折射或与 3D 模型融合时,CSS 和 2D Canvas 都力不从心。此时必须进 shader 层

normal 和 viewDir 计算霜面朝向,控制霜厚分布noise 函数生成霜晶随机分布,频率控制在 2–5 cycle/px 范围内pow(dot(N, V), 3.0) 模拟菲涅尔效应,让边缘更亮MeshStandardMaterial,但需自定义 onBeforeCompile 注入霜相关 uniform 和 fragment logic真正难的不是加一层滤镜,而是让“霜”看起来有厚度、有环境响应、不悬浮——它得像附着在物体表面的物理层,而不是贴上去的 PNG。多数人卡在只调 filter 却忽略光影匹配和纹理节奏,结果霜像磨砂玻璃,不是结霜。