首页 > 其他分享 >图片预加载

图片预加载

时间:2023-12-16 22:31:42浏览次数:27  
标签:const img pageSize 加载 图片 页面

前端实现图片的预加载,其实是利用了浏览器的缓存,我们通过 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)

标签:const,img,pageSize,加载,图片,页面
From: https://blog.51cto.com/u_15997490/8854628

相关文章

  • nginx启动、停止、重新加载
    原文:Windows下Nginx的启动、停止等命令_nginxwindows启动命令-CSDN博客启动:startnginx或nginx.exe      //前一个在后台运行,使用默认配置文件 nginx.exe-c配置文件       //指令配置文件 停止:nginx-sstop或nginx-squit //这好像停不......
  • C# OCR图片文字识别
    博主这里采用了两种库进行文字识别,一种是“Spire.OCR”,另一种是“PaddleOCRSharp”,这两种库,都可以直接到Nuget中去安装。 这里要注意一下,PaddleOCRSharp库是可以直接安装使用的,但是Spire.OCR库在安装后,需要将下载目录“nuget\packages\spire.ocr\1.8.0\runtimes\win-x64\nativ......
  • css 让多张图片并排显示
    .container{  display:flex;  justify-content:space-between; }   .img-wrapper{  width:30%; }   .img-wrapperimg{  width:100%;  height:auto; }首先,我们需要给图片所在的容器设置一个display:flex属性,这样三张图片......
  • android webview加载assets目录中的html
     加载目录:Stringurl="file:///android_asset/web/index.html";webView.loadUrl(url);完整代码:packagecom.example.h5application;importandroidx.appcompat.app.AppCompatActivity;importandroid.app.AlertDialog;importandroid.app.ProgressDialog;......
  • 懒加载是啥
    前端懒加载懒加载是一种常见的页面优化技术,主要用于延迟加载页面上的资源。在传统的网页加载中,当用户打开一个网页时,所有的图片、视频、脚本等资源都会被一次性加载。这会导致页面加载时间过长,尤其是对于大型的网页和资源丰富的网站来说。而且,如果用户并没有滚动到需要加载的资源附......
  • 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义
    原文链接:https://blog.csdn.net/weixin_45488182/article/details/132537085网上的资料,大都是因为版本号不一致,我检查了很多遍,我这边版本号是12.0.1与12.0.2,config里是12.0.0,应该算是一致的吧。并且清理重新生成后,就不会报这个错。程序可以正常运行了。今天终于解决了这个问题,......
  • 用C++调用Windows.Media.Ocr接口实现图片的OCR识别
    这个接口最开始是给UWP程序用的。C++里需要用C++/WinRT方式调用。默认参数的识别率也不是很高的样子。只支持Win10+。#include<winrt/Windows.Storage.h>#include<winrt/Windows.Storage.Streams.h>#include<winrt/Windows.Graphics.Imaging.h>#include<winrt/Windows.Me......
  • iPhone小知识:图片和PDF互转
    此功能属于iphone手机自带功能,只需要设置即可实现,无需下载第三方来源的APP1、图片转PDF 步骤3步骤4步骤5步骤6选择照片,点击左下角共享图标点击【打印】再点击右上角共享图标选择共享给微信此时已经变为PDF格式,可发送给好友 2、PDF转图片默......
  • 小程序在线图片加水印
    参考:https://www.freesion.com/article/5065160137/https://blog.csdn.net/Li_Ning21/article/details/134050960 MarkwaterMark.jsfunctioncreatePromise(callback){returnnewPromise((resolve,reject)=>{callback(resolve,reject)})}/***......
  • 占位图片(Placeholder Image)
    一、引言在网页设计和开发中,占位图片(PlaceholderImage)是一种常见的技术手段,用于在用户上传图片之前或者图片加载失败时,展示一个临时替代的图片,以提高用户体验。本文将详细介绍占位图片的实现原理和实践应用,并通过实例给出不同场景下的解决方案。占位图片生成器|一个覆盖广......