記錄--瀏覽器跨標簽星球火了,簡單探究一下實現原理

来源:https://www.cnblogs.com/smileZAZ/archive/2023/11/27/17860076.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、前言 最近 推特上 一位懂設計和寫代碼的大神一個兩個瀏覽器之間 星球粒子交互的動畫火了, 讓人看了大呼腦洞大開, 瀏覽器竟然還能這麼玩!!! 準備自己也搞搞玩一下 二、實現 原作者的粒子動畫非常炫酷, 但是不是我們本文重點, 我們通過 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

一、前言

最近 推特上 一位懂設計和寫代碼的大神一個兩個瀏覽器之間 星球粒子交互的動畫火了, 讓人看了大呼腦洞大開, 瀏覽器竟然還能這麼玩!!!

準備自己也搞搞玩一下

二、實現

原作者的粒子動畫非常炫酷, 但是不是我們本文重點, 我們通過一個元素在不同視窗的拖拽實現一個可以變幻的例子來學習一下原理, 後續在實現一個稍微複雜的多視窗的小游戲。關於粒子動畫的內容,有興趣的小伙伴可以自己實現

其實實現類似的功能需要的難點並不多,不在乎以下幾個步驟

  • 1、 屏幕坐標和視窗坐標轉換
  • 2、 跨標簽通訊

1、 先來看第一個點, 獲取屏幕坐標與視窗坐標

// 屏幕坐標轉換為視窗坐標
const screenToClient = (screenX, screenY) => {
  const clienX = screenX - window.screenX;
  const clienY = screenY - window.screenY - barHeight();
  return [clienX, clienY];
};

// 視窗坐標轉換為屏幕坐標
const clientToScreen = (clienX, clienY) => {
  const screenX = clienX + window.screenX;
  const screenY = clienY + window.screenY + barHeight();
  return [screenX, screenY];
};

我們先簡單實現一個卡片, 通過url上面傳遞顏色值, 設置定位

在卡片本上設置上點擊拖動等事件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>跨標簽通訊</title>
  </head>
  <style>
    .card {
      width: 300px;
      height: 300px;
      background-color: #f00;
      position: fixed;
      top: 100px;
      left: 100px;
    }
  </style>
  <body>
    跨標簽通訊
    <div class="card">card</div>
  </body>
  <script>
    const barHeight = () => window.outerHeight - window.innerHeight;
    const cardDom = document.querySelector(".card");
    cardDom.style.top = 100 + "px";
    cardDom.style.left = 100 + "px";
    cardDom.style.background =
      new URLSearchParams(window.location.search).get("color") || "red";

    window.onload = function () {
      cardDom.onmousedown = function (e) {
        cardDom.style.cursor = "pointer";
        let x = e.pageX - cardDom.offsetLeft;
        let y = e.pageY - cardDom.offsetTop;
        window.onmousemove = function (e) {
          cardDom.style.left = e.clientX - x + "px";
          cardDom.style.top = e.clientY - y + "px";
          // 發送消息
          const clientCoordinateX = e.clientX - x;
          const clientCoordinateY = e.clientY - y;
          const ScreenCoordinate = clientToScreen(
            clientCoordinateX,
            clientCoordinateY
          );
          sendMessage(ScreenCoordinate);
        };
        window.onmouseup = function () {
          window.onmousemove = null;
          window.onmouseup = null;
          cardDom.style.cursor = "unset";
        };
      };
    };
  </script>
</html>

2、 跨標簽傳輸

單個元素的拖動就實現了, 很簡單, 如何讓其他標簽的元素也能同步進行, 需要實現跨標簽方案了, 可以參考該文章- 跨標簽頁通信的8種方式

我們就選擇第一種,使用 BroadCast Channel, 使用也很簡單

