是什么?

  浏览器会缓存静态资源(hmtl/css/img等)。图片预加载就是让浏览器提前缓存图片,提升用户体验。

浏览器什么情况下会下载图片?

  1,解析到html中img的src属性的时候

  2,解析到background-image属性的url()的时候

  3,在js中创建Image对象的之后给他的src属性赋上一个url之后浏览器就会发出请求。html中的img标签本质就是Image对象。html中每出现一个img标签,就有一个Image对象被创建。

 // html
<img src="https://www.xxx.com/static/img/xxx.png" alt="">
// css
background:url('./src/static/images/goods1.png')
// js 在js中创建Image对象后给它赋上src属性的时候浏览器也会下载src指向的资源。
new Image().src = "https://www.xxx.com/static/img/xxx.png"

在哪里个阶段使用预加载?

  反思:浏览器拿到一个HTML的时候第一件事情就是创建document对象然后解析HTML标签生成DOM树,当他解析到img标签的src属性的时候会立即向src指向的地址发出请求。这就代表我们定义在一个页面当中的img在页面初始的时候原本就会被统统下载。那我们为什么还要去自己下载这些图片?

  结论:在index.html下载其他页面中需要用到的图片。

什么场景需要使用预加载?

  像xx公司官方网站,这种展示类的页面中一般会有用于展示实力的比较大的轮播图和背景图。把这些图片提前下载下来,就能避免页面打开半天都是白茫茫的一片。

实现方式

  实现预加载要做的只有一件事情,那就是在用到图片之前让浏览器提前缓存图片。

  通过html:在index页面末尾定义多个img标签,达到提前下载的目的。

 // 批量定义要下载的图片资源,定义display 阻止他们渲染到页面
<img src="xxx.xxx.xxx/static/img/xx1.xxx" style="display: none">
<img src="xxx.xxx.xxx/static/img/xx2.xxx" style="display: none">
<img src="xxx.xxx.xxx/static/img/xx3.xxx" style="display: none">

  通过css:在css文件中通过background-image属性批量下载图片

<div id="preload" style="display:none"></div>
#preload{
  // url中的图片会依次次请求过来。
background:url('./src/static/images/goods1.png');
background:url('./src/static/images/goods2.png');
background:url('./src/static/images/goods3.png');
}

  通过js:批量创建Image对象,为它们的src属性赋上我们需要下载的图片URL

// 需要下载的URL列表
var imgList = ['./src/static/images/goods1.png'];
loadImg(imgList);
function loadImg(imgList){
  imgList.map(function(imgSrc,index){
  var img = new Image();
  // 记录自己是第几个下载的图片
  img.num = index+1;
  console.log(img.num);
  // 绑定加载完成事件处理函数
  img.addEventListener("load",loadHandler);
  // 这里为img指定src之后浏览器就会发出请求
  img.src = imgSrc;
  })
}
function loadHandler(e){
  /*这里可以通过this拿到加载好的图片对象,可以对它为所欲为。*/
  // 注销事件,释放内存。
  this.removeEventListener("load",loadHandler);
  // 判断是不是最后一个要加载的图片
  if(this.num === imgList.length)console.log("加载完成!");
}

小结:

  图片预加载的本质:让浏览器提前缓存之后要用到的图片。

  好处:增强用户体验。

  坏处:不管用不用的上都会吃用户流量,密集的下载会对服务器造成一定压力。

web前端图片预加载的更多相关文章

  1. Javascript图片预加载详解

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  2. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  3. 图片预加载和AJAX的图片预加载

    利用js实现图片预加载,加载所需要图片的路径与名称即可,很容易实现,该方法尤其适用预加载大量的图片: <div class="hidden"> <script t ...

  4. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法(转)

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  5. JQ封装图片预加载插件

    我们知道,图片的加载,特别是资源较大的图片,加载相当耗费时间.为了提高用户体验,不得不使用图片预加载技术来提前加载,以提高用户在浏览时的流畅度. 先来弄明白图片的懒加载和预加载的不同: 1)概念:懒加 ...

  6. js图片预加载与延迟加载

    图片预加载的机制原理:就是提前加载出图片来,给前端的服务器有一定的压力. 图片延迟加载的原理:为了缓解前端服务器的压力,延缓加载图片,符合条件的时候再加载图片,当然不符合的条件就不加载图片.​ 预加载 ...

  7. Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  8. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  9. 再谈javascript图片预加载技术

    图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展 ...

随机推荐

  1. Yii 清理缓存

    html: <button onclick="clearCache()">ClearCache</button> js: function clearCac ...

  2. Cocos2d-x学习资源

    1.CSDN博客:http://blog.csdn.net/legendof1991/article/category/2161091.主要讲的Cocos2d-x3.0 2.CSDN博客:http:/ ...

  3. mysql的DUPLICATE KEY

    经常遇到这样的情景,向一个表里插入一条数据,如果已经存在就更新一下,用程序实现麻烦而且在并发的时候可能会有问题,这时用mysql的DUPLICATE KEY 很方便 用法如下: INSERT INTO ...

  4. LeetCode题解(13)--Roman to Integer

    https://leetcode.com/problems/roman-to-integer/ 原题: Given a roman numeral, convert it to an integer. ...

  5. python 目录下的__init__.py

    1 一个目录要成为一个package必须有__init__.py文件 The __init__.py files are required to make Python treat the direc ...

  6. 常用的sql命令

    1 mysql创建数据库 create database [database name]; 2 创建表 create table [table name]([first column name] [f ...

  7. MongoDB Spark Connector

    [在文件/usr/bin/yum./usr/libexec/urlgrabber-ext-down最上面的一行改为#!/usr/bin/python2.7] yum install git Note: ...

  8. js中字符串函数indexOf与search的区别

    IndexOf()方法是用来判断一个字符串是否存在于一个更长的字符串中.从长字符串左端到右端来搜索,如果存在该子字符串就返回它所处的位置(即索引).如果在被搜索的字符串没有找到要查找的字符串返回-1. ...

  9. redis06----消息订阅

    使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 r1:>publish news "aaaaaa" "" ...

  10. Redis使用基本套路

    Redis的数据,通常都是来自于数据库. 存入Redis当中,可以快速的查询.不用每次都关联查询,然后其他处理什么的. 通常可以把一些,不经常变的数据存储其中. 避免数据变动,而Redis缓存数据不变 ...