js图片懒加载,在不做分页的情况下的解决方案
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图片懒加载,在不做分页的情况下的解决方案的更多相关文章
- JS图片懒加载
简介 当页面图片太多时,加载速度就会很慢.尤其是用2G/3G/4G访问页面,不仅页面慢,而且还会用掉很多流量.图片懒加载的原理就是将页面内所有需要加载的图片全部换成一张默认的图片(一般尺寸很小),只有 ...
- js 图片懒加载
图片懒加载(图片出现在可视区域再加载) 兼容性:兼容目前流行的全部浏览器,包括:兼容到IE6) 使用方法: 引入相应的js文件<script src="js/lazy.js" ...
- 【前端优化】js图片懒加载及优化
一.前言 为啥要对图片使用懒加载?我们首先来聊聊这个问题,对于页面来说架子啊速度影响着最大的就是图片,一张普通的图片可以达到4-5M的大小,而代码压缩也就只有几十KB.当页面图片过多的时候,页面加载速 ...
- js图片懒加载(滚动加载)是否生效
一.什么是懒加载? 对未出现在视野范围内的图片先不进行加载,等到出现在视野范围才去加载. 二.为什么使用懒加载? 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 理论性知识大家都有自 ...
- js图片懒加载(滚动加载)判断是否生效
一.什么是懒加载? 对未出现在视野范围内的图片先不进行加载,等到出现在视野范围才去加载. 二.为什么使用懒加载? 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 理论性知识大家都有自 ...
- web性能优化之js图片懒加载
html <div class="container"> <ul> <li> <div id="first" clas ...
- js——图片懒加载
<img class="js-lazy-image centered" src="./img/dog-running.svg" width="4 ...
- 原生js图片懒加载特效
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js原生图片懒加载 或 js原生图片预加载,html标签自定义属性
使用原声js来实现图片预加载,或图片懒加载,小伙伴们可以根据项目需要来结合vue或者是react来进行修改. 一.什么是图片懒加载或什么是图片预加载 当访问一个页面的时候,先把img元素或是其他元素的 ...
- 对于富文本编辑器中使用lazyload图片懒加载
使用lazyload.js图片懒加载的作用是给用户一个好的浏览体验,同时对服务器减轻了压力,当用户浏览到该图片的时候再对图片进行加载,项目中使用lazyload的时候需要将图片加入data-orgin ...
随机推荐
- #贪心#洛谷 3173 [HAOI2009]巧克力
题目 分析 既然每一刀都要切,那肯定代价越大的要越早切, 考虑按代价降序排序,如果切了一行,求切列的时候贡献的行数就多了1. 代码 #include <cstdio> #include & ...
- 使用OHOS SDK构建freetype
参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone https://github.com/freetype/freetype.git ...
- 2020东京奥运会奖牌榜可视化分析(Pyechart)
数据获取和处理 从网页中获取各国的奖牌数量和排名以及奖牌类型(json格式). #奖牌榜数据 url = 'https://app-sc.miguvideo.com/vms-livedata/olym ...
- Qt加Opencv实现 梯度矫正 功能
废话: 有时候我们是从物品的斜上方拍摄的图片,看起来不直观,需要把视角拉正,这样的一个操作就叫做 梯度矫正,需要用到的技术是 Opencv 的 透视变换. 这个只是一个简单的演示demo,如果完善一下 ...
- 在linux上使用Qt开发动态库项目,怎么只生成一个so文件
背景: 在linux系统上,我们使用 Qt 开发动态库项目时,会默认生成四个文件:x.so .x.so.1 .x.so.1.0.x.so.1.0.0 四个文件,只有一个真实的so库,剩下的三个都是链 ...
- jenkins安装卸载和下载
环境 :docker容器 卸载 jenkins 1.rpm卸载rpm -e jenkins 2.检查是否卸载成功rpm -ql jenkins 3.彻底删除残留文件:find / -iname jen ...
- Python3学习--正则表达式
import rer = re.match("Chen\d+","Chen123ronghua123")r = re.match(".+", ...
- WPF开发随笔收录-查看PDF文件
一.前言 在项目的开发过程中,涉及到查看服务器生成的pdf报告文件的查看,起初的方案是通过spire.pdf这个库来将pdf文件转换成图片,然后在进行查看.但是经常被吐槽预览不清晰,后面上网发现了一个 ...
- LRU缓存及其实现
缓存是我们日常开发中来提高性能最直接的方式,经常会听到有人说:性能不行?是因为你没加缓存!常见的缓存有外部缓存服务以及程序内部缓存,外部缓存服务包括:Redis.Memcached等,内部缓存就是我们 ...
- .NET Emit 入门教程:第六部分:IL 指令:9:详解 ILGenerator 指令方法:运算操作指令(指令篇结束)
前言: 经过前面几篇的学习,我们了解到指令的大概分类,如: 参数加载指令,该加载指令以 Ld 开头,将参数加载到栈中,以便于后续执行操作命令. 参数存储指令,其指令以 St 开头,将栈中的数据,存储到 ...