最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中比較冷門但非常好用的方法總結(jié)

 更新時間:2023年06月18日 09:19:47   作者:一拾九  
在Js中有一些比較冷門但是非常好用的方法,我在這里稱之為高級方法,這些方法沒有被廣泛使用或多或少是因為存在一些兼容性的問題,不是所有的瀏覽器都讀得懂的,這篇文章主要就是對這些方法做一個總結(jié),讓我們一起來看一下吧

getBoundingClientRect()

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

  • x:元素左邊界相對于視口的 x 坐標。
  • y:元素上邊界相對于視口的 y 坐標。
  • width:元素的寬度。
  • height:元素的高度。
  • top:元素上邊界相對于視口頂部的距離。
  • right:元素右邊界相對于視口左側(cè)的距離。
  • bottom:元素下邊界相對于視口頂部的距離。
  • left:元素左邊界相對于視口左側(cè)的距離。
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);    // 元素右邊界相對于視口左側(cè)的距離
console.log(rect.bottom);   // 元素下邊界相對于視口頂部的距離
console.log(rect.left);     // 元素左邊界相對于視口左側(cè)的距離

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

應(yīng)用場景

這個方法通常用于需要獲取元素在視口中的位置和尺寸信息的場景,比如實現(xiàn)拖拽、定位或響應(yīng)式布局等,兼容性很好,一般用滾動事件比較多。

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

下面代碼就是判斷一個容器是否出現(xiàn)在可視窗口內(nèi):

 
 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)
        }

當容器在可視區(qū)域內(nèi)就輸出true,否則就是false。

intersectionObserver

IntersectionObserver 是一個構(gòu)造函數(shù),可以接收兩個參數(shù),第一個參數(shù)是一個回調(diào)函數(shù),第二個參數(shù)是一個對象。這個方法用于觀察元素相交情況,它可以異步地監(jiān)聽一個或多個目標元素與其祖先元素或視口之間的交叉狀態(tài)。它提供了一種有效的方法來檢測元素是否可見或進入視口。

用法

使用 IntersectionObserver 需要以下步驟:

  • 創(chuàng)建一個 IntersectionObserver 實例,傳入一個回調(diào)函數(shù)和可選的配置對象。
const observer = new IntersectionObserver(callback, options);
const callback = (entries, observer) => {
  // 處理交叉狀態(tài)變化的回調(diào)函數(shù)
};
const options = {
  // 可選配置
};
  • 將要觀察的目標元素添加到觀察者中。
const target = document.querySelector('#targetElement');
observer.observe(target);
  • 在回調(diào)函數(shù)中處理交叉狀態(tài)的變化。
const callback = (entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // 元素進入視口
    } else {
      // 元素離開視口
    }
  });
};

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

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

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

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

應(yīng)用場景

IntersectionObserver 適用于實現(xiàn)懶加載、無限滾動、廣告展示和可視化統(tǒng)計等場景,同樣可以判斷元素是否在某一個容器內(nèi),不會引起回流。

createNodeIterator()

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

通俗一點來講就是它可以遍歷 DOM 結(jié)構(gòu),把 DOM 變成可遍歷的。

比較偏的面試考點

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

應(yīng)用

<body>
    <div id="app">
        <p>hello</p>
        <div class="title">標題</div>
        <div>
            <div class="content">內(nèi)容</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)//給每個節(jié)點添加一個屬性
            }
            root = item.nextNode()
        }
    </script>
</body>

上面代碼成功遍歷到了各個 DOM 結(jié)構(gòu):

并且在每個 DOM 節(jié)點上都添加了data-index = "123"。

getComputedStyle()

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

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

用法

<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);

上述代碼輸出結(jié)果為:

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

requestAnimationFrame()

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

與setInterval和setTimeout

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

setIntervalsetTimeout它可以讓我們在指定的時間間隔內(nèi)重復(fù)執(zhí)行一個操作,不會考慮瀏覽器的重繪,而是按照指定的時間間隔執(zhí)行回調(diào)函數(shù),可能會被延遲執(zhí)行,從而影響動畫的流暢度。

效果對比

我們設(shè)置了兩個容器,分別用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)
        })

效果圖如下:

