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.pswp.cn/news/166405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166405.shtml
英文地址,請注明出處:http://en.pswp.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 …