`

JavaScript实现 页面滚动图片加载

 
阅读更多

又到了这个月的博客时间了,原计划是打算在这个月做一个的功能较炫的拖拽类,可是感觉想的太容易,实现起来遇见不少问题,如果技术分享做不到有助于人反而害人,那就歇菜了,所以还是等本人多找些资料研究研究,“拖拽类“先放放吧,下面开始正题...

  为什么写这篇文章?

  1.优化页面很实用的方法,技术实现不难;

  2.搜索了相关内容的文章,好像都是用jQuery的方法,可是如果不用jQuery的站长难道就不能用这种方法了么;

  3.做技术分享也是在让更多人帮自己测试,因为这个本人木有在项目中实际用到,都是自己琢磨的,所有如果有问题请大家指出,先谢谢了;

  4.这个月的博客还没写;

  5.刚好木有工作任务,此时不写更待何时...


  现在的页面大多都具有的特点 - 内容丰富,图片较多;像我们经常浏览的淘宝,京东,团购网站之类的(本人网购控,属于一个月不在网上花点钱就不痛快),一个页面几十张图片那叫毛毛雨,所以现在流行起了一个方法 - 滚动动态加载。这个方法能解决很大程度的HTTP请求,首先页面只加载窗口显示区的图片,只有等到页面滚动,且滚动到相应位置的时候再去加载图片,这样做网页加载快了(请求少了,加载的东西少了能不提快么)。在《高性能网站建设指南》第一章就说到,减少HTTP请求的重要性,这是提高网页前端性能,优化页面加载速度很实用的做法。


  原理:

1.给页面绑定滚动事件;

2.加载页面的时候把真正的图片地址放在某属性中;

3.然后再滚动过程中判断元素是否进入当前浏览器窗口内;

4.最后加载图片,当然加载什么,用什哪种用户体验都得由你决定;


  难点

  浏览器兼容是造成难点的原因所在,DOM标准和IE标准,每天前端的工作都在和它们打交道。思考下面的几段代码

  1.window.pageYOffset ? window.pageYOffset : window.document.documentElement.scrollTop

目的:获得当前页面相对于窗口显示区左上角的 Y 位置.
DOM标准:window.pageYOffset;
IE标准:window.document.documentElement.scrollTop

  2.window.innerHeight ? window.innerHeight : document.documentElement.clientHeight

目的:声明了窗口的文档显示区的高度和宽度,以像素计.
DOM标准:innerheight 和 innerwidth;
IE标准:document.documentElement 或 ducument.body (与 DTD 相关)的 clientWidth 和 clientHeight 属性作为替代

  3.obj.getBoundingClientRect().top + window.document.documentElement.scrollTop + window.document.body.scrollTop

目的:获取页面元素的位置.
当浏览器为 非webkit内核 时,document.body.scrollTop值恒定为0,使用 document.documentElement.scrollTop才能取到正确值 ; 
当浏览器为 webkit内核 时,document.documentElement.scrollTop值恒定为0,使用 document.body;
我还搜索到一种说法是和DTD相关(即 当页面指定了 DOCTYPE时,使用 document.documentElement ; 当页面没有指定了 DOCTYPE时,使用 document.body),请确定知道的朋友帮忙指出下,不胜感谢。

 

  细节

 1.因为真正的地址最初是在某属性中(默认是xsrc,可自己设置),所以默认的图片地址最好是一个像素的透明图片,这样可以避免在浏览器中出现红X;

 

2.在图片load的时候可以加入等待的图片,这样用户才会知道这里有图片需要加载,良好的用户体验是前端一直所追求的(例子中有体现);

3.在图片load成功后可以加入合适的显示效果(例子中木有体现,可以自己尝试);

 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 JavaScript源码如下:

复制代码
var scrollLoad = (function (options) {
        
var defaults = (arguments.length == 0? { src: 'xSrc', time: 300} : { src: options.src || 'xSrc', time: options.time ||300};
        
var camelize = function (s) {
            
return s.replace(/-(\w)/g, function (strMatch, p1) {
                
return p1.toUpperCase();
            });
        };
        
this.getStyle = function (element, property) {
            
if (arguments.length != 2return false;
            
var value = element.style[camelize(property)];
            
if (!value) {
                
if (document.defaultView && document.defaultView.getComputedStyle) {
                    
var css = document.defaultView.getComputedStyle(element, null);
                    value 
= css ? css.getPropertyValue(property) : null;
                } 
else if (element.currentStyle) {
                    value 
= element.currentStyle[camelize(property)];
                }
            }
            
return value == 'auto' ? '' : value;
        };
        
var _init = function () {
            
var offsetPage = window.pageYOffset ? window.pageYOffset : window.document.documentElement.scrollTop,
                offsetWindow 
= offsetPage + Number(window.innerHeight ? window.innerHeight : document.documentElement.clientHeight),
                docImg 
= document.images,
                _len 
= docImg.length;
            
if (!_len) return false;
            
for (var i = 0; i < _len; i++) {
                
var attrSrc = docImg[i].getAttribute(defaults.src),
                    o 
= docImg[i], tag = o.nodeName.toLowerCase();
                
if (o) {
                    postPage 
= o.getBoundingClientRect().top + window.document.documentElement.scrollTop + window.document.body.scrollTop; postWindow = postPage + Number(this.getStyle(o, 'height').replace('px'''));
                    
if ((postPage > offsetPage && postPage < offsetWindow) || (postWindow > offsetPage && postWindow < offsetWindow)) {
                        
if (tag === "img" && attrSrc !== null) {
                            o.setAttribute(
"src", attrSrc);
                        }
                        o 
= null;
                    }
                }
            };
            window.onscroll 
= function () {
                setTimeout(
function () {
                    _init();
                }, defaults.time);
            }
        };
        
return _init();
    });

    scrollLoad();  

复制代码


demo下载

 可传递一个参数设置src原地址和响应时间  

 

scrollLoad({
    src:'userSrc', //字符串型
    time: 100       //数字型
}) 
 

最后,祝大家工作愉快,学习进步,哈哈..

如果觉得此文还算用心,请劳驾点右下角 的推荐 ^.^ 。

作者:聂微东
出处:http://www.cnblogs.com/Darren_code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
分享到:
评论

相关推荐

    JavaScript实现页面滚动图片加载(仿lazyload效果)

    优化页面很实用的方法,技术实现不难; 2.搜索了相关内容的文章,好像都是用jQuery的方法,可是如果不用jQuery的站长难道就不能用这种方法了么; 3.做技术分享也是在让更多人帮自己测试,因为这个本人木有在项目中...

    html5实现的页面滚动图片动画加载特效源码.zip

    另外,JavaScript(通常与jQuery库一起使用)是实现滚动加载特效的关键。通过监听滚动事件,如`$(window).scroll()`,我们可以检测用户何时接近预设的图片区域。一旦满足条件,JavaScript可以触发加载动画,并使用...

    基于JavaScript开发的滚动加载页面图片+源码

    基于JavaScript开发的滚动加载页面图片+源码 基于JavaScript开发的滚动加载页面图片+源码 基于JavaScript开发的滚动加载页面图片+源码 基于JavaScript开发的滚动加载页面图片+源码 基于JavaScript开发的滚动加载...

    网页图片随滚动条加载

    网页图片随滚动条加载是一种优化网页性能的技术,它主要针对含有大量图片的页面,通过只在用户滚动到可视区域时加载图片,来提高网页的加载速度和用户体验。这种技术也被称为懒加载(Lazy Loading)或者延迟加载(On...

    javascript实现的滚动图片

    1. **预加载图片**:在JavaScript中,`new Image()`对象用于创建一个新的图像对象并预加载图片资源。这确保了图片在需要时已经加载完成,避免了滚动过程中可能出现的延迟。在代码中,我们有五张图片(img1到img5)和...

    html5页面滚动图片动画加载特效

    在滚动图片加载特效中,可以利用canvas预加载图片,然后在用户滚动到相应位置时,用canvas绘制出已经加载的图片,从而实现平滑的动画过渡。 其次,CSS3的transform和transition属性是创建滚动动画的关键。transform...

    拖动滚动条自动加载图片页面

    标题中的“拖动滚动条自动加载图片页面”指的是网页设计中的一个常见技术,通常被称为“无限滚动”或“滚动监听加载”。这种技术允许用户在滚动页面时,内容(如图片)会随着滚动条的移动而逐步加载,而不是一次性...

    滚动条滚动延迟加载图片

    压缩包中的"滚动加载图片"可能包含一个简单的JavaScript示例代码,用于演示如何实现这一功能。这个文件可能包括如何创建Observer,如何定义加载条件,以及如何处理加载事件的代码。如果你需要更深入地了解或实现滚动...

    聂微东-页面滚动图片加载

    总结起来,"聂微东-页面滚动图片加载"是一个关于利用JavaScript在网页中实现延迟加载图片的技术,这种技术提高了网页性能,优化了用户体验,特别是在内容丰富的网站如QQ空间中。通过监听滚动事件、计算元素位置和...

    javascript图片随滚动条异步加载

    这种技术能够显著提升网页加载速度,改善用户体验,因为它只在用户实际需要时才加载图片,而不是一次性加载整个页面。下面将详细介绍这个知识点。 首先,理解基本原理:当用户滚动页面时,浏览器会触发滚动事件。...

    vue指令实现页面图片懒加载鼠标滚动图片开始加载

    当图片元素进入视口时,我们调用`loadImage`函数来实际加载图片。`loadImage`可以是一个简单的函数,将图片的`data-src`属性(预设的图片URL)替换为`src`属性,从而触发图片加载。 ```javascript function ...

    JavaScript实现图片懒加载 图片懒加载是一种在页面加载时,延迟加载图片资源的技术,也就是说图片资源在需要的时候才会加载

    JavaScript实现的图片懒加载是一种高效的网页优化策略,尤其在处理大量图片或高分辨率图像的页面时,能够显著提升页面的加载速度和用户体验。这一技术基于滚动事件,只有当图片进入浏览器的视口(即用户能看到的区域...

    Vue下滚动到页面底部无限加载数据的示例代码

    图片懒加载是一种优化技术,用于延迟加载图片,直到用户滚动到图片所在的位置。在本示例代码中,我们使用懒加载来加载用户的头像。 5. 结合原生 js 来写 scroll 事件 在本示例代码中,我们使用原生 js 来写 scroll...

    JavaScript实现无穷滚动加载数据

    本文将介绍如何使用JavaScript实现一个简单的无穷滚动加载数据的功能。 首先,要实现无穷滚动加载数据,我们需要监听滚动条事件(onscroll),以检测用户何时滚动到了页面底部,这是触发数据加载的关键时机。页面底部...

    jQuery无限滚动加载图片瀑布流代码

    总结来说,jQuery无限滚动加载图片瀑布流技术是结合了jQuery库、瀑布流布局和无限滚动加载的网页设计技巧,通过精心设计的插件,可以轻松地实现在网页上动态加载和展示图片,为用户提供流畅、无阻隔的浏览体验。

    页面滚动到底部自动加载数据

    页面滚动到底部自动加载数据,也被称为无限滚动或滚动加载,是现代网页设计中常见的一种交互方式。这种技术允许用户在浏览网页时无需点击分页按钮,只需将页面滚动到最底部,更多内容就会自动加载出来,提高了用户...

    图片根据鼠标滚动延时加载

    通过创建一个观察器实例,设置阈值和回调函数,当图片进入视口时,回调函数会被调用,从而加载图片。 三、示例代码(使用Intersection Observer API) ```javascript const images = document.querySelectorAll('...

    水平滚动动态加载

    水平滚动动态加载是一种常见的网页优化技术,特别是在展示大量图片或者内容时,能够有效提升用户体验和网站性能。在传统的网页设计中,所有页面元素在页面加载时一次性加载完成,这可能导致加载时间过长,特别是当...

Global site tag (gtag.js) - Google Analytics