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. 03 jQuery属性控制

    03 jQuery属性控制 属性相关的控制主要有以下几个功能 val() => 处理value属性 text() => 处理innerText html() => 处理innerHT ...

  2. SQL 递归核心思想(递归思维)

    目前很缺递归思维,主要是算法代码写得少,本篇记录下以 PostgreSQL 代码举例(主要是非常喜欢这款性能小钢炮数据库). 树状查询不多说,很简单大家基本都会,主要讲 cte 代码递归实现不同需求. ...

  3. #dp#nssl 1478 题

    分析 设\(f[i]\)表示第\(i\)个是否幸存,\(dp[i][j]\)表示若第\(i\)个幸存,第\(j\)个是否必死 倒序枚举人,如果存在\(dp[i][a[x]],dp[i][b[x]]\) ...

  4. #树状数组,dp#洛谷 3506 [POI2010]MOT-Monotonicity 2

    题目 给出\(N\)个正整数\(a[1..N]\),再给出\(K\)个关系符号(>.<或=)\(s[1..k]\). 选出一个长度为\(L\)的子序列(不要求连续),要求这个子序列的第\( ...

  5. #K-D Tree#洛谷 2093 [国家集训队]JZPFAR

    题目 平面上有 \(n\) 个点.现在有 \(m\) 次询问,每次给定一个点 \((px, py)\) 和一个整数 \(k\), 输出 \(n\) 个点中离 \((px, py)\) 的距离第 \(k ...

  6. Centos8防火墙配置、端口、进程管理

    Centos8停用.启用.查看当前启用的端口 firewall-cmd --zone=public --add-port=5672/tcp --permanent # 开放5672端口 firewal ...

  7. c# assembly.GetManifestResourceStream找不到路径

    前言 最近发现一个问题,用assembly.GetManifestResourceStream去找资源路径xml的时候,发现找不到,然后有些xml资源又可以找到,这时候有两种思维来思考. 正文 第一种 ...

  8. Visual Studio 2019汇编报错 warning LNK4258: 指令“/ENTRY:main@0”与开关“/ENTRY:main”不兼容;已忽略

    Visual Studio 2019汇编报错 warning LNK4258: 指令"/ENTRY:main@0"与开关"/ENTRY:main"不兼容:已忽略 ...

  9. 我用这10招,能减少了80%的BUG

    前言 对于大部分程序员来说,主要的工作时间是在开发和修复BUG. 有可能修改了一个BUG,会导致几个新BUG的产生,不断循环. 那么,有没有办法能够减少BUG,保证代码质量,提升工作效率? 答案是肯定 ...

  10. KubeOperator技术方案

    KubeOperator技术方案 总体介绍︎ KubeOperator 是一个开源的轻量级 Kubernetes 发行版,专注于帮助企业规划.部署和运营生产级别的 Kubernetes 集群. Kub ...