国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--瀏覽器跨標(biāo)簽星球火了,簡單探究一下實現(xiàn)原理

這篇具有很好參考價值的文章主要介紹了記錄--瀏覽器跨標(biāo)簽星球火了,簡單探究一下實現(xiàn)原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識,希望對大家有所幫助

記錄--瀏覽器跨標(biāo)簽星球火了,簡單探究一下實現(xiàn)原理

一、前言

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

準(zhǔn)備自己也搞搞玩一下

記錄--瀏覽器跨標(biāo)簽星球火了,簡單探究一下實現(xiàn)原理

二、實現(xiàn)

原作者的粒子動畫非常炫酷, 但是不是我們本文重點, 我們通過一個元素在不同窗口的拖拽實現(xiàn)一個可以變幻的例子來學(xué)習(xí)一下原理, 后續(xù)在實現(xiàn)一個稍微復(fù)雜的多窗口的小游戲。關(guān)于粒子動畫的內(nèi)容,有興趣的小伙伴可以自己實現(xiàn)

其實實現(xiàn)類似的功能需要的難點并不多,不在乎以下幾個步驟

  • 1、 屏幕坐標(biāo)和窗口坐標(biāo)轉(zhuǎn)換
  • 2、 跨標(biāo)簽通訊

1、 先來看第一個點, 獲取屏幕坐標(biāo)與窗口坐標(biāo)

// 屏幕坐標(biāo)轉(zhuǎn)換為窗口坐標(biāo)
const screenToClient = (screenX, screenY) => {
  const clienX = screenX - window.screenX;
  const clienY = screenY - window.screenY - barHeight();
  return [clienX, clienY];
};

// 窗口坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)
const clientToScreen = (clienX, clienY) => {
  const screenX = clienX + window.screenX;
  const screenY = clienY + window.screenY + barHeight();
  return [screenX, screenY];
};

我們先簡單實現(xiàn)一個卡片, 通過url上面?zhèn)鬟f顏色值, 設(shè)置定位

在卡片本上設(shè)置上點擊拖動等事件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>跨標(biāo)簽通訊</title>
  </head>
  <style>
    .card {
      width: 300px;
      height: 300px;
      background-color: #f00;
      position: fixed;
      top: 100px;
      left: 100px;
    }
  </style>
  <body>
    跨標(biāo)簽通訊
    <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";
          // 發(fā)送消息
          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、 跨標(biāo)簽傳輸

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

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

// 創(chuàng)建 Broadcast Channel
const channel = new BroadcastChannel("myChannel");
// 監(jiān)聽消息
channel.onmessage = (event) => {
  // 處理接收到的消息
  console.log('接收',event)
};
// 發(fā)送消息
const sendMessage = (message) => {
  channel.postMessage(message);
};
只需要在移動時發(fā)送消息, 再其他標(biāo)簽頁就可以接收到值了, 現(xiàn)在關(guān)鍵的就是收到發(fā)送的坐標(biāo)點后, 如何處理, 其實關(guān)鍵就是要讓幾個窗口的卡片位置轉(zhuǎn)化到同一個緯度, 讓其再超出瀏覽器的時候,再另一個窗口的同一個位置出現(xiàn), 所以就需要將窗口坐標(biāo)轉(zhuǎn)化成屏幕坐標(biāo),發(fā)送給其他窗口后, 再轉(zhuǎn)化成窗口坐標(biāo)進(jìn)行渲染即可
// 鼠標(biāo)移動發(fā)送消息的時候,窗口坐標(biāo)轉(zhuǎn)化成屏幕坐標(biāo)
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);
  
// 接收消息的時候,屏幕坐標(biāo)轉(zhuǎn)化成窗口坐標(biāo) 
channel.onmessage = (event) => {
  // 處理接收到的消息
  const [clienX, clienY] = screenToClient(...event.data);
  // 不同窗口的卡片要在同一個位置, 要放到同一個坐標(biāo)系下面,保持屏幕坐標(biāo)一致
  cardDom.style.left = clienX + "px";
  cardDom.style.top = clienY + "px";
};

完整代碼,在最下面

三、總結(jié)

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

