纯JavaScript实现惊艳的液态玻璃效果的示例
作者:迷空
今天给大家分享一个超酷的视觉效果:液态玻璃,这个效果看起来就像一块可以随意拖动、边缘会自然流动的玻璃面板,具有一定的参考价值,感兴趣的可以了解一下
前言
今天给大家分享一个超酷的视觉效果——液态玻璃。这个效果看起来就像一块可以随意拖动、边缘会自然流动的玻璃面板。最棒的是,我们完全用原生JavaScript实现,不需要任何第三方库!
效果预览
技术原理
这个效果主要基于以下几个核心技术:
- SVG位移映射:使用
feDisplacementMap
滤镜实现变形效果 - 符号距离函数(SDF):计算边缘的平滑过渡
- Canvas实时渲染:动态生成位移贴图
- CSS视觉效果:结合
backdrop-filter
增强质感
核心代码解析
1. 初始化SVG滤镜
// 创建SVG滤镜 const filter = document.createElementNS('http://www.w3.org/2000/svg', 'filter'); this.feDisplacementMap = document.createElementNS('http://www.w3.org/2000/svg', 'feDisplacementMap'); this.feDisplacementMap.setAttribute('in', 'SourceGraphic'); this.feDisplacementMap.setAttribute('in2', `${this.id}_map`); this.feDisplacementMap.setAttribute('xChannelSelector', 'R'); this.feDisplacementMap.setAttribute('yChannelSelector', 'G');
这段代码创建了一个SVG位移滤镜,它会根据我们提供的位移贴图来扭曲元素的外观。
2. 位移贴图生成
// 在updateShader方法中计算每个像素的位移 for (let i = 0; i < data.length; i += 4) { const x = (i / 4) % w; const y = Math.floor(i / 4 / w); const pos = this.fragment({ x: x / w, y: y / h }, mouseProxy); const dx = pos.x * w - x; const dy = pos.y * h - y; maxScale = Math.max(maxScale, Math.abs(dx), Math.abs(dy)); rawValues.push(dx, dy); }
这段代码遍历canvas的每个像素,计算它们应该移动的位置,生成位移贴图。
3. 边缘平滑处理
function roundedRectSDF(x, y, width, height, radius) { const qx = Math.abs(x) - width + radius; const qy = Math.abs(y) - height + radius; return Math.min(Math.max(qx, qy), 0) + length(Math.max(qx, 0), Math.max(qy, 0)) - radius; }
这个SDF函数计算点到圆角矩形边缘的距离,是实现边缘流动效果的关键。
完整实现步骤
- 创建容器元素:一个固定定位的div作为玻璃面板
- 设置SVG滤镜:包含位移映射和图像处理
- 初始化Canvas:用于实时生成位移贴图
- 实现拖拽功能:让用户可以拖动玻璃面板
- 响应鼠标移动:根据鼠标位置更新变形效果
实际应用场景
这种效果可以用于:
- 特色按钮或卡片
- 网站装饰元素
- 数据可视化中的焦点提示
- 交互式教程中的高亮区域
性能优化建议
- 对于移动端,可以降低canvas的分辨率
- 使用requestAnimationFrame进行节流
- 对于静态效果,可以预生成位移贴图
结语
这个液态玻璃效果展示了现代浏览器强大的图形能力,纯前端实现这样的效果在几年前还是难以想象的。希望这个教程能给你带来启发,欢迎在评论区分享你的创意实现!
到此这篇关于纯JavaScript实现惊艳的液态玻璃效果的示例的文章就介绍到这了,更多相关JavaScript液态玻璃内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!