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


Posted in Javascript onNovember 29, 2016

预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验。本文将分享三个不同的预加载技术,来增强网站的性能与可用性。

实现图片预加载可以使用css、JavaScript、Ajax三种方法。下面分别介绍这些方法的实现。

使用CSS

单纯的使用css可以将图片加载到页面元素的背景上,这种方法简单、高效:

#div1{background:url(http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg) no-repeat -9999px-9999px; }
#div2{background:url(http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg) no-repeat -9999px-9999px; }

在其他地方调用时,只要路径一致,浏览器就会在渲染过程中使用预加载(缓存)的图片。简单、高效,不需要任何JavaScript。

弊端:使用这种方法,图片会随着页面加载同时加载,延长页面加载的时间,使用JavaScript辅助完成会更高效。

使用CSS和JavaScript结合

functionpreload(){
if(document.getElementById) {
document.getElementById("div1").style.background ="url(http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg) no-repeat -9999px -9999px";
document.getElementById("div2").style.background ="url(http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg) no-repeat -9999px -9999px";
} 
}
functionaddLoadEvent(func){
varoldonload =window.onload;
if(typeofwindow.onload !='function') {
window.onload = func;
} else{
window.onload =function(){
if(oldonload) {
oldonload(); 
} 
func(); 
} 
} 
}
addLoadEvent(preload);

我们把图片加载设置到页面加载完成之后,所以不必担心由于图片和页面同时加载而延长访问时间。

如果JavaScript运行失败也不必担心,仅仅是图片预加载失败而已,当调用图片时也能正常显示。

使用JavaScript实现

方法一

varimages =newArray()
functionpreload(){
for(i =0; i < preload.arguments.length; i++) {
images[i] = newImage()
images[i].src = preload.arguments[i] 
} 
}
preload( 
"http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg",
"http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg"
)

方法二

这种方法其实和方法一是一样的原理 ,只不过没有放在数组中实现,而是分别去为 Image 对象的 src 负值。

if(document.images) {
img1 = newImage();
img2 = newImage();
img3 = newImage();
img1.src = "http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg";
img2.src = "http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg";
}

使用Ajax

假设上面的所有方法都不够酷炫,那么,还有一种方法,就是使用Ajax来实现图片的预加载。使用DOM来实现预加载,可以加载包括图片,CSS,JavaScript的其他任何东西。相对于直接使用JavaScript,使用Ajax的好处就是CSS和JavaScript可以在他们的内容不影响当前页面的情况下被预加载。对于图片来说这确实不是一个问题,尽管如此,这个方法依然很简洁高效:

window.onload =function(){
setTimeout(function(){
// XHR to request a JS and a CSS
varxhr =newXMLHttpRequest();
xhr.open('GET','http://domain.tld/preload.js');
xhr.send('');
xhr = newXMLHttpRequest();
xhr.open('GET','http://domain.tld/preload.css');
xhr.send('');
// preload image
newImage().src ="http://domain.tld/preload.png";
}, 1000);
};

就像这样,这段代码会预加载三个文件:preload.js,preload.css,preload.png。设置1秒的延时主要是防止加载JavaScript文件而导致正常页面的功能性问题。

为了将其封装起来,我们看看怎么使用原生JavaScript来写这一段代码:

window.onload =function(){
setTimeout(function(){
// reference to <head>
varhead =document.getElementsByTagName('head')[0];
// a new CSS
varcss =document.createElement('link');
css.type = 'text/css';
css.rel = 'stylesheet';
css.href = 'http://domain.tld/preload.css';
// a new JS
varjs =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
newImage().src ='http://domain.tld/preload.png';
}, 1000);
};

在这里,我们通过DOM创建了三个元素来预加载了页面上的三个文件。正如原文中所提到的,对于Ajax来说,这个方法不是那么好。预加载的文件内容不应该添加到正在加载的页面中。

以上所述是小编给大家介绍的利用CSS、JavaScript及Ajax实现图片预加载的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
纯js实现的论坛常用的运行代码的效果
Jul 15 Javascript
纯js简单日历实现代码
Oct 05 Javascript
javascript实现树形菜单的方法
Jul 17 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
JavaScript如何动态创建table表格
Aug 02 Javascript
使用jquery提交form表单并自定义action的实现代码
May 25 Javascript
jQuery ajax应用总结
Jun 02 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
Vue.js 2.0中select级联下拉框实例
Mar 06 Javascript
vue-cli V3.0版本的使用详解
Oct 24 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
Apr 10 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
Sep 25 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 #Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 #Javascript
JS访问DOM节点方法详解
Nov 29 #Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
Nov 29 #Javascript
浅谈js函数的多种定义方法与区别
Nov 29 #Javascript
原生JS简单实现ajax的方法示例
Nov 29 #Javascript
jQuery Checkbox 全选 反选的简单实例
Nov 29 #Javascript
You might like
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php图片缩放实现方法
2014/02/20 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
Javascript动态创建div的方法
2015/02/09 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
详解react-refetch的使用小例子
2019/02/15 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
ant design实现圈选功能
2019/12/17 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python 接收处理外带的参数方法
2018/12/03 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
Python中print函数简单使用总结
2019/08/05 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
python web框架 django wsgi原理解析
2019/08/20 Python
python数据分析:关键字提取方式
2020/02/24 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
电大毕业生自我鉴定
2014/04/10 职场文书
2015年路政工作总结
2015/05/22 职场文书
女性健康讲座主持词
2015/07/04 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS