当前位置: 首页 > news >正文

window.requestAnimationFrame+localStorage+canvas实现跨窗口小球连线效果

文章目录

  • 前言
  • 效果
  • 代码
  • 后言

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:前端系列文章
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

效果

小球连接效果

代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./index.css">
</head><body><div id="alert1" style="white-space:pre-wrap;"></div><div id="alert2" style="white-space:pre-wrap;"></div><canvas id="canvas1" style="position:absolute;left:0;top:0;"></canvas><script src="./index.js"></script></body></html>
html{width: 100vw;height: 100vh;}
body{width: 100vw;height: 100vh;overflow: hidden;
}
const alert1 = document.getElementById('alert1');
const alert2 = document.getElementById('alert2');
const canvas1 = document.getElementById('canvas1');
const ctx = canvas1.getContext('2d');const keys = getOtherKeys(); // 获取其它窗口的keys
const key = keys.length == 0 ? 1 : keys.at(-1) + 1; // 自增最大的key序号,定义自己窗口storage key
const color = ['red', 'blue',"green"][key % 3]; // 获取圆颜色// 窗口关闭时删除自己窗口storage
window.onunload = function () {localStorage.removeItem(key);
}function getOtherKeys() {const keys = [];for (let i = 0; i < localStorage.length; i++) {const k = Number(localStorage.key(i));!isNaN(k) && keys.push(k);}return keys.sort((a, b) => a - b);
}function draw() {const { clientWidth, clientHeight } = document.body; // 获取body高宽const { screenX, screenY } = window; // 获取浏览器相对屏幕坐标const barHeight = window.outerHeight - window.innerHeight; // 获取浏览器body顶部地址栏高度// 设置canvas为整个body高宽,铺满bodycanvas1.width = clientWidth;canvas1.height = clientHeight;// 获取自己的圆心坐标,为body中心const x = clientWidth / 2;const y = clientHeight / 2;// 画自己的圆ctx.fillStyle = color;ctx.beginPath();ctx.arc(x, y, 15, 0, Math.PI * 2);ctx.fill();// 记录自己的positionconst position = {top: y + barHeight + screenY,left: x + screenX,color: color,};// 获取其它窗口position,并遍历getOtherKeys().forEach(k => {const position2 = JSON.parse(localStorage.getItem(k)); // 获取其中一个窗口的圆心positionconst w = position2.left - position.left; // 获取相对自己圆心的横向间距const h = position2.top - position.top; // 获取相对自己圆心的纵向间距// 在自己的canvas上画出该圆ctx.fillStyle = position2.color;ctx.beginPath();ctx.arc(x + w, y + h, 15, 0, Math.PI * 2);ctx.fill();// 画连接线ctx.strokeStyle = "black";ctx.beginPath();ctx.moveTo(x, y);ctx.lineTo(x + w, y + h);ctx.stroke();})// 更新自己窗口的positionlocalStorage.setItem(key, JSON.stringify(position));window.requestAnimationFrame(draw);
}
window.requestAnimationFrame(draw);

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

http://www.lryc.cn/news/241612.html

相关文章:

  • 使用AndResGuard报错:copy res file not in resources.arsc file:Ezi.xml
  • 插入排序(形象类比)
  • ElasticSearch 同步的方式
  • easyExcel实现分批导入,动态表头分批导出,以及导出表格样式设置
  • Android BottomNavigationView底部菜单栏文字显示问题
  • 从零开始学习typescript——运算符(条件运算法、逻辑运算符、类型运算符、位运算)
  • 【开源】基于Vue.js的康复中心管理系统
  • 抢先看|第二届世界直播电商大会邀您共话时代“新电商”
  • 火爆火爆!影响超250万读者,Python入门圣经全新升级!
  • 大数据学习(23)-hive on mapreduce对比hive on spark
  • 通过这个简单的技巧让我们的 JavaScript 代码变得异常快
  • vue怎么实现国际化? vue-i18n 插件实现国际化,支持切换不同语言
  • rabbit MQ的延迟队列处理模型示例(基于SpringBoot延时插件实现)
  • 虽不想承认,但这就是CSGO游戏搬砖行业的现状
  • 想问问各位大佬,网络安全这个专业普通人学习会有前景吗?
  • uniapp IOS从打包到上架流程(详细简单) 原创
  • React Native项目接入Sentry指南
  • 首批!创邻科技入选《图数据库金融应用场景优秀案例》
  • WPF树形控件TreeView使用介绍
  • Django 模型和Admin站点管理(三)
  • JVMj之console Java监视与管理控制台
  • Android进阶知识:ANR的定位与解决
  • 基于SSM的老年公寓信息管理(有报告)。Javaee项目
  • 阿里云 ACK 新升级,打造智算时代的现代化应用平台
  • CodeWhisperer 一款好玩的 AI 插件
  • 大模型生态新篇章:以AI Agent为引,助企业创新应用落地
  • 什么是网络安全工程师,你想知道的都在这里!
  • uniapp开发的微信小程序进行代码质量控制,分包+压缩js+组件按需注入等
  • GD32替换STM32使用HAL库开发问题
  • PE文件分析