千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 3种Javascript图片预加载的方法详解

3种Javascript图片预加载的方法详解

来源:千锋教育
发布人:wjy
时间: 2022-06-01 11:45:00 1654055100

  预加载图片是提高用户体验的一个很好方法。Javascript图片预加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。

3种Javascript图片预加载的方法详解

  这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验。本文将分享三个不同的预加载技术,来增强网站的性能与可用性。

  **方法一:用css和JavaScript实现预加载**

  实现预加载图片有很多方法,包括使用css、JavaScript及两者的各种组合。这些技术可根据不同设计场景设计出相应的解决方案,十分高效。

  单纯使用CSS,可容易、高效地预加载图片,代码如下:

  ```js

  #preload-01 { background: url() no-repeat -9999px -9999px; }

  #preload-02 { background: url() no-repeat -9999px -9999px; }

  #preload-03 { background: url() no-repeat -9999px -9999px; }

  ```

  将这三个ID选择器应用到(X)html元素中,我们便可通过CSS的background属性将图片预加载到屏幕外的背景上。

  只要这些图片的路径保持不变,当它们在Web页面的其他地方被调用时,浏览器就会在渲染过程中使用预加载(缓存)的图片。简单、高效,不需要任何JavaScript。

  该方法虽然高效,但仍有改进余地。使用该法加载的图片会同页面的其他内容一起加载,增加了页面的整体加载时间。

  为了解决这个问题,我们增加了一些JavaScript代码,来推迟预加载的时间,直到页面加载完毕。代码如下:

  ```js

  function preloader() {

  if (document.getElementById) {

  document.getElementById("preload-01").style.background = "url() no-repeat -9999px -9999px";

  document.getElementById("preload-02").style.background = "url() no-repeat -9999px -9999px";

  document.getElementById("preload-03").style.background = "url() no-repeat -9999px -9999px";

  }

  }

  function addLoadEvent(func) {

  var oldonload = window.onload;

  if (typeof window.onload != 'function') {

  window.onload = func;

  } else {

  window.onload = function() {

  if (oldonload) {

  oldonload();

  }

  func();

  }

  }

  }

  addLoadEvent(preloader);

  ```

  在该脚本的第一部分,我们获取使用类选择器的元素,并为其设置了background属性,以预加载不同的图片。

  该脚本的第二部分,我们使用addLoadEvent()函数来延迟preloader()函数的加载时间,直到页面加载完毕。

  如果JavaScript无法在用户的浏览器中正常运行,会发生什么?很简单,图片不会被预加载,当页面调用图片时,正常显示即可。

  ## **方法二:仅使用JavaScript实现预加载**

  上述方法有时确实很高效,但我们逐渐发现它在实际实现过程中会耗费太多时间。相反,我更喜欢使用纯JavaScript来实现图片的预加载。

  下面将提供两种这样的预加载方法,它们可以很漂亮地工作于所有现代浏览器之上。

  **JavaScript代码段1**

  只需简单编辑、加载所需要图片的路径与名称即可,很容易实现:

  ```js

  ```

  该方法尤其适用预加载大量的图片。我的画廊网站使用该技术,预加载图片数量达50多张。将该脚本应用到登录页面,只要用户输入登录帐号,大部分画廊图片将被预加载。

  **JavaScript代码段2**

  该方法与上面的方法类似,也可以预加载任意数量的图片。将下面的脚本添加入任何Web页中,根据程序指令进行编辑即可。

  ```js

  ```

  正如所看见,每加载一个图片都需要创建一个变量,如“img1 = new Image();”,及图片源地址声明,如“img3.src = “../path/to/image-003.gif”;”。参考该模式,你可根据需要加载任意多的图片。

  我们又对该方法进行了改进。将该脚本封装入一个函数中,并使用 addLoadEvent(),延迟预加载时间,直到页面加载完毕。

  ```js

  function preloader() {

  if (document.images) {

  var img1 = new Image();

  var img2 = new Image();

  var img3 = new Image();

  img1.src = "";

  img2.src = "";

  img3.src = "";

  }

  }

  function addLoadEvent(func) {

  var oldonload = window.onload;

  if (typeof window.onload != 'function') {

  window.onload = func;

  } else {

  window.onload = function() {

  if (oldonload) {

  oldonload();

  }

  func();

  }

  }

  }

  addLoadEvent(preloader);

  ```

  ## **方法三:使用Ajax实现预加载**

  上面所给出的方法似乎不够酷,那现在来看一个使用Ajax实现图片预加载的方法。该方法利用DOM,不仅仅预加载图片,还会预加载CSS、JavaScript等相关的东西。使用Ajax,比直接使用JavaScript,优越之处在于JavaScript和CSS的加载不会影响到当前页面。该方法简洁、高效。

  ```js

  window.onload = function() {

  setTimeout(function() {

  // XHR to request a js and a CSS

  var xhr = new XMLHttpRequest();

  xhr.open('GET', 'http://domain.tld/preload.js');

  xhr.send('');

  xhr = new XMLHttpRequest();

  xhr.open('GET', 'http://domain.tld/preload.css');

  xhr.send('');

  // preload image

  new Image().src = "";

  }, 1000);

  };

  ```

  上面代码预加载了“preload.js”、“preload.css”和“preload.png”。1000毫秒的超时是为了防止脚本挂起,而导致正常页面出现功能问题。

  下面,我们看看如何用JavaScript来实现该加载过程:

  ```js

  window.onload = function() {

  setTimeout(function() {

  // reference to

  var head = document.getElementsByTagName('head')[0];

  // a new CSS

  var css = document.createElement('link');

  css.type = "text/css";

  css.rel = "stylesheet";

  css.href = "http://domain.tld/preload.css";

  // a new JS

  var js = document.createElement("script");

  js.type = "text/javascript";

  js.src = "http://domain.tld/preload.js";

  // preload JS and CSS

  head.appendChild(css);

  head.appendChild(js);

  // preload image

  new Image().src = "";

  }, 1000);

  };

  ```

  这里,我们通过DOM创建三个元素来实现三个文件的预加载。正如上面提到的那样,使用Ajax,加载文件不会应用到加载页面上。从这点上看,Ajax方法优越于JavaScript。

  **- End -**

  更多关于“html5培训”的问题,欢迎咨询千锋教育在线名师。千锋已有十余年的培训经验,课程大纲更科学更专业,有针对零基础的就业班,有针对想提升技术的提升班,高品质课程助理你实现梦想。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT
开班信息
北京校区
  • 北京校区
  • 大连校区
  • 广州校区
  • 成都校区
  • 杭州校区
  • 长沙校区
  • 合肥校区
  • 南京校区
  • 上海校区
  • 深圳校区
  • 武汉校区
  • 郑州校区
  • 西安校区
  • 青岛校区
  • 重庆校区
  • 太原校区
  • 沈阳校区
  • 南昌校区
  • 哈尔滨校区