iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >vue如何判断元素是否在可视区域
  • 375
分享到

vue如何判断元素是否在可视区域

2023-07-04 16:07:06 375人浏览 薄情痞子
摘要

今天小编给大家分享一下Vue如何判断元素是否在可视区域的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。三种方法:1、利用off

今天小编给大家分享一下Vue如何判断元素是否在可视区域的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

三种方法:1、利用offsetTop和scrollTop获取元素的位置,判断是否小于等于viewPortHeight(视图端口距离)即可。2、利用getBoundinGClientRect()判断,语法“元素对象.getBoundingClientRect()”。3、利用IntersectionObserver判断,只需要检查指定元素和可视区域是否重叠即可。

可视区域是什么

可视区域即我们浏览网页的设备肉眼可见的区域,如下图

vue如何判断元素是否在可视区域

在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如:

  • 图片的懒加载

  • 列表的无限滚动

  • 计算广告元素的曝光情况

  • 可点击链接的预加载

判断元素是否在可视区域的三种方式

判断一个元素是否在可视区域,我们常用的有三种办法:

  • offsetTop、scrollTop

  • getBoundingClientRect

  • Intersection Observer

方法1、offsetTop、scrollTop

offsetTop,元素的上外边框至包含元素的上内边框之间的像素距离,其他offset属性如下图所示:

vue如何判断元素是否在可视区域

下面再来了解下clientWidthclientHeight

  • clientWidth:元素内容区宽度加上左右内边距宽度,即clientWidth = content + padding

  • clientHeight:元素内容区高度加上上下内边距高度,即clientHeight = content + padding

这里可以看到client元素都不包括外边距

最后,关于scroll系列的属性如下:

  • scrollWidthscrollHeight 主要用于确定元素内容的实际大小

  • scrollLeftscrollTop 属性既可以确定元素当前滚动的状态,也可以设置元素的滚动位置

    • 垂直滚动 scrollTop > 0

    • 水平滚动 scrollLeft > 0

  • 将元素的 scrollLeftscrollTop 设置为 0,可以重置元素的滚动位置

注意

  • 上述属性都是只读的,每次访问都要重新开始

下面再看看如何实现判断:

公式如下:

el.offsetTop - document.documentElement.scrollTop <= viewPortHeight

代码实现:

function isInViewPortOfOne (el) {
   // viewPortHeight 兼容所有浏览器写法
   const viewPortHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
   const offsetTop = el.offsetTop
   const scrollTop = document.documentElement.scrollTop
   const top = offsetTop - scrollTop
   return top <= viewPortHeight
}

方法2:getBoundingClientRect

返回值是一个 DOMRect对象,拥有left, top, right, bottom, x, y, width, 和 height属性。

const target = document.querySelector('.target');
const clientRect = target.getBoundingClientRect();
console.log(clientRect);

// {
//   bottom: 556.21875,
//   height: 393.59375,
//   left: 333,
//   right: 1017,
//   top: 162.625,
//   width: 684
// }

属性对应的关系图如下所示:

vue如何判断元素是否在可视区域

当页面发生滚动的时候,topleft属性值都会随之改变

如果一个元素在视窗之内的话,那么它一定满足下面四个条件:

  • top 大于等于 0

  • left 大于等于 0

  • bottom 小于等于视窗高度

  • right 小于等于视窗宽度

实现代码如下:

function isInViewPort(element) {
 const viewWidth = window.innerWidth || document.documentElement.clientWidth;
 const viewHeight = window.innerHeight || document.documentElement.clientHeight;
 const {
   top,
   right,
   bottom,
   left,
 } = element.getBoundingClientRect();

 return (
   top >= 0 &&
   left >= 0 &&
   right <= viewWidth &&
   bottom <= viewHeight
 );
}

方法3:Intersection Observer

Intersection Observer 即重叠观察者,从这个命名就可以看出它用于判断两个元素是否重叠,因为不用进行事件的监听,性能方面相比getBoundingClientRect会好很多

使用步骤主要分为两步:创建观察者和传入被观察者

创建观察者

const options = {
 // 表示重叠面积占被观察者的比例,从 0 - 1 取值,
 // 1 表示完全被包含
 threshold: 1.0,
 root:document.querySelector('#scrollArea') // 必须是目标元素的父级元素
};

const callback = (entries, observer) => { ....}

const observer = new IntersectionObserver(callback, options);

通过new IntersectionObserver创建了观察者 observer,传入的参数 callback 在重叠比例超过 threshold 时会被执行`

关于callback回调函数常用属性如下:

// 上段代码中被省略的 callback
const callback = function(entries, observer) {
   entries.forEach(entry => {
       entry.time;               // 触发的时间
       entry.rootBounds;         // 根元素的位置矩形,这种情况下为视窗位置
       entry.boundingClientRect; // 被观察者的位置举行
       entry.intersectionRect;   // 重叠区域的位置矩形
       entry.intersectionRatio;  // 重叠区域占被观察者面积的比例(被观察者不是矩形时也按照矩形计算)
       entry.target;             // 被观察者
   });
};

传入被观察者

通过 observer.observe(target) 这一行代码即可简单的注册被观察者

const target = document.querySelector('.target');
observer.observe(target);

案例分析

实现:创建了一个十万个节点的长列表,当节点滚入到视窗中时,背景就会从红色变为黄色

html结构如下:

<div class="container"></div>

CSS样式如下:

.container {
   display: flex;
   flex-wrap: wrap;
}
.target {
   margin: 5px;
   width: 20px;
   height: 20px;
   background: red;
}

container插入1000个元素

const $container = $(".container");

// 插入 100000 个 <div class="target"></div>
function createTargets() {
 const htmlString = new Array(100000)
   .fill('<div class="target"></div>')
   .join("");
 $container.html(htmlString);
}

这里,首先使用getBoundingClientRect方法进行判断元素是否在可视区域

function isInViewPort(element) {
   const viewWidth = window.innerWidth || document.documentElement.clientWidth;
   const viewHeight =
         window.innerHeight || document.documentElement.clientHeight;
   const { top, right, bottom, left } = element.getBoundingClientRect();

   return top >= 0 && left >= 0 && right <= viewWidth && bottom <= viewHeight;
}

然后开始监听scroll事件,判断页面上哪些元素在可视区域中,如果在可视区域中则将背景颜色设置为yellow

$(window).on("scroll", () => {
   console.log("scroll !");
   $targets.each((index, element) => {
       if (isInViewPort(element)) {
           $(element).css("background-color", "yellow");
       }
   });
});

通过上述方式,可以看到可视区域颜色会变成黄色了,但是可以明显看到有卡顿的现象,原因在于我们绑定了scroll事件,scroll事件伴随了大量的计算,会造成资源方面的浪费

下面通过Intersection Observer的形式同样实现相同的功能

首先创建一个观察者

const observer = new IntersectionObserver(getYellow, { threshold: 1.0 });

getYellow回调函数实现对背景颜色改变,如下:

function getYellow(entries, observer) {
   entries.forEach(entry => {
       $(entry.target).css("background-color", "yellow");
   });
}

最后传入观察者,即.target元素

$targets.each((index, element) => {
   observer.observe(element);
});

可以看到功能同样完成,并且页面不会出现卡顿的情况

以上就是“vue如何判断元素是否在可视区域”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: vue如何判断元素是否在可视区域

本文链接: https://www.lsjlt.com/news/346489.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue如何判断元素是否在可视区域
    今天小编给大家分享一下vue如何判断元素是否在可视区域的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。三种方法:1、利用off...
    99+
    2023-07-04
  • vue怎么判断元素是否在可视区域
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。可视区域是什么可视区域即我们浏览网页的设备肉眼可见的区域,如下图在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而...
    99+
    2023-05-14
    Vue vue3 vue.js
  • 如何判断元素是否在可视区域中IntersectionObserver
    本文小编为大家详细介绍“如何判断元素是否在可视区域中IntersectionObserver”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何判断元素是否在可视区域中IntersectionObserver”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-07-05
  • JS判断元素是否在可视区域技巧详解
    目录前言实现方式offsetTop、scrollTop注意getBoundingClientRect前言 在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一...
    99+
    2022-12-20
    JS判断元素可视区域 JS 元素可视区域
  • 面试判断元素是否在可视区域中IntersectionObserver详解
    目录前言应用场景使用结语前言 我们面试中常见的一个问题,如何判断元素是否在可视区域中(即视口区域)?第一时间想到的肯定就是通过,offsetHeight、clientHeight、...
    99+
    2023-03-09
    IntersectionObserver可视区域 IntersectionObserver元素判断
  • IntersectionObserver判断是否在可视区域详解
    目录前言概念使用注意前言 在日常的开发过程中,有时候会有一些要求判断节点是否进入可视化区域的需求。例如:判断信息是否在可视区域曝光再进行曝光,图片懒加载等。通常我们可以通过scrol...
    99+
    2022-11-13
    IntersectionObserver 判断可视区域 IntersectionObserver 可视区域
  • jQuery如何判断元素是否存在
    这篇文章主要介绍了jQuery如何判断元素是否存在,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。判断元素是否存在<script&nbs...
    99+
    2024-04-02
  • js如何对元素可视区域进行判定
    目录前言方案介绍使用 getBoundingClientRect使用 scrollTop 与 offsetTop使用 IntersectionObserver注意事项前言 在前端开发...
    99+
    2023-05-17
    js 元素可视区域判定 js 元素可视区域
  • jquery如何判断form元素是否存在
    这篇文章主要讲解了“jquery如何判断form元素是否存在”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery如何判断form元素是否存在”吧! ...
    99+
    2024-04-02
  • jquery如何判断dom元素是否存在
    这篇文章主要介绍jquery如何判断dom元素是否存在,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! jquery判断dom元素是否存在的方法:1、使用“...
    99+
    2024-04-02
  • es6如何判断元素是否在数组中
    本篇内容介绍了“es6如何判断元素是否在数组中”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • jQuery如何判断一个元素是否存在
    这篇文章主要介绍了jQuery如何判断一个元素是否存在,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。判断一个元素是否存在if ($('#someDiv...
    99+
    2023-06-27
  • jquery如何判断某元素是否有子元素
    本篇内容主要讲解“jquery如何判断某元素是否有子元素”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery如何判断某元素是否有子元素”吧! ...
    99+
    2024-04-02
  • jquery如何判断数组元素是否存在
    在jquery中判断数组元素是否存在的方法:1.新建html项目,引入jquery;2.在项目中定义数组;3.使用$.inArray方法判断元素是否存在;具体步骤如下:首先,在新建一个html项目,在项目中引入jquery;<scri...
    99+
    2024-04-02
  • javascript如何判断元素是否在数组中
    这篇文章将为大家详细讲解有关javascript如何判断元素是否在数组中,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 方法:1、使用inde...
    99+
    2024-04-02
  • nodejs判断元素是否存在在json
    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得JavaScript可以用于服务端编程。相比于传统的后端开发,Node.js能够高效地处理大量并发请求,这使得它在现代Web应用程序中得到广泛的应用。在No...
    99+
    2023-05-17
  • jquery如何判断元素是否只读
    这篇文章主要介绍“jquery如何判断元素是否只读”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“jquery如何判断元素是否只读”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • jquery如何判断元素是否有class
    这篇文章主要介绍“jquery如何判断元素是否有class”,在日常操作中,相信很多人在jquery如何判断元素是否有class问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jquery如何判断元素是否有cl...
    99+
    2023-07-05
  • php如何判断是否是数组元素
    本篇内容介绍了“php如何判断是否是数组元素”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php判断是否是数组元素的方法:1、新建一个php...
    99+
    2023-07-04
  • jquery如何判断元素是否被focus
    本文小编为大家详细介绍“jquery如何判断元素是否被focus”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery如何判断元素是否被focus”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先,我们需要...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作