后續(xù)前瞻

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

記錄--瀏覽器跨標(biāo)簽星球火了,簡單探究一下實現(xiàn)原理

?

傳送門 ???多標(biāo)簽通訊--實現(xiàn)用瀏覽器接小球游戲

完整代碼實現(xiàn)如下

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>跨標(biāo)簽通訊</title>
  </head>
  <style>
    .card {
      width: 300px;
      height: 300px;
      background-color: #f00;
      position: fixed;
      top: 100px;
      left: 100px;
    }
  </style>
  <body>
    跨標(biāo)簽通訊
    <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";

    // 屏幕坐標(biāo)轉(zhuǎn)換為窗口坐標(biāo)
    const screenToClient = (screenX, screenY) => {
      const clienX = screenX - window.screenX;
      const clienY = screenY - window.screenY - barHeight();
      return [clienX, clienY];
    };

    // 窗口坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)
    const clientToScreen = (clienX, clienY) => {
      const screenX = clienX + window.screenX;
      const screenY = clienY + window.screenY + barHeight();
      return [screenX, screenY];
    };

    // 創(chuàng)建 Broadcast Channel
    const channel = new BroadcastChannel("myChannel");
    // 監(jiān)聽消息
    channel.onmessage = (event) => {
      // 處理接收到的消息
      const [clienX, clienY] = screenToClient(...event.data);
      // 不同窗口的卡片要在同一個位置, 要放到同一個坐標(biāo)系下面,保持屏幕坐標(biāo)一致
      cardDom.style.left = clienX + "px";
      cardDom.style.top = clienY + "px";
    };

    // 發(fā)送消息
    const sendMessage = (message) => {
      channel.postMessage(message);
    };

    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";
          // 發(fā)送消息
          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>

本文轉(zhuǎn)載于:

https://juejin.cn/post/7304598711992598566

如果對您有所幫助,歡迎您點個關(guān)注,我會定時更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。

?記錄--瀏覽器跨標(biāo)簽星球火了,簡單探究一下實現(xiàn)原理文章來源地址http://www.zghlxwxcb.cn/news/detail-747286.html

