javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JavaScript液态玻璃

纯JavaScript实现惊艳的液态玻璃效果的示例

作者:迷空

今天给大家分享一个超酷的视觉效果:液态玻璃​​,这个效果看起来就像一块可以随意拖动、边缘会自然流动的玻璃面板,具有一定的参考价值,感兴趣的可以了解一下

前言

今天给大家分享一个超酷的视觉效果——​​液态玻璃​​。这个效果看起来就像一块可以随意拖动、边缘会自然流动的玻璃面板。最棒的是,我们完全用原生JavaScript实现,不需要任何第三方库!

效果预览

技术原理

这个效果主要基于以下几个核心技术:

  1. ​SVG位移映射​​:使用feDisplacementMap滤镜实现变形效果
  2. ​符号距离函数(SDF)​​:计算边缘的平滑过渡
  3. ​Canvas实时渲染​​:动态生成位移贴图
  4. ​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函数计算点到圆角矩形边缘的距离,是实现边缘流动效果的关键。

完整实现步骤

实际应用场景

这种效果可以用于:

性能优化建议

结语

这个液态玻璃效果展示了现代浏览器强大的图形能力,纯前端实现这样的效果在几年前还是难以想象的。希望这个教程能给你带来启发,欢迎在评论区分享你的创意实现!

到此这篇关于纯JavaScript实现惊艳的液态玻璃效果的示例的文章就介绍到这了,更多相关JavaScript液态玻璃内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文