国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

IntersectionObserve初試

LucasTwilight / 1185人閱讀

摘要:構造函數(shù)調用時,需要給它傳一個回調函數(shù)。當監(jiān)聽的元素進入可視區(qū)域或者從可視區(qū)域離開時,回調函數(shù)就會被調用。構造函數(shù)的返回值是一個觀察器實例。它是一個數(shù)組,每個成員都是一個門檻值,默認為,即交叉比例達到時觸發(fā)回調函數(shù)。

IntersectionObserve這個API,可能知道的人并不多(我也是最近才知道...),這個API可以很方便的監(jiān)聽元素是否進入了可視區(qū)域。


test
box

上圖代碼中,.box元素目前并不在可視區(qū)域(viewport)內,如何監(jiān)聽它進入可視區(qū)域內?

傳統(tǒng)做法是:監(jiān)聽scroll事件,實時計算.box距離viewport的top值:

const box = document.querySelector(".box");
const viewHeight = document.documentElement.clientHeight;

window.addEventListener("scroll", () => {
  const top = box.getBoundingClientRect().top;
  
  if (top < viewHeight) {
    console.log("進入可視區(qū)域");
  }
});

然而scroll事件會頻繁觸發(fā),因此我們還需要手動節(jié)流。

使用IntersectionObserve就非常方便了:

const box = document.querySelector(".box");
const intersectionObserver = new IntersectionObserver((entries) => {
  entries.forEach((item) => {
    if (item.isIntersecting) {
      console.log("進入可視區(qū)域");
    }
  })
});
intersectionObserver.observe(box);

IntersectionObserver API是異步的,不隨著目標元素的滾動同步觸發(fā),所以不會有性能問題。

IntersectionObserver構造函數(shù)
const io = new IntersectionObserver((entries) => {
  console.log(entries);
});

io.observe(dom);

調用IntersectionObserver時,需要給它傳一個回調函數(shù)。當監(jiān)聽的dom元素進入可視區(qū)域或者從可視區(qū)域離開時,回調函數(shù)就會被調用。

注意: 第一次調用new IntersectionObserver時,callback函數(shù)會先調用一次,即使元素未進入可視區(qū)域。

構造函數(shù)的返回值是一個觀察器實例。實例的observe方法可以指定觀察哪個 DOM 節(jié)點。

// 開始觀察
io.observe(document.getElementById("example"));

// 停止觀察
io.unobserve(element);

// 關閉觀察器
io.disconnect();
IntersectionObserverEntry對象

callback函數(shù)被調用時,會傳給它一個數(shù)組,這個數(shù)組里的每個對象就是當前進入可視區(qū)域或者離開可視區(qū)域的對象(IntersectionObserverEntry對象)

這個對象有很多屬性,其中最常用的屬性是:

target: 被觀察的目標元素,是一個 DOM 節(jié)點對象

isIntersecting: 是否進入可視區(qū)域

intersectionRatio: 相交區(qū)域和目標元素的比例值,進入可視區(qū)域,值大于0,否則等于0

options

調用IntersectionObserver時,除了傳一個回調函數(shù),還可以傳入一個option對象,配置如下屬性:

threshold: 決定了什么時候觸發(fā)回調函數(shù)。它是一個數(shù)組,每個成員都是一個門檻值,默認為[0],即交叉比例(intersectionRatio)達到0時觸發(fā)回調函數(shù)。用戶可以自定義這個數(shù)組。比如,[0, 0.25, 0.5, 0.75, 1]就表示當目標元素 0%、25%、50%、75%、100% 可見時,會觸發(fā)回調函數(shù)。

root: 用于觀察的根元素,默認是瀏覽器的視口,也可以指定具體元素,指定元素的時候用于觀察的元素必須是指定元素的子元素

rootMargin: 用來擴大或者縮小視窗的的大小,使用css的定義方法,10px 10px 30px 20px表示top、right、bottom 和 left的值

