最近前端圈子很火爆,因为这个量子纠缠的特效。这个特效有几个抓眼球的地方:两个浏览器窗口之间可以实现通信,产生吸附的效果;利用 three 实现了炫酷的效果。
这个怎么实现的?核心难点在于两个:
- 不同窗口中球之间的相对位置
- 浏览器窗口之间通信
1. 原理剖析
1.1. 球的相对位置
对于上述截图效果,核心元素是 3D 圆,圆默认放到窗口中心,所以球的相对位置,其实就是窗口的相对位置。
这里主要有 3 个 API
- window.innerWidth,window.innerHeight:当前浏览器窗口的大小。
- screenTop,screenLeft:浏览器窗口和屏幕窗口之间的位置。
有了这些信息之后,就可以知道浏览器窗口在电脑屏幕空间的的 BBox,这个信息可以后面用来计算两个窗口是否交叠的,交叠多少的的信息。
javascript
const bbox = [
window.screenLeft,
window.screenTop,
window.innerWidth,
window.innerHeight,
];
1.2. 窗口之间的通信
最容易想到的就是加一个 server,然后使用 websocket 进行实时通信,这样会带来一个服务端,架构会复杂一些,实际上使用前端 localStorage 能力即可实现。
javascript
window.addEventListener("storage", (e) => {
// do something.
});
在进行 localStorage 存储的时候,会触发 storage 事件,因为 localStorage 是按源存储的,所以就可以实现窗口之间的通信了。
弄清楚了这两点,做这个效果,就只是工程问题了。
2. 案例复现
我这里就是用可视化的一些案例来实现了,期望的效果就是,多个不同窗口的浏览器会默认打开不同的可视化基础图表,比如:折线图、点图、柱形图。
然后当两个窗口靠近的时候,就可以把不同窗口的图表合并到一起,比如折线图和柱形图合并,组成成一个图表。
此处为语雀视频卡片,点击链接查看:量子纠缠之图表纠缠.mp4
3. 用途
本质核心能力是两个浏览器窗口之间的通信,这个技术点可以用来做什么?
- 本地多窗口协作的情况下,数据同步
- 多屏幕,扩大操作区域:控制窗口 + 预览窗口
- ...