// 創建 Broadcast Channel
const channel = new BroadcastChannel("myChannel");
// 監聽消息
channel.onmessage = (event) => {
  // 處理接收到的消息
  console.log('接收',event)
};
// 發送消息
const sendMessage = (message) => {
  channel.postMessage(message);
};
只需要在移動時發送消息, 再其他標簽頁就可以接收到值了, 現在關鍵的就是收到發送的坐標點後, 如何處理, 其實關鍵就是要讓幾個視窗的卡片位置轉化到同一個緯度, 讓其再超出瀏覽器的時候,再另一個視窗的同一個位置出現, 所以就需要將視窗坐標轉化成屏幕坐標,發送給其他視窗後, 再轉化成視窗坐標進行渲染即可
// 滑鼠移動發送消息的時候,視窗坐標轉化成屏幕坐標
window.onmousemove = function (e) {
  cardDom.style.left = e.clientX - x + "px";
  cardDom.style.top = e.clientY - y + "px";
  const clientCoordinateX = e.clientX - x;
  const clientCoordinateY = e.clientY - y;
  const ScreenCoordinate = clientToScreen(
    clientCoordinateX,
    clientCoordinateY
  );
sendMessage(ScreenCoordinate);
  
// 接收消息的時候,屏幕坐標轉化成視窗坐標 
channel.onmessage = (event) => {
  // 處理接收到的消息
  const [clienX, clienY] = screenToClient(...event.data);
  // 不同視窗的卡片要在同一個位置, 要放到同一個坐標系下麵,保持屏幕坐標一致
  cardDom.style.left = clienX + "px";
  cardDom.style.top = clienY + "px";
};

完整代碼,在最下麵

三、總結

本文通過移動一個簡單的圖形, 在不同瀏覽器之間穿梭變換, 初步體驗了多個瀏覽器之間如何進行交互, 通過拖拽元素,通過跨標簽的通訊, 將當前視窗元素的位置進行發送, 另一個視窗進行實時接收, 然後通過屏幕坐標和視窗坐標進行轉換, 就能實現,從一個瀏覽器拖動到另一個瀏覽器時, 變化元素顏色的功能了, 當然變化背景色只是舉例子, 你也可以變化撲克牌, 變化照片, 這樣看起來像變魔術一樣,非常神奇,看似瀏覽器不同標簽之間沒有聯繫,當以這種方式產生聯繫後, 就會產生很多不可思議的神奇事情。 就像國外大神的多標簽頁的兩個星球粒子, 產生吸引 融合的效果。原理其實是一樣的。

後續前瞻

在通過小demo的學習,知道多瀏覽器的玩法後, 接下來的我們會實現一個更有意思的小游戲,通過瀏覽器化身一個小木棒, 接小球游戲, 先看一下 gif, 接下來的文章會寫具體實現

 

傳送門

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Shell使用 在圖標和視窗占據電腦屏幕之前。需要輸入命令與大多數電腦進行交互。在UNIX系統(Linux系統派生自該系統)中,用來解釋和管理命令的程式稱為shell。 Shell類型: Bash shell,Bourne Again Shell,預設shell。 BSD UNIX用戶中流行的C ...
  • GMAC網卡Fixed-Link模式GMACfixed-link固定鏈接模式,mac與對端的連接方式是寫死的,通常用於mac to mac(不排除mac to phy的情況)。內核要支持fixed-link模式,需要打開CONFIG_FIXED_PHY配置。 社區版linux的gmac網卡platf ...
  • SQL RIGHT JOIN關鍵字 SQL RIGHT JOIN關鍵字返回右表(table2)中的所有記錄以及左表(table1)中的匹配記錄。如果沒有匹配,則左側的結果為0條記錄。 RIGHT JOIN語法 SELECT column_name(s) FROM table1 RIGHT JOIN ...
  • 本文分享自華為雲社區《DTSE Tech Talk | 3招解決時序數據高基數難題,性能多維度提升!》,作者:華為雲開源。 本期《openGemini全新列存引擎,為您解決時序數據高基數難題》的主題直播中,華為雲開源DTSE技術佈道師&資料庫創新Lab技術專家黃飛騰,與開發者朋友們分享了時序資料庫的 ...
  • 負載均衡 此處的負載均衡指的是FE層的負載均衡. 當部署多個 FE 節點時,用戶可以在多個 FE 之上部署負載均衡層來實現 Doris 的高可用。官方文檔描述: 負載均衡 。 實現方式 實現方式有多種,如下列舉。 開發者在應用層自己進行重試與負載均衡。 JDBC Connector 發現一個連接掛掉 ...
  • 閱讀 Doris SQL 原理解析,總結下Doris中SQL解析流程: 詞法識別:解析原始SQL文本,拆分token 語法識別:將token轉換成AST 單機邏輯查詢計劃:將AST經過一系列的優化(比如,謂詞下推等)成查詢計劃,提高執行性能與效率。 分散式邏輯查詢計劃:根據分散式環境(數據分佈信息、 ...
  • 本文分享自華為雲社區《多模歸一,一生萬物——華為雲多模資料庫GeminiDB架構與應用實踐》,作者: GaussDB 資料庫 。 在這個信息爆炸的時代,數據的管理和應用變得越來越重要。互聯網用戶的規模化使得業務數據也呈現出多樣性,包括社交關係、系統日誌、Json、KV等。同時,越來越多的軟體開發團隊 ...
  • 以前對非同步刪除幾個參數的作用比較模糊,包括網上的很多資料都是一筆帶過,語焉不詳。 所以這次從源碼(基於 Redis 7.0.5)的角度來深入分析下這幾個參數的具體作用: lazyfree-lazy-user-del lazyfree-lazy-user-flush lazyfree-lazy-ser ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...