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

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...