首页 > 其他分享 >记录--聊聊图片预加载

记录--聊聊图片预加载

时间:2023-12-25 18:22:56浏览次数:26  
标签:const pageSize img -- 页面 聊聊 加载 图片

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

聊聊图片预加载

关于图片的加载,不同的需求有不同的实现,比如图片过多时候的懒加载,为了保证效果的预加载。

如何进行图片的预加载

前端实现图片的预加载,其实是利用了浏览器的缓存,我们通过 a 标签来提前加载图片,如下:

  const img = new Image() 
  img.src = '链接' 
  img.onload = function(){ 
      console.log('加载完成')
  }

预加载的策略

在实际的业务中,需求不同,加载的策略不尽相同。

场景一:贪婪加载

刚进入页面有 loading,需要将后面的图片全部加载完成。如进入 h5 游戏的时候,需要把后面用到的人物背景图片都加载出来。

这个时候我们不考虑带宽的问题,一次性加载所有的图片。

将每次加载图片封装成一次 promise:

new Promise((reslove,reject)=>{ 
    const img = new Image() 
    img.src = '链接' 
    img.onload = one rror = resolve 
 })

再使用 promise.all 进行全加载

Promise.all([...])

场景二:部分加载

正常展示当前页面,但是下个页面的图片可以先偷偷加载进来,同时不要影响当前页面正常图片的加载。

这时候我们需要考虑带宽,不能一次性使用加载图片拉满,这样会导致页面加载的图片加载不出来。可以使用批量加载,比如每次加载 5 张,加载完 5 张之后再加载下 5 张。这样如果当前页面如果有图片也可以正常展示加载。

具体实现类似分页一样,获取要加载图片里面的 5 张,进行加载,直到加载结束。

// 总任务 
function loadImages(list){ 
    const pageSize = 5 
    const pageNum = 0 
    return new Promise((reslove,reject)=>{ 
        function run(){ 
            Promise.all(genetateTasks(list,pageSize,paegNum)).then(()=>{ 
                pageNum++ 
                const hasLength = pageSize * pageNum 
                if(totalNum > hasLength){ 
                    run() 
                }else { 
                    reslove(true) 
                } }) 
           } 
           run() 
 }) }

子任务处理:

// 子任务 
function genetateTasks(list,pageSize,pageNum){
    const promiseArr = [] 
    const start = pageNum * pageSize 
    const end = (pageNum + 1) * pageSize - 1 
    for(let i = start;i<end;i++){ 
        const p = new Promise((reslove,reject)=>{ 
            const img = new Image() 
            img.src = list[i] 
            img.onload = img.onerror = reslove 
         }) 
         promiseArr.push(p) 
    } 
    return promiseArr 
}

注意点

  • 在移动端,如果使用贪婪加载,可能会导致你的 loading 图片都没有加载出来(因为都去加载预加载的图片去了),需要将加载图片的逻辑放在 window.load 事件之后
  • 在部分加载的时候,如果需要保证当前页面的效果,可以在当前页面图片加载之后再开始加载(可以使用 imagesloaded)

本文转载于:

https://juejin.cn/post/7312723056300015628

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:const,pageSize,img,--,页面,聊聊,加载,图片
From: https://www.cnblogs.com/smileZAZ/p/17926721.html

相关文章

  • 天池AI练习生计划 - 第三期数据分析入门与实践,火热进行中!通关赢取双重礼品!
    《Numpy实践》《Pandas实践》课程带您了解numpy与pandas的所有核心操作与特性;《Matplotlib实践》课程助您解决用python做数据可视化时面临的两大痛点。轻松来闯关,即可领取双重礼品~实训培训证书:通关两个关卡即可领取家用纯棉毛巾:通关全部关卡即可领取活动地址:https://tianchi.......
  • echart 宽度自适应
    created(){this.getEchartData()},getEchartData(){constparam={}this.$axios.get(url,param).then(res=>{if(res.data&&res.data.data){this.echartData=res.data.datathis......
  • mysql 定时 数据库备份并上传到另一台服务器上,上传结束并删除源文件
    首先总共有两个脚本:#!/bin/bash:主要用于进行数据库备份、压缩、删除,单独运行命令是:bash XXX.sh#!/usr/bin/expect:主要用于进行数据备份文件的上传,单独运行命令是:expectXXX.sh这两个脚本都需要具有777权限:chmod777XXX.sh分成两个脚本写的原因是:expect主要是用于ssh远程......
  • linux编译器:gcc/g++的使用
    原文连接:https://blog.csdn.net/weixin_72060925/article/details/131274627原文链接:https://blog.csdn.net/qq_65207641/article/details/128629904一、编辑器与编译器的区别vim是代码编辑器,代码编辑器的功能是让我们输入代码的。所以从这个角度出发,我们常见的记事本也可以......
  • Python——Html(HEAD头部)
    HTML中HEAD头部设置(了解)在HTML中,<head>元素是文档的头部部分,通常包含了一些关于文档的元信息和链接到外部资源的标签。以下是一些常见的<head>元素中使用的标签及其作用:<title>:设置网页的标题设置网页的标题,显示在浏览器的标题栏或标签页上。示例:<head><title>M......
  • 广东mes生产管理系统
    mes生产管理系统是面向制造企业执行层的生产信息化管理系统。它可以帮助企业实现制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、工作与设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成......
  • eCharts记录一柱形图案例
     option={color:'#8AE6C7',grid:{left:'50',right:'50',bottom:'50',containLabel:true},textStyle:{color:'rgba(0,0,0,.58)'},xAxis:{type:'catego......
  • Docker专题学习之相关概述
    前言其实第一次听说Docker还是好几年前,但是一直满足于当前的技术栈,无法突破自己的舒适圈,导致技术栈有些落后。今天正式开启一个新的专题学习,Docker容器技术~......
  • 给旗帜加文本
    1、首先打开原始素材.psd文件,在存一份psd文件到桌面上。2、使用横排文字工具,输入文本效果。3、栅格化文字图层,4、点击滤镜——扭曲——置换5、双击文字图层调成明暗度,按住alt键。6、再复制一层文字,图层模式为柔光或者叠加模式。......
  • jenkins如何添加ssh认证登录
    1.本地写代码,然后把代码上传到gitlab网站上,这里不赘诉,不会的请参考步骤参考:https://www.cnblogs.com/pingguomang/p/17926569.html 2.搭建jenkins,这里不赘诉3.找到一台服务器,生成一对公钥和私钥。这里不一定是你部署服务的那台节点的公钥和私钥,任意一个服务器都可以哈,只要是一......