const io = new IntersectionObserver((entries) => {
  console.log(entries);
}, {
  threshold: [0, 0.5],
  root: document.querySelector(".container"),
  rootMargin: "10px 10px 30px 20px",
});
懶加載

圖片懶加載的原理就是:給img標簽一個自定義屬性,用來記錄真正的圖片地址。默認img標簽只加載一個占位符。當圖片進入可視區(qū)域時,再把img的src屬性更換成真正的圖片地址。

const intersectionObserver = new IntersectionObserver((entries) => {
    entries.forEach((item) => {
        if (item.isIntersecting) {
            item.target.src = item.target.dataset.src;
            // 替換成功后,停止觀察該dom
            intersectionObserver.unobserve(item.target);
        }
    })
  }, {
      rootMargin: "150px 0px" // 提前150px進入可視區(qū)域時就加載圖片,提高用戶體驗
    });

const imgs = document.querySelectorAll("[data-src]");
imgs.forEach((item) => {
    intersectionObserver.observe(item)
});
打點上報

前端頁面經(jīng)常有上報數(shù)據(jù)的需求,比如統(tǒng)計頁面上的某些元素是否被用戶查看,點擊。這時,我們就可以封裝一個Log組件,用于當元素進入可視區(qū)域時,就上報數(shù)據(jù)。
以React為例,我們希望:被Log組件包裹的元素,進入可視區(qū)域后,就向后臺發(fā)送{ appid: 1234, type: "news"}數(shù)據(jù)

 console.log("log")}
>
  
console.log("news")}>

其他內容

import React, { Component } from "react";
import PropTypes from "prop-types";

class Log extends Component {
  static propTypes = {
    log: PropTypes.object
  };

  constructor(props) {
    super(props);
    this.io = null;
    this.ref = React.createRef();
  }

  componentDidMount() {
    this.io = new IntersectionObserver(
      ([entry]) => {
        if (entry.isIntersecting) {
          console.log("進入可視區(qū)域,將要發(fā)送log數(shù)據(jù)", this.props.log);
          sendLog(this.props.log);
          this.io.disconnect();
        }
      }
    );

    this.io.observe(this.ref.current);
  }

  componentWillUnmount() {
    this.io && this.io.disconnect();
  }

  render() {
    // 把log屬性去掉,否則log屬性也會渲染在div上 
    // 
const { log, ...props } = this.props; return (
{this.props.children}
) } } export default Log
兼容性

safari并不支持該API,因此為了兼容主流瀏覽器,我們需要引入polyfill
intersection-observer

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102240.html

相關文章

  • 【2022考研最后40天】要注意這4個時間節(jié)點和這5件事情

    摘要:請考生務必妥善保管個人網(wǎng)報用戶名密碼及準考證居民身份證等證件,避免泄露丟失造成損失。自主劃線院校會在月陸續(xù)公布初試成績基本要求。鎖定時間到達后,如招生單位未明確受理意見,鎖定解除,考生可繼續(xù)填報其他志愿。 ...

    jaysun 評論0 收藏0
  • 初試Echarts (一)

    摘要:是基于圖畫,可視化數(shù)據(jù)工具。如圖更多的配置可以看官方的配置項手冊,每一項都有很詳細的說明。參考本地創(chuàng)建了文件用于儲存數(shù)據(jù)然后異步請求。因為使用的,所以引入了一個。使用的非常好用。 Echarts.js是基于canvas 圖畫,可視化數(shù)據(jù)工具。 Echarts官方案例 官網(wǎng)下載Echarts 然后引入官網(wǎng)下載Echarts.js ECharts 入門示例--柱...

    liangdas 評論0 收藏0
  • 初試小刀自我簡歷小程序

    摘要:附上個人簡歷小程序圖,做得怎么樣,大家可以微信掃描體驗下,多指教下。小程序開發(fā)資源匯總小程序開發(fā)框架在里面找了找,和比較火,畢竟是騰訊官方的開源,故我選擇了。 >>>點擊獲取更多文章

    netmou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<