到了這里,關(guān)于記錄--瀏覽器跨標(biāo)簽星球火了,簡單探究一下實現(xiàn)原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 蘋果safari瀏覽器播放不了video標(biāo)簽視頻

    蘋果safari瀏覽器播放不了video標(biāo)簽視頻

    今天遇到了個神奇的問題,視頻文件在pc端和安卓手機上播放都沒問題,但是在ios上就是播放不了,大概代碼如下: 前端代碼: 后端代碼: PC端沒任何問題: IOS端播放不了: 在網(wǎng)上搜索了很多辦法,有加前端參數(shù)配置的: 有改后端多次發(fā)送請求,分段獲取數(shù)據(jù)流的: 經(jīng)過

    2024年02月16日
    瀏覽(32)
  • selenium基本使用、無頭瀏覽器(chrome、FireFox)、搜索標(biāo)簽

    這個模塊:既能發(fā)請求,又能解析,還能執(zhí)行js selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執(zhí)行 JavaScript代碼的問題 selenium 會做web方向的自動化測試 appnium 會做 app方向的自動化測試 selenium 可以操作瀏覽器,模擬人的 行為 下載瀏覽器驅(qū)動

    2024年02月04日
    瀏覽(109)
  • JS監(jiān)聽瀏覽器關(guān)閉、刷新及切換標(biāo)簽頁觸發(fā)事件

    蠻簡單的東西,知道就會,不知道就不會,沒什么邏輯可言。簡單記錄一下,只為加深點兒印象。 visibilitychange visibilitychange可以監(jiān)聽到瀏覽器的切換標(biāo)簽頁。? 直接上代碼:? beforeunload? beforeunload可以監(jiān)聽到頁面的關(guān)閉,頁簽切換不會觸發(fā) 關(guān)閉瀏覽器窗口的時候觸發(fā) 通過點

    2024年02月08日
    瀏覽(27)
  • 前端:html實現(xiàn)頁面切換、頂部標(biāo)簽欄,類似于瀏覽器的頂部標(biāo)簽欄(完整版)

    前端:html實現(xiàn)頁面切換、頂部標(biāo)簽欄,類似于瀏覽器的頂部標(biāo)簽欄(完整版)

    效果 代碼 解決BUG:關(guān)閉單頁時,單頁數(shù)據(jù)未清空,導(dǎo)致再次打開單頁時出現(xiàn)內(nèi)容仍然存在的問題

    2024年02月11日
    瀏覽(34)
  • 實用工具推薦,瀏覽器必備寶藏插件:Wetab新標(biāo)簽頁

    實用工具推薦,瀏覽器必備寶藏插件:Wetab新標(biāo)簽頁

    打開瀏覽器,你的起始頁是否充滿了廣告和各種亂七八糟的信息呢?或者過于單調(diào),而失去了某些你想要的功能? 這里給大家推薦一個在Chrome瀏覽器和edge瀏覽器上都能愉快使用的瀏覽器插件——Wetab新標(biāo)簽頁。沒有廣告、頁面干凈美觀且具備各種實用功能。 ? 下面就給大家

    2024年02月08日
    瀏覽(31)
  • 如何處理html5新標(biāo)簽的瀏覽器兼容問題?

    處理HTML5新標(biāo)簽的瀏覽器兼容問題,特別是針對較舊的瀏覽器,可以采用以下幾種方法: 使用JavaScript創(chuàng)建元素 : 對于不支持HTML5新標(biāo)簽的瀏覽器,可以使用JavaScript(特別是Document Object Model,DOM)來創(chuàng)建這些元素。例如,可以使用 document.createElement(\\\'article\\\') 來在DOM中創(chuàng)建 art

    2024年01月21日
    瀏覽(25)
  • 谷歌chrome瀏覽器無法自動播放video標(biāo)簽視頻的問題

    谷歌chrome瀏覽器無法自動播放video標(biāo)簽視頻的問題

    問題根源詳見: Chrome中的自動播放政策??https://developer.chrome.com/blog/autoplay/ ?The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For the Web Audio API, the autoplay policy launched in Chrome 71. This affects web games, some WebRTC appli

    2024年02月11日
    瀏覽(121)
  • vantUI(Tabbar標(biāo)簽頁)瀏覽器返回上一頁的失效問題

    在開發(fā)中遇到這樣一個問題,由頁面1切換到頁面2,再點擊瀏覽器的回退,無法回退到頁面1。 開始以為是路由配置的有問題,但是子頁面可以正?;赝耍驗閞eplace只是替換路由,而不會往history棧中記錄路由,所以當(dāng)切換到頁面2的時候,歷史的路由里已經(jīng)沒有頁面1了,所以

    2024年02月06日
    瀏覽(25)
  • 新版edge瀏覽器讀取谷歌瀏覽器上的歷史記錄

    上一篇: (3條消息) 新版edge瀏覽器讀取谷歌瀏覽器上的歷史記錄_learningbilibili的博客-CSDN博客 https://blog.csdn.net/learningbilibili/article/details/123662218 關(guān)于上次的讀取歷史記錄的問題是現(xiàn)在的edge瀏覽器最近的版本更新后出現(xiàn)了每次啟動時從 Google Chrome 導(dǎo)入瀏覽器數(shù)據(jù)的功能,而且是

    2024年02月09日
    瀏覽(28)
  • 如何在Firefox火狐瀏覽器點擊鏈接打開新標(biāo)簽頁、搜索、和書簽

    如何在Firefox火狐瀏覽器點擊鏈接打開新標(biāo)簽頁、搜索、和書簽

    打開Firefox火狐瀏覽器設(shè)置 在Firefox的地址欄輸入 about:config 按回車鍵后,打開了一個警告頁面,單擊“接受風(fēng)險并繼續(xù)”即可,如下圖所 在新標(biāo)簽頁打開網(wǎng)頁上的鏈接(點擊鏈接打開新標(biāo)簽頁) 在窗口中輸入 browser.urlbar.openintab 雙擊顯示的值更改為 true 在新標(biāo)簽中打開搜索結(jié)

    2024年02月05日
    瀏覽(39)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包