記錄--你不知道的Js高級方法

来源:https://www.cnblogs.com/smileZAZ/archive/2023/07/28/17588444.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在Js中有一些比較冷門但是非常好用的方法,我在這裡稱之為高級方法,這些方法沒有被廣泛使用或多或少是因為存在一些相容性的問題,不是所有的瀏覽器都讀得懂的。這篇文章主要就是對這些方法做一個總結,有些方法在我們開發過程中有著重要的作用,我 ...


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

前言

Js中有一些比較冷門但是非常好用的方法,我在這裡稱之為高級方法,這些方法沒有被廣泛使用或多或少是因為存在一些相容性的問題,不是所有的瀏覽器都讀得懂的。這篇文章主要就是對這些方法做一個總結,有些方法在我們開發過程中有著重要的作用,我們一起來看一下吧。

getBoundingClientRect()

getBoundingClientRect() 是一個用於獲取元素位置和尺寸信息的方法。它返回一個 DOMRect對象,其提供了元素的大小及其相對於視口的位置,其中包含了以下屬性:

  • x:元素左邊界相對於視口的 x 坐標。
  • y:元素上邊界相對於視口的 y 坐標。
  • width:元素的寬度。
  • height:元素的高度。
  • top:元素上邊界相對於視口頂部的距離。
  • right:元素右邊界相對於視口左側的距離。
  • bottom:元素下邊界相對於視口頂部的距離。
  • left:元素左邊界相對於視口左側的距離。
const box = document.getElementById('box');
const rect = box.getBoundingClientRect();

console.log(rect.x);        // 元素左邊界相對於視口的 x 坐標
console.log(rect.y);        // 元素上邊界相對於視口的 y 坐標
console.log(rect.width);    // 元素的寬度
console.log(rect.height);   // 元素的高度
console.log(rect.top);      // 元素上邊界相對於視口頂部的距離
console.log(rect.right);    // 元素右邊界相對於視口左側的距離
console.log(rect.bottom);   // 元素下邊界相對於視口頂部的距離
console.log(rect.left);     // 元素左邊界相對於視口左側的距離

為了更好地理解,我在頁面上設置了一個容器,其對應屬性看下圖:

應用場景

這個方法通常用於需要獲取元素在視口中的位置和尺寸信息的場景,比如實現拖拽、定位或響應式佈局等,相容性很好,一般用滾動事件比較多。

特殊場景會用上,比如你登錄了淘寶的網頁,當你下拉滑塊的時候,下麵的圖片不會立即載入出來,有一個懶載入的效果。當上面一張圖片沒在可視區內時,就開始載入下麵的圖片。

下麵代碼就是判斷一個容器是否出現在可視視窗內:

 const box = document.getElementById('box')
 window.onscroll = function () {//window.addEventListener('scroll',()=>{})
  console.log(checkInView(box));
 }

function checkInView(dom) {
const { top, left, bottom, right } = dom.getBoundingClientRect();
 return top > 0 &&
        left > 0 &&
        bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
       right <= (window.innerWidth || 
       document.documentElement.clientWidth)
        }
 

當容器在可視區域內就輸出true,否則就是false

intersectionObserver

IntersectionObserver 是一個構造函數,可以接收兩個參數,第一個參數是一個回調函數,第二個參數是一個對象。這個方法用於觀察元素相交情況,它可以非同步地監聽一個或多個目標元素與其祖先元素或視口之間的交叉狀態。它提供了一種有效的方法來檢測元素是否可見或進入視口。

用法

使用 IntersectionObserver 需要以下步驟:

  1. 創建一個 IntersectionObserver 實例,傳入一個回調函數和可選的配置對象。
const observer = new IntersectionObserver(callback, options);
const callback = (entries, observer) => {
  // 處理交叉狀態變化的回調函數
};

const options = {
  // 可選配置
};
  1. 將要觀察的目標元素添加到觀察者中。
const target = document.querySelector('#targetElement');
observer.observe(target);
  1. 在回調函數中處理交叉狀態的變化。
const callback = (entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // 元素進入視口
    } else {
      // 元素離開視口
    }
  });
};

entries 參數是一個包含每個目標元素交叉狀態信息的數組。每個 entry 對象都有以下屬性:

  • target:觀察的目標元素。
  • intersectionRatio:目標元素與視口的交叉比例,值在 0 到 1 之間。
  • isIntersecting:目標元素是否與視口相交。
  • intersectionRect:目標元素與視口的交叉區域的位置和尺寸信息。

options 對象是可選的配置,其中常用的配置選項包括:

  • root:指定觀察器的根元素,預設為視口。
  • rootMargin:設置根元素的外邊距,用於擴大或縮小交叉區域。
  • threshold:指定交叉比例的閾值,可以是單個數值或由多個數值組成的數組。

應用場景

IntersectionObserver 適用於實現懶載入、無限滾動、廣告展示和可視化統計等場景,同樣可以判斷元素是否在某一個容器內,不會引起迴流。

createNodeIterator()

createNodeIterator() 方法是 DOM API 中的一個方法,用於創建一個 NodeIterator 對象,可以用於遍歷文檔樹中的一組 DOM 節點。

通俗一點來講就是它可以遍歷 DOM 結構,把 DOM 變成可遍歷的。

比較偏的面試考點

這種方法算是一個比較偏的面試考點,面試官問你怎樣實現遍歷 DOM 結構?其實就可以用到這個方法。但是大多數程式員答不上來這個問題,因為我們在日常開發中這個方法用得極少。這個方法常在框架源碼中體現。

應用

<body>
    <div id="app">
        <p>hello</p>
        <div class="title">標題</div>
        <div>
            <div class="content">內容</div>
        </div>
    </div>

    <script>
        const body = document.getElementsByTagName('body')[0]
        const item = document.createNodeIterator(body)//讓body變成可遍歷的
        let root = item.nextNode() // 下一層

        while (root) {
            console.log(root);
            if (root.nodeType !== 3) {
                root.setAttribute('data-index', 123)//給每個節點添加一個屬性
            }
            root = item.nextNode()
        }
    </script>
</body>
上面代碼成功遍歷到了各個 DOM 結構:

並且在每個 DOM 節點上都添加了data-index = "123"

getComputedStyle()

getComputedStyle()是一個可以獲取當前元素所有最終使用的CSS屬性值的方法。返回的是一個CSS樣式聲明對象。

這個方法有兩個參數,第一個參數是你想要獲取哪個元素的 CSS ,第二個參數是一個偽元素。

用法

<style>
        #box {
            width: 200px;
            height: 200px;
            background-color: cornflowerblue;
            position: relative;
        }

        #box::after {
            content: "";
            width: 50px;
            height: 50px;
            background: #000;
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>


 const box = document.getElementById('box')
 const style = window.getComputedStyle(box, 'after')

 const height = style.getPropertyValue('height')
 const width = style.getPropertyValue('width')

 console.log(style);
 console.log(width, height);

上述代碼輸出結果為:

 

有一個 id 為 box 容器的 CSS 樣式聲明對象,以及偽元素的寬高。

requestAnimationFrame()

上面4種方法我們可能用得不是很多,但是requestAnimationFrame方法相對使用較多。requestAnimationFrame() 是一個用於在下一次瀏覽器重繪之前調用指定函數的方法,它是 HTML5 提供的 API。

與setInterval和setTimeout

requestAnimationFrame的調用頻率通常為每秒60次。這意味著我們可以在每次重繪之前更新動畫的狀態,並確保動畫流暢運行,而不會對瀏覽器的性能造成影響。

setIntervalsetTimeout它可以讓我們在指定的時間間隔內重覆執行一個操作,不會考慮瀏覽器的重繪,而是按照指定的時間間隔執行回調函數,可能會被延遲執行,從而影響動畫的流暢度。

效果對比

我們設置了兩個容器,分別用requestAnimationFrame()方法和setTimeout方法進行平移效果,Js 代碼如下所示:

   let distance = 0
        let box = document.getElementById('box')
        let box2 = document.getElementById('box2')

        window.addEventListener('click', function () {

         requestAnimationFrame(function move() {
         box.style.transform = `translateX(${distance++}px)`
         requestAnimationFrame(move)//遞歸
          })

        setTimeout(function change() {
         box2.style.transform = `translateX(${distance++}px)`
         setTimeout(change, 17)
            }, 17)

        })

效果圖如下:

可能我們肉眼看得不是很清楚,但是確實下麵的圖形平移沒有上面圖形流暢,用setTimeout會有卡頓現象。

本文轉載於:

https://juejin.cn/post/7242983917603405883

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


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

-Advertisement-
Play Games
更多相關文章
  • # 錯誤: Resize inode not valid 對於gpt分區的硬碟一般fsck只能檢查分區, 不能用於檢查整個硬碟, 但是如果對硬碟設備運行時遇到這樣的錯誤 ```bash $ sudo fsck -n /dev/sdc fsck from util-linux 2.37.2 e2fsc ...
  • 本文分享自天翼雲開發者社區《大數據通用組件故障處理》,作者:f****n HDFS 1.HDFS 服務一直異常 檢查HDFS是否處於安全模式。 檢查ZooKeeper服務是否運行正常。 2.HDFS 維護客戶端出現OutOfMemoryError 異常 使用HDFS客戶端之前,需要在HADOOP_C ...
  • 有許多支持多數據源數據轉換和同步的ETL工具可供選擇。以下是一些常見的ETL工具和它們支持多數據源數據轉換和同步的特點: Apache NiFi:Apache NiFi是一個開源的ETL工具,支持多種數據源的連接,包括文件系統、資料庫、消息隊列、網路介面等。它提供了可視化的界面和強大的數據處理功能, ...
  • ### PG資料庫安裝擴展 需要用到pg資料庫的空間擴展postgis,在進行操作之前需要在資料庫中安裝擴展。 ```sql CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology; CREATE EXTENSION postgis_g ...
  • 一、最左首碼法則 如果索引了多列(聯合索引),要遵守最左首碼法則。最左首碼法則指的是查詢從索引的最左列開始,並且不跳過索引中的列,如果跳躍某一列,索引將部分失效(後面的欄位索引失效) 示例1:account_transaction表中創建一個聯合索引,使用method欄位+trader_staff_ ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230726164318392-162588362.png) # 1. 結果集 ## 1.1. sql ```sql select empno,mgr from emp ord ...
  • ### [2023 年 7 月 28 日 22:16:06] ## ref 取 render 方式組件節點 一開始註意到組件 setup 和 render 一起使用的情況,好奇怎麼通過 ref 取到 render 中 jsx 里的節點,一開始試了以下的嘗試,結果是 undefined 的: ```j ...
  • # Mapbox—geocoder搜索地點error eaching the server [——There was an errorr eaching the server](#focus) 環境說明: vue3.3.4 mapbox-gl: 2.13.0 @mapbox/mapbox-gl-ge ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...