可能我們?nèi)庋劭吹貌皇呛芮宄?,但是確實下面的圖形平移沒有上面圖形流暢,用setTimeout會有卡頓現(xiàn)象。

小結(jié)

本文主要介紹了在 Js 中五個不常用但很高級的方法,看完這篇文章希望對你學習有所幫助。最后祝大家周末愉快,我們下篇文章見。

以上就是JS中比較冷門但非常好用的方法總結(jié)的詳細內(nèi)容,更多關(guān)于JS方法總結(jié)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript圖像放大鏡效果實現(xiàn)方法詳解

    JavaScript圖像放大鏡效果實現(xiàn)方法詳解

    這篇文章主要介紹了JavaScript圖像放大鏡效果實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • js中for...in循環(huán)對象時輸出key值順序混亂問題解決

    js中for...in循環(huán)對象時輸出key值順序混亂問題解決

    很久之前就有前輩告訴我用for...in循環(huán)對象屬性的順序不是固定的,xiam?這篇文章主要給大家介紹了關(guān)于js中for...in循環(huán)對象時輸出key值順序混亂問題解決方法,需要的朋友可以參考下
    2023-11-11
  • bootstrap中selectpicker下拉框使用方法實例

    bootstrap中selectpicker下拉框使用方法實例

    這篇文章主要給大家介紹了關(guān)于bootstrap中selectpicker下拉框使用的相關(guān)資料,文中通過示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • js實現(xiàn)最短的XML格式化工具實例

    js實現(xiàn)最短的XML格式化工具實例

    這篇文章主要介紹了js實現(xiàn)最短的XML格式化工具,實例分析了基于jquery-latest.js實現(xiàn)XML代碼格式化的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • JS實現(xiàn)側(cè)懸浮浮動實例代碼

    JS實現(xiàn)側(cè)懸浮浮動實例代碼

    這篇文章主要介紹了JS實現(xiàn)側(cè)懸浮浮動實例代碼,有需要的朋友可以參考一下
    2013-11-11
  • 使用JavaScript實現(xiàn)簡單圖像放大鏡效果

    使用JavaScript實現(xiàn)簡單圖像放大鏡效果

    圖像放大鏡在很多網(wǎng)站中都扮演著重要的角色,大多數(shù)開發(fā)人員使用?jquery?來創(chuàng)建圖像放大鏡。在本教程中,我將向大家展示如何使用?HTML、CSS?和?JavaScript?制作一個簡單的圖像放大鏡,需要的可以參考一下
    2022-08-08
  • 詳解ES6系列之私有變量的實現(xiàn)

    詳解ES6系列之私有變量的實現(xiàn)

    這篇文章主要介紹了詳解ES6系列之私有變量的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 基于javascript實現(xiàn)全國省市二級聯(lián)動下拉選擇菜單

    基于javascript實現(xiàn)全國省市二級聯(lián)動下拉選擇菜單

    這篇文章主要介紹了基于javascript實現(xiàn)全國省市二級聯(lián)動下拉選擇菜單,以一個完整實例形式較為詳細的分析了js實現(xiàn)省市二級聯(lián)動下拉菜單的實現(xiàn)技巧,非常簡單實用,需要的朋友可以參考下
    2016-01-01
  • JS+CSS實現(xiàn)動態(tài)時鐘

    JS+CSS實現(xiàn)動態(tài)時鐘

    這篇文章主要為大家詳細介紹了JS+CSS實現(xiàn)動態(tài)時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • JS 中document.URL 和 windows.location.href 的區(qū)別

    JS 中document.URL 和 windows.location.href 的區(qū)別

    實際上,document 和 windows 這兩個對象的區(qū)別已經(jīng)包含了這個問題的答案。
    2009-11-11

最新評論

辉南县| 莫力| 双辽市| 巴里| 余干县| 湛江市| 庄河市| 临高县| 五台县| 肥东县| 涡阳县| 同江市| 凤山县| 平顺县| 中西区| 双柏县| 杂多县| 阆中市| 芜湖市| 宕昌县| 巩义市| 周口市| 文化| 皋兰县| 灵台县| 玉树县| 沈阳市| 黎城县| 莲花县| 黄浦区| 新泰市| 睢宁县| 偃师市| 宝坻区| 微博| 土默特左旗| 惠来县| 翼城县| 溧阳市| 石林| 闸北区|