利用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 相关文章推荐
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
Apr 12 Javascript
js动画(animate)简单引擎代码示例
Dec 04 Javascript
JavaScript DOM进阶方法
Apr 13 Javascript
JavaScript程序中实现继承特性的方式总结
Jun 24 Javascript
js简单实现图片延迟加载的方法
Jul 19 Javascript
vue多级多选菜单组件开发
Sep 08 Javascript
详解Vue.js分发之作用域槽
Jun 13 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
vue中接口域名配置为全局变量的实现方法
Sep 20 Javascript
javascript+HTML5 canvas绘制时钟功能示例
May 15 Javascript
vue 自定义右键样式的实例代码
Nov 06 Javascript
使用node-media-server搭建一个简易的流媒体服务器
Jan 20 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
生成sessionid和随机密码的例子
2006/10/09 PHP
怎么在Windows系统中搭建php环境
2013/08/31 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
Javascript typeof 用法
2008/12/28 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
js禁止表单重复提交
2017/08/29 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
python实现双色球随机选号
2020/01/01 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
python能自学吗
2020/06/18 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
STP的判定过程
2012/10/01 面试题
终端业务员岗位职责
2013/11/27 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle