`
Breese
  • 浏览: 62892 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

提升用户体验之道:图片预加载

 
阅读更多

来自:http://www.36ria.com/4030

随着网站构建越来越倾向于实现“桌面般的体验”,网站中的图片数量也开始显著地增长。想想网站中的对话框、Tabs、Tooltips、Sliders以及日历控件吧,这都是实现“桌面般体验”的必要元素。

预加载这一堆图片对网站性能及可用性的提升是有好处的,这样避免了图片加载过程中页面的闪烁、破裂(视觉上)等问题。

常用的技术

有两种常用的图片预加载技术:

CSS sprites

CSS sprites技术可以用来减少页面产生的HTTP请求数。它是这么实现的,把所有的图型状态(比如按钮的默认状态,悬停及激活等状态)保存到一张图片中。并依据元素的状态,使用CSS对图片进行相应的定位、切割。

不过这样有个重要的缺点——需要提前加载的图片不适用这项技术。一些后面才需要显示的图片并没有被加载,这可能会导致一个延迟。因此,此技术一般适合静态站点,主要用来减少图片加载数。

JavaScript

另一个可以使用的技术是使用JavaScript的image对象。这个方法是这样的,先把网站中使用的每个图片的地址(URL)放到一个数组中。

  1. var myImages = ["image_1.jpg', 'image_2.jpg', 'image_3.jpg', ...];

然后遍历这个数组,根据图片地址创建各自的image对象。这样可以保证所有的图片都能被浏览器缓存,等用到的时候就无需等待了。

  1. for (var i = 0; i <= myImages.length; i++) {
  2.      var img = new Image();
  3.      img.src = myImages[i];
  4. }

此方案费时的地方是,不仅要制造一个包含每张图片地址的数组,还要维护它的一致性。网站的每个需求变更(添加或更改图片地址)都会影响到这个数组。试想频繁变更的应用,又拥有数百张图片,这真会让人筋疲力尽的。

图片自动预加载(带进度指示器)

一个更好的方式是自动收集图片的地址。

首先要分析页面中(包括外链及内联)的样式表。这可以通过遍历“document.styleSheets”对象来获得页面使用的所有样式表。

  1. for (var i = 0; i < document.styleSheets.length; i++){

接下来要找出样式表的根目录。用来得到各个图片的绝对地址。

  1. var baseURL = getBaseURL(document.styleSheets[i].href);

考虑到浏览器的兼容性,必须同时检查每个样式表的“cssRules”或“rules”中是否包含CSS规则。

  1. if (document.styleSheets[i].cssRules) {
  2.     cssRules = document.styleSheets[i].cssRules
  3. }
  4. else if (document.styleSheets[i].rules) {
  5.     cssRules = document.styleSheets[i].rules
  6. }

所有非空的CSS规则都要被解析,来确认它是否关联了图片。一个简单的正则表达式就可以解析出图片地址。

  1. var cssRule = cssRules[j].style.cssText.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);

然后,把这里收集到的所有图片地址保存到一个数组中供后面使用。

  1. function analyzeCSSFiles() {
  2.     var cssRules; // CSS rules
  3.    
  4.     for (var i = 0; i < document.styleSheets.length; i++) { // loop through all linked/inline stylesheets
  5.       
  6.         var baseURL = getBaseURL(document.styleSheets[i].href); // get stylesheet's base URL
  7.  
  8.         // get CSS rules
  9.         if (document.styleSheets[i].cssRules) {
  10.             cssRules = document.styleSheets[i].cssRules
  11.         }
  12.         else if (document.styleSheets[i].rules) {
  13.             cssRules = document.styleSheets[i].rules
  14.         }
  15.        
  16.         // loop through all CSS rules
  17.         for (var j = 0; j < cssRules.length; j++) {
  18.             if (cssRules[j].style && cssRules[j].style.cssText) {
  19.                 // extract only image related CSS rules
  20.                 // parse rules string and extract image URL
  21.                 var cssRule = cssRules[j].style.cssText.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);
  22.                 if (cssRule) {
  23.                     // add image URL to array
  24.                     cssRule = (cssRule + "").replace("\"", "")
  25.                     imageURLs.push(baseURL + cssRule);
  26.                 }
  27.             }
  28.         }
  29.     }
  30. }

数组中存放的图片地址是绝对路径,为了得到它,我们实现了“getBaseUrl”函数来解析每个CSS文件的绝对地址。

  1. function getBaseURL(cssLink) {
  2.     cssLink = (cssLink) ? cssLink : 'window.location.href'; // window.location.href for inline style definitions
  3.    
  4.     var urlParts = cssLink.split('/'); // split link at '/' into an array
  5.     urlParts.pop(); // remove file path from URL array
  6.    
  7.     var baseURL = urlParts.join('/'); // create base URL (rejoin URL parts)
  8.    
  9.     if (baseURL != "") 
  10.     {
  11.         baseURL += '/'; // expand URL with a '/'
  12.     }
  13.    
  14.     return baseURL;
  15. }

现在,遍历这个列表,为网站的每个图片创建一个JavaScript图片对象,来实现图片预加载并强制浏览器进行缓存。请注意“setTimeout”的使用,它确保了每个图片加载是依序执行的,当前图片加载完成才会加载下一个。原因是某些浏览器无法同时处理超过2个请求(译者注:IE6单域下的并发连接数限制就是2个)。为了避免可能的死锁,这里使用jQuery的bind方法给“load”、“onreadystatechange”和“error”事件绑定了一个处理器。这样可以确保遇到无法加载的遗失图片时,“errorTimer”可以把你带回正确的轨道。

  1. function preloadImages() {
  2.     if (imageURLs && imageURLs.length && imageURLs[imagesLoaded]) { // if image URLs array isn't empty
  3.         var img = new Image(); // create a new imgage object
  4.         img.src = imageURLs[imagesLoaded]; // set the image source to the extracted image URL
  5.        
  6.         setTimeout(function () {
  7.             if (!img.complete) {
  8.                 jQuery(img).bind('onreadystatechange load error', onImageLoaded); // bind event handler
  9.             } else {
  10.                 onImageLoaded(); // image loaded successfully, continue with the next one
  11.             }
  12.                        
  13.             errorTimer = setTimeout(onImageLoaded, 1000); // handle missing files (load the next image after 1 second)
  14.         }, 25);
  15.     }
  16.     else {
  17.         showPreloadedImages();
  18.     }
  19. }
  20.  
  21. function onImageLoaded() {
  22.     clearTimeout(errorTimer); // clear error timer
  23.    
  24.     imagesLoaded++; // increase image counter
  25.    
  26.     preloadImages(); // preload next image
  27. }

为了提升预加载时的用户体验,这里对“onImageLoaded”事件处理器做点改动,来添加一个进度条。

首先,引入jQuery UI的样式和显示进度条所需要的JavaScript文件。

  1. <link type="text/css" href="css/ui-lightness/jquery-ui-1.8.6.custom.css" rel="stylesheet" />
  2. <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
  3. <script type="text/javascript" src="js/jquery-ui-1.8.6.custom.min.js"></script>

然后在DOMReady事件被触发时初始化进度条。

  1. $(document).ready(function () {
  2.     $("#progressbar").progressbar({ value: 0 }); // initialize progress bar
  3. });

最后要做的一件事是扩展“onImageLoaded”事件处理函数。每加载完一张图片,就计算一次进度并更新进度条。

为了验证预加载的效果,这里把所有图片都添加到页面中。在预加载全部完成时,所有的图片会同时显示。

  1. function onImageLoaded() {
  2.     clearTimeout(errorTimer); // clear error timer
  3.  
  4.     $("#imagelist").append("<span>" + imagesLoaded + ": </span><img src='" + imageURLs[imagesLoaded] + "'/>"); // append image tag to image list
  5.  
  6.     imagesLoaded++; // increase image counter
  7.  
  8.     var percent = parseInt(100 * imagesLoaded / (imageURLs.length - 1)); // calculate progress
  9.  
  10.     $("#progressbar").progressbar({ value: percent }); // refresh progress bar
  11.     $("#progressbarTitle").text("Preloading progress: " + percent + "%");
  12.  
  13.     preloadImages(); // preload next image
  14. }
分享到:
评论

相关推荐

    图片预加载学习(一):无序加载之图片切换

    本文将深入探讨“图片预加载学习(一):无序加载之图片切换”的主题,主要涵盖以下几个方面: 1. **图片预加载的意义**: 图片预加载的主要目标是提前下载用户可能需要的图片资源,避免用户在浏览网页时因为图片...

    图片预加载效果

    总结,图片预加载是网页性能优化的重要手段之一,通过合理使用可以显著提升用户体验,但需注意适度,避免过度预加载导致的不必要的资源浪费。结合其他优化措施,如图片压缩、尺寸适配等,可以进一步提高网页加载速度...

    图片预加载特效

    总结来说,图片预加载是提高网页性能的关键技术之一,通过合理选择预加载策略和实现方式,可以显著提升用户体验。在实际项目中,我们需要根据具体情况,结合预加载和优化策略,确保图片能够快速、流畅地显示。

    图片预加载学习(三):无序加载之图片切换

    在网页设计和开发中,图片预加载是一项重要的技术,它可以帮助提高用户体验,尤其是当网页包含大量图片时。预加载使得用户在查看图片时无需等待,从而提升页面的响应速度。 首先,让我们理解什么是图片预加载。预...

    微信小程序-图片预加载组件

    总结来说,微信小程序的图片预加载组件是提升用户体验的重要手段,它通过合理管理和调度图片资源的加载,确保了图片能够快速、平稳地展示给用户。理解和掌握预加载组件的实现原理和源码,对于微信小程序的性能优化...

    jquery 预加载图片

    预加载图片的主要目的是减少页面加载时间,防止用户在滚动页面时等待图片加载,尤其对那些大图或者高分辨率图片来说,预加载能显著提升用户体验。 首先,我们来看`jquery.preload.js`和`jquery.preload.min.js`这两...

    jquery.lazyload图片预加载效果 jquery预加载

    总之,jQuery LazyLoad是一个强大的图片预加载工具,通过它我们可以有效地提升网页性能,优化用户体验。无论是在移动设备还是桌面端,它都能发挥出显著的效果,是现代网页开发中的一个不可或缺的工具。熟练掌握并...

    图片预加载js

    图片预加载技术是Web开发中的一个重要概念,尤其是在处理大量图像或者多媒体内容的网站时,能够显著提升用户体验。本文将深入探讨“图片预加载js”这一主题,包括预加载的原理、实现方式以及如何使用JavaScript来...

    jQuery实现图片预加载

    为了提升用户体验,开发者通常会采用图片预加载技术,确保图片在用户需要时能够快速显示。jQuery作为一个强大的JavaScript库,提供了丰富的功能来帮助我们实现这一目标。本文将详细探讨如何使用jQuery实现图片预加载...

    图片预加载

    1. 提升用户体验:快速显示图片可以减少用户的等待时间,提升满意度。 2. 平滑页面过渡:在页面切换或动画效果中,预加载下一页面的图片,可避免图片突然出现导致的不连续感。 3. 节省资源:预加载可以充分利用用户...

    js图片预加载

    这种方法通过在用户实际查看图片之前,提前加载图片资源,减少用户等待时间,提升用户体验。这里我们将深入探讨JavaScript图片预加载的基本原理、实现方式以及jQuery插件的应用。 **一、图片预加载的基本原理** ...

    js实现图片预加载.tx

    尽管图片预加载能够显著提升用户体验,但不当的预加载策略也可能导致不必要的网络流量消耗和服务器负载增加。因此,在实施图片预加载时,应注意以下几点: 1. **按需加载**:只预加载用户即将查看的图片,避免加载...

    jquery图片预加载延迟加载

    在网页设计和开发中,图片预加载和延迟加载是两种重要的优化策略,它们可以显著提升网站性能和用户体验。本文将详细探讨使用jQuery实现这两种技术,以及它们如何协同工作以优化页面打开速度。 首先,让我们理解预...

    jquery实现图片预加载技术,使得图片加载更为流畅,和谐。

    这样可以避免用户在滚动页面时看到空白的图片占位符,提升用户体验。 在jQuery中,我们可以创建一个函数来处理图片的预加载。首先,我们需要获取到要预加载的图片URL列表。这可以通过遍历DOM元素或读取JSON数据等...

    jquery图片预加载

    总结,jQuery图片预加载技术是提高网页性能的重要手段,通过预加载,我们可以减少带宽消耗,提升用户体验。`jquery.LoadImage`插件提供了一种高效且可定制的解决方案,尤其是其逐渐加载功能,使得大图加载更加平滑,...

    图片预加载插件preloadjs

    在Web开发中,图片预加载是一项重要的优化技术,它可以提升用户体验,确保图片在需要时能够迅速显示。preloadjs 是一款强大的JavaScript库,专为实现资源预加载而设计,包括图片、音频、字体等。在本文中,我们将...

    图片预加载loading

    在网页设计中,图片预加载是一项重要的优化技术,它的目的是提前加载用户可能需要的图片,以提高用户体验,减少页面加载时间。"图片预加载loading"就是这个概念的具体应用,它通常会在页面的主要内容加载之前,预先...

    Jquery实例--图片预加载

    在网页设计中,图片预加载是一种优化用户体验的重要技术,它使得用户在浏览页面时能够快速地看到图片,避免了图片加载过程中出现的空白或者闪烁现象。本文将深入探讨如何使用jQuery来实现这一功能,同时会涉及到...

    图片预加载学习(二):有序加载之图片切换

    在本文中,我们将深入探讨“图片预加载学习”的第二部分,重点关注有序加载和图片切换的实现。这个主题对于优化网页性能和提供流畅的用户体验至关重要,特别是在处理大量的图像资源时。 首先,我们需要理解“图片预...

    微信小程序开发,适用于微信小程序的图片预加载组件wxapp-img-loader-master.zip

    2. **图片预加载**:预加载技术是提高用户体验的关键,尤其是在图片密集型应用中。预加载会在用户浏览当前页面时,提前加载后续可能需要的图片资源,确保在用户切换页面时,图片能快速显示,减少加载时间。 3. **...

Global site tag (gtag.js) - Google Analytics