利用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 相关文章推荐
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
Dec 28 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
Oct 07 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
Jun 28 Javascript
基于jQuery实现中英文切换导航条效果
Sep 18 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
Jan 23 Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 Javascript
javascript实现电脑和手机版样式切换
Nov 10 Javascript
Angular2+如何去除url中的#号详解
Dec 20 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
Sep 18 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站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP 图片水印类代码
2012/08/27 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
python递归计算N!的方法
2015/05/05 Python
Python类属性与实例属性用法分析
2015/05/09 Python
解决uWSGI的编码问题详解
2017/03/24 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
python 循环数据赋值实例
2019/12/02 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
.net开发工程师面试题
2014/02/25 面试题
英文自荐信
2013/12/19 职场文书
庆七一活动方案
2014/01/25 职场文书
迟到早退检讨书
2014/02/10 职场文书
工会主席岗位责任制
2014/02/11 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
期末考试复习计划
2015/01/19 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python