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.mzph.cn/news/166405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA----ZCU106使用petalinux 2019.1的第一个app开发

1、petalinux在zcu106上的构建参见前文 FPGA----ZCU106使用petalinux 2019.1&#xff08;全网最详&#xff09;-CSDN博客文章浏览阅读31次。本文完成了Vivado 2019.1版本下的基于ZCU106的全部linux系统移植https://blog.csdn.net/qq_37912811/article/details/1345197352、我们…

Vatee万腾科技的未来探险:Vatee数字创新的独特发现

在科技的浩瀚海洋中&#xff0c;Vatee万腾科技如一艘探险船般&#xff0c;勇敢地驶向未知的数字化领域。这次未来的探险&#xff0c;不仅是一场科技创新的冒险&#xff0c;更是对数字化时代的独特发现和深刻探讨。 Vatee万腾科技视科技创新为一座高峰&#xff0c;而他们的未来探…

java类中局部变量和成员变量有啥区别?

java类中局部变量和成员变量有啥区别&#xff1f; 举个例子&#xff0c;我们可以定义一个Person类&#xff0c;其中有两个成员变量name和age&#xff0c;以及一个构造方法和一个show方法。在构造方法中&#xff0c;我们可以使用this关键字来引用成员变量&#xff0c;以区分同名…

基于亚马逊云科技大语言模型等服务打造企业知识库

背景 大语言模型是自然语言处理领域的一项重要技术&#xff0c;能够通过学习大量的文本数据&#xff0c;生成具有语法和意义的自然语言文本。目前大语言模型已经成为了自然语言处理领域的一个热门话题&#xff0c;引起了广泛的关注和研究。 知识库需求在各行各业中普遍存在&a…

《洛谷深入浅出基础篇》P4715淘汰赛——二叉树

上链接&#xff1a;【深基16.例1】淘汰赛 - 洛谷https://www.luogu.com.cn/problem/P4715 上题干&#xff1a; 题目描述 有 2^n&#xff08;n≤7&#xff09;个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值&#xff0c;且都不相等。能力值高的国家和能力值…

力扣刷题,两数之和

1、两数之和 1、问题描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。…

从裸机启动开始运行一个C++程序(十三)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;十二&#xff09; 从裸机启动开始运行一个C程序&#xff08;十一&#xff09; 从裸机启动开始运行一个C程序&#xff08;十&#xff09; 从裸机启动开始运行一个C程序&#xff08;九&#xff09; 从裸机启动开…

uniapp打包的ipa上架到appstore的傻瓜式教程

​ 转载&#xff1a;uniapp打包的ipa上架到appstore的傻瓜式教程 uniapp打包 在HBuilder X编辑器中打开需要打包的项目&#xff0c;然后点击上面菜单栏中 发行 > 原生App-云打包&#xff0c;对以下弹出的弹窗进行内容填写 ​ 填写完成以后&#xff0c;点击打包操作 ​ ​ …

自定义责任链Filter实现

核心接口 Filter package com.xxx.arch.mw.nbp.common.extension;import com.xxx.commons.data.domain.Result;/*** date 2023/08/25*/ public interface Filter {Result invoke(final Invoker invoker, final Invocation invocation); } Invoker package com.xxx.arch.mw.…

修改mysql的密码(每一步都图文解释哦)

当你想要连接本机数据库时&#xff0c;是不是有可能突然忘记了自己的数据库密码? 在此文中&#xff0c;我们来详细解决一下如何去修改自己的数据库密码&#xff0c;并使用Navicat来连接测试 1.停止mysql服务 打开终端&#xff0c;键入命令,将mysql服务先停止掉&#xff0c;…

设置滚动条样式

滚动条样式&#xff1a; 下面是代码&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8"><title>CSS3自定义滚动条</title><style>header {font-family: Lobster, cursive;text-align: c…

亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(二)

向量数据库选择哪种近似搜索算法&#xff0c;选择合适的集群规模以及集群设置调优对于知识库的读写性能也十分关键&#xff0c;主要需要考虑以下几个方面&#xff1a; 向量数据库算法选择 在 OpenSearch 里&#xff0c;提供了两种 k-NN 的算法&#xff1a;HNSW (Hierarchical…

基于STM32设计的智能防盗单车锁(马蹄锁)设计_升级版

1. 前言 随着共享单车和自行车的普及,人们对自行车的安全和便利性提出了更高的要求。智能防盗马蹄锁是一种基于 STM32 单片机的智能锁,可以通过手机蓝牙实现开锁和关锁控制,同时具备 GPRS 防盗预警功能,提高了自行车的安全性和使用便利性。 通过智能防盗马蹄锁,用户可以…

YOLOv5和改进后模型的result.csv文件对比

import pandas as pd import matplotlib.pyplot as plt# 读取CSV文件 df1 pd.read_csv(rE:\xianyu\yolo.csv) df2 pd.read_csv(rE:\xianyu\final.csv)# 获取列名 columns df1.columns# 循环绘制每一列的对比图 for column in columns:plt.figure(figsize(8, 5))plt.plot(df1…

技术分享 | 在 IDE 插件开发中接入 JCEF 框架

项目背景 当前的开发环境存在多种不同语言的 IDE&#xff0c;如 JetBrains 全家桶、Eclipse、Android Studio 和 VS Code 等等。由于每个 IDE 各有其特定的语言和平台要求&#xff0c;因此开发 IDE 插件时&#xff0c;需要投入大量资源才能尽可能覆盖大部分工具。同时&#xf…

数据结构算法-贪心算法

引言 贪心&#xff1a;人只要有 “需求“ &#xff0c;都会有有点“贪“&#xff0c; 这种“贪“是一种选择&#xff0c;或者“”取舍“ RTS&#xff08;即时战略&#xff09;游戏&#xff1a; 帝国时代里 首先确保拥有足够的人口 足够的粮食&#xff0c;足够的战略资源 足够的…

干货科普 | 不同类型的机器人及其在工作中的应用

原创 | 文 BFT机器人 制造商在其操作中使用各种类型的机器人&#xff0c;每种机器人都具有特定的能力和功能。我们将讨论制造业中使用的一些最常见类型的机器人&#xff0c;以及哪种机器人可能最适合您的应用。 01 关节机器人 关节式机器人是一种工业机器人&#xff0c;具有一…

npm,yarn,pnpm 清理缓存

目录 1&#xff0c;为什么要清理缓存1&#xff0c;缓存文件太多&#xff0c;影响系统运行2&#xff0c;不同源会有区别 2&#xff0c;命令2.1&#xff0c;npm2.2&#xff0c;yarn2.3&#xff0c;pnpm 1&#xff0c;为什么要清理缓存 1&#xff0c;缓存文件太多&#xff0c;影响…

关于easy-es的聚合问题

es实体类&#xff1a; public class ChemicalES {IndexId(type IdType.CUSTOMIZE)private Long id;HighLightIndexField(fieldType FieldType.TEXT, analyzer "ik_max_word")private String name;IndexField(fieldType FieldType.KEYWORD)private List<Stri…

三数之和 Java版

题目描述&#xff1a;给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 请你找出所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 输入&#xff1a;nums …