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

js前端跨屏效果

 效果:

三个球

源码: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>三个球</title>
</head>
<body><div id="alert1" style="white-space:pre-wrap;"></div><br /><div id="alert2" style="white-space:pre-wrap;"></div><canvas id="canvas1" style="position:absolute;left:0;top:0;"></canvas>      <script>const alert1 = document.getElementById('alert1');const alert2 = document.getElementById('alert2');const canvas1 = document.getElementById('canvas1');const ctx = canvas1.getContext('2d');const keys = getOtherKeys(); // 获取其它窗口的storage keysconst key = keys.length == 0 ? 1 : keys.at(-1) + 1; // 自增最大的key序号,定义自己窗口storage keyconst color = ['red', 'blue', 'green'][key % 3]; // 获取圆颜色// 窗口关闭时删除自己窗口storagewindow.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顶部地址栏高度// 记录logalert1.textContent = JSON.stringify({ key, clientWidth, clientHeight, screenX, screenY, barHeight }, '', 2);// 设置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));// 记录logalert2.textContent = JSON.stringify(localStorage, '', 2);window.requestAnimationFrame(draw);}window.requestAnimationFrame(draw);</script>
</body>
</html>

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

相关文章:

  • 配置华为云镜像加速器
  • Redis的四种模式:单机、主从、哨兵、集群
  • 【开源】基于Vue.js的民宿预定管理系统
  • 网络安全深入学习第九课——本机信息收集
  • 深入理解C语言指针基础概念:定义、内存地址与声明初始化
  • Django DRF版本号的处理
  • [工业自动化-25]:IDEC和泉RU2S-24D/RU4S-24D继电器的使用说明和接线方式
  • 如何通过短视频提高转化率?
  • 微软离Altman越近,离OpenAI就越远!
  • minio集群部署(k8s内)
  • 【C语言】函数(四):函数递归与迭代,二者有什么区别
  • [原创](免改BIOS)使用Clover升级旧电脑-(高阶玩法)让固态硬盘内置Win11 PE启动系统
  • React项目中发生空白但不报错的原因分析和解决?
  • redis运维(十七)事务
  • Vue框架学习笔记——Vue实例中el和data的两种写法
  • libbz2 for Mac OS makefile
  • 测试工具JMeter的使用
  • C++编程——输入
  • opencv-直方图
  • el-table表格排序(需要后端判别),el-table导出功能(向后端发送请求)
  • 【MATLAB】全网入门快、免费获取、持续更新的科研绘图教程系列2
  • git与ssh多账户共存
  • BLE协议栈入门学习
  • 【反射】简述反射的构造方法,成员变量成员方法
  • acwing算法基础之数学知识--求卡特兰数
  • 《洛谷深入浅出基础篇》P4017最大食物链————拓扑排序
  • 设置定时自动请求测试_自动定时循环发送http_post请求---postman工作笔记001
  • Vue3封装全局插件
  • 【Python 训练营】N_6 求素数
  • 【图论】关键路径求法c++