摘要:構造函數(shù)調用時,需要給它傳一個回調函數(shù)。當監(jiān)聽的元素進入可視區(qū)域或者從可視區(qū)域離開時,回調函數(shù)就會被調用。構造函數(shù)的返回值是一個觀察器實例。它是一個數(shù)組,每個成員都是一個門檻值,默認為,即交叉比例達到時觸發(fā)回調函數(shù)。
IntersectionObserve這個API,可能知道的人并不多(我也是最近才知道...),這個API可以很方便的監(jiān)聽元素是否進入了可視區(qū)域。
testbox
上圖代碼中,.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
摘要:請考生務必妥善保管個人網(wǎng)報用戶名密碼及準考證居民身份證等證件,避免泄露丟失造成損失。自主劃線院校會在月陸續(xù)公布初試成績基本要求。鎖定時間到達后,如招生單位未明確受理意見,鎖定解除,考生可繼續(xù)填報其他志愿。 ...
摘要:是基于圖畫,可視化數(shù)據(jù)工具。如圖更多的配置可以看官方的配置項手冊,每一項都有很詳細的說明。參考本地創(chuàng)建了文件用于儲存數(shù)據(jù)然后異步請求。因為使用的,所以引入了一個。使用的非常好用。 Echarts.js是基于canvas 圖畫,可視化數(shù)據(jù)工具。 Echarts官方案例 官網(wǎng)下載Echarts 然后引入官網(wǎng)下載Echarts.js ECharts 入門示例--柱...
摘要:附上個人簡歷小程序圖,做得怎么樣,大家可以微信掃描體驗下,多指教下。小程序開發(fā)資源匯總小程序開發(fā)框架在里面找了找,和比較火,畢竟是騰訊官方的開源,故我選擇了。 >>>點擊獲取更多文章
閱讀 4078·2021-10-08 10:04
閱讀 3061·2021-08-11 11:20
閱讀 2731·2021-07-25 21:37
閱讀 2681·2019-08-30 12:44
閱讀 2306·2019-08-30 11:12
閱讀 1314·2019-08-26 13:45
閱讀 2338·2019-08-26 11:53
閱讀 3057·2019-08-26 11:32