Intersection Observer API
1.注意点 一般都是后端返回数据,

this.$nextTick(() => {
this.handleScroll();
});
确保dom加载完成触发我们定制的handleScroll handleScroll() {
const containerRect = this.$refs.container.getBoundingClientRect();
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
}); const imgs = this.$refs.container.querySelectorAll('img');
imgs.forEach((img) => {
observer.observe(img);
});
}, <template>
<view ref="container" @scroll="handleScroll">
<image v-for="image in images" :key="image.id" :src="data:image.src" data-src="加载时的占位图" lazy />
</view>
</template> <style>
.container {
height: 100vh;
overflow-y: scroll;
}
</style>
Scroll Event
this.$nextTick(() => {
this.handleScroll();
}); handleScroll() {
const containerRect = this.$refs.container.getBoundingClientRect();
const imgs = this.$refs.container.querySelectorAll('img'); imgs.forEach((img) => {
const imgRect = img.getBoundingClientRect();
if (imgRect.top >= containerRect.top && imgRect.bottom <= containerRect.bottom) {
img.src = img.dataset.src;
}
});
}, <template>
<view ref="container" @scroll="handleScroll">
<image v-for="image in images" :key="image.id" :src="data:image.src" data-src="加载时的占位图" lazy />
</view>
</template> <style>
.container {
height: 100vh;
overflow-y: scroll;
}
</style>
uni.createSelectorQuery
 this.$nextTick(() => {
this.handleScroll();
});
handleScroll() {
const containerRect = uni.createSelectorQuery().select('.container').boundingClientRect();
const imgs = uni.createSelectorQuery().selectAll('.container image');
containerRect.exec((rect) => {
imgs.exec((nodes) => {
nodes.forEach((node, index) => {
const imgRect = node.boundingClientRect;
if (imgRect.top >= rect.top && imgRect.bottom <= rect.bottom) {
this.images[index].src = this.images[index].src; // 触发图片加载
}
});
});
});
},
注册全局指令
import lazyImg from './lazyImg';
Vue.directive('lazy-img', lazyImg); // lazyImg.js export default {
mounted(el, binding) {
const options = {
root: null,
rootMargin: '0px',
threshold: 0.1,
}; let hasLoaded = false; // 标记图片是否已加载 const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting && !hasLoaded) { // 添加判断,当图片未加载时触发
const img = new Image();
img.src = binding.value; img.onload = () => {
el.setAttribute('src', binding.value);
observer.unobserve(el);
hasLoaded = true; // 标记图片已加载
};
}
});
}, options); observer.observe(el);
},
};

js图片懒加载,在不做分页的情况下的解决方案的更多相关文章

  1. JS图片懒加载

    简介 当页面图片太多时,加载速度就会很慢.尤其是用2G/3G/4G访问页面,不仅页面慢,而且还会用掉很多流量.图片懒加载的原理就是将页面内所有需要加载的图片全部换成一张默认的图片(一般尺寸很小),只有 ...

  2. js 图片懒加载

    图片懒加载(图片出现在可视区域再加载) 兼容性:兼容目前流行的全部浏览器,包括:兼容到IE6) 使用方法: 引入相应的js文件<script src="js/lazy.js" ...

  3. 【前端优化】js图片懒加载及优化

    一.前言 为啥要对图片使用懒加载?我们首先来聊聊这个问题,对于页面来说架子啊速度影响着最大的就是图片,一张普通的图片可以达到4-5M的大小,而代码压缩也就只有几十KB.当页面图片过多的时候,页面加载速 ...

  4. js图片懒加载(滚动加载)是否生效

    一.什么是懒加载? 对未出现在视野范围内的图片先不进行加载,等到出现在视野范围才去加载. 二.为什么使用懒加载? 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 理论性知识大家都有自 ...

  5. js图片懒加载(滚动加载)判断是否生效

    一.什么是懒加载? 对未出现在视野范围内的图片先不进行加载,等到出现在视野范围才去加载. 二.为什么使用懒加载? 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 理论性知识大家都有自 ...

  6. web性能优化之js图片懒加载

    html <div class="container"> <ul> <li> <div id="first" clas ...

  7. js——图片懒加载

    <img class="js-lazy-image centered" src="./img/dog-running.svg" width="4 ...

  8. 原生js图片懒加载特效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. js原生图片懒加载 或 js原生图片预加载,html标签自定义属性

    使用原声js来实现图片预加载,或图片懒加载,小伙伴们可以根据项目需要来结合vue或者是react来进行修改. 一.什么是图片懒加载或什么是图片预加载 当访问一个页面的时候,先把img元素或是其他元素的 ...

  10. 对于富文本编辑器中使用lazyload图片懒加载

    使用lazyload.js图片懒加载的作用是给用户一个好的浏览体验,同时对服务器减轻了压力,当用户浏览到该图片的时候再对图片进行加载,项目中使用lazyload的时候需要将图片加入data-orgin ...

随机推荐

  1. #博弈论#Poj 2505 A multiplication game

    题目 给你一个整数\(n\),你从1开始乘,乘2-9之间的任意一个数. 最先得到大于等于\(n\)的数的人胜利.Stan先手Ollie后手. 那么,请问给你一个数\(n\),Stan和Ollie都足够 ...

  2. OpenHarmony 3.1 Release版本关键特性解析——OpenHarmony新音视频引擎——HiStreamer

    OpenAtom OpenHarmony(以下简称"OpenHarmony")是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景 ...

  3. SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST 或 ROWNUM 子句的使用

    SQL DELETE 语句 SQL DELETE 语句用于删除表中的现有记录. DELETE 语法 DELETE FROM 表名 WHERE 条件; 注意:在删除表中的记录时要小心!请注意DELETE ...

  4. Buffer 与 Mat 互转

    Linux系统做音视频开发,很多时候要用到opencv,就需要把图片Buffer数据转换成Mat对象来使用 Buffer 转 Mat Mat Buffer2Mat(unsigned char* buf ...

  5. 深入理解MD5算法:原理、应用与安全

    第一章:引言 导言 在当今数字化时代,数据安全和完整性变得至关重要.消息摘要算法是一种用于验证数据完整性和安全性的重要工具.在众多消息摘要算法中,MD5(Message Digest Algorith ...

  6. 报表如何批量导出成 excel 文件

    需求说明 报表展现后可以通过工具栏中的导出按钮将当前展现的报表导出成 excel 文件,但是在实际使用中通常会要求报表不需要展现,直接通过一些操作将报表导出成 excel 文件,并且往往会要求批量导出 ...

  7. 纯钧chunjun的http-x插件修复

    简介 chunjun是一款基于flink的开源数据同步工具,官方文档,其提供了很多flink官方未提供的插件供大家来使用,特别是达梦插件在国产化环境中很方便! 本次介绍的是chunjun中的一款htt ...

  8. 元素类型 “item” 相关联的 “name” 属性值不能包含 ‘<’ 字符

    Android构建时报错: app:lintVitalRelease[Fatal Error] :3:214: 与元素类型 "item" 相关联的 "name" ...

  9. mybatis generator生成mapper接口后的代理类,很方便使用。

    1.spring 配置: <bean id="superMapperProxy" class="com.qws.v1.daoImpl.MapperProxy&quo ...

  10. 学Windows批处理第一天:使用批处理命令生成一个文件并写入内容

    脚本功能:1.生成一个文件,文件名格式为:yyyymmddhhmmss 2.文件中写入一段文本 操作步骤:1.新建一个文本文档(txt格式) 2.修改文件名为任意名称(我的叫create_file), ...