网页前端优化之滚动延时加载图片示例


Posted in Javascript onJuly 13, 2013

为什么要延时加载呢?页面加载的时候就显示全部的图片不就得了?有必要多此一举吗?答案是肯定的。当要加载的图片或者内容很多时,如果一次性加载完毕,那么整个页面将会加载很久,意味着要用户等待很久,这是对用户不友好的。或许你还会问,那不就做个分页不就得了?其实这种滚动延时加载的技巧正是用来代替手动点击下一页的分页技术。每换一页都要用户点击一次,这也是对用户不友好的。所以才有了滚动延时加载。

我这里把加载图片作为例子,就好像百度图片里的一样,你往下滚动,它就会继续显示下一页的图片。

要求是这样的,比如我要加载20张图片,在页面加载完毕后我先加载5张(前提是5张已经占满浏览器窗口高度),当滚动条滚动到浏览器底部的时候再加载5张,一共加载4次。

原理是这样的,先获取当前浏览器的窗口高度a,然后给页面绑定一个滚动条滚动事件,当滚动条滚动的时候,首先判断时候已经加载了20张,如果小于20张,再获取当前文档距离顶部的高度b以及图片内容的高度c,如果a+b>=c,继续加载5张图片。

我说过,我喜欢以尽可能少的代码以及尽可能简单的demo来为有需要的人展示一些强大的功能,因为所有的东西原理其实都很简单,越简单的demo越容易让人理解和接受。所以代码很少,直接上代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>页面滚动延迟加载图片</title>
    <style type="text/css">
        body {
            margin: 0px;
        }
        ul {
            list-style: none;
            margin: 0px;
            padding: 0px;
        }
    </style>
    <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
    <script type="text/javascript">
        var n = 0;
        var winHeight = $(window).height();
        $(function () {
            loadimg();
            $(window).scroll(function () {
                if (n < 20) {
                    var docTop = $(document).scrollTop();
                    var contentHeight = $("#content").height();
                    if (docTop + winHeight >= contentHeight - 10) {
                        loadimg();
                    }
                }
            });
        });
        function loadimg() {
            for (i = 0; i < 5; i++) {
                $("#content").append("<li><img src='1.jpg'/></li>");
            }
            n += 5;
        }
    </script>
</head>
<body>
    <ul id="content">
    </ul>
</body>
</html>

这里使用了jqury框架是为了让代码更少更简单,如果你可以手写纯js代码来实现这个功能当然最好不过,毕竟是优化,这个小小的功能也不需要使用到任何js框架。不过个人比较喜欢jquery框架,毕竟在大项目中,手写纯js代码将会严重拖慢整个项目的进度,有一个强大的js框架摆在面前,合理运用还是能提高开发效率的,而且在一个大项目中,jquery不是仅仅能帮你实现这个小小的功能而已,像Ajax,它是能轻轻松松就能帮你搞定的。另外我这里只是写死了加载这一张图片,事实上它应该是使用Ajax来请求新的图片,然后加载到页面里的,因为想尽量简单,就没有涉及后台逻辑,所以只加载这一张图片。

你可能会注意到这句代码:docTop + winHeight >= contentHeight - 10,这里我为什么要-10呢?如果不-10在IE、Firefox下测试时通过的,但是在Chrome下就不行了,因为在Chrome下,docTop + winHeight是永远比contentHeight小1的,而在前两个浏览器里,docTop + winHeight是比contentHeight大1的,这个是浏览器的问题,我们只能去兼容它们,最简单的方法就是不一定要滚动到底部,滚动到距离底部还有10个像素的时候就可以加载新的图片了。

需要源工程代码?

Javascript 相关文章推荐
myFocus slide3D v1.1.0 使用方法与下载
Jan 12 Javascript
javascript将url中的参数加密解密代码
Nov 17 Javascript
AngularJS教程之简单应用程序示例
Aug 16 Javascript
详解Vue2 无限级分类(添加,删除,修改)
Mar 07 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
Jul 19 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
May 02 Javascript
mpvue小程序仿qq左滑置顶删除组件
Aug 03 Javascript
微信小程序引用iconfont图标的方法
Oct 22 Javascript
webpack+express实现文件精确缓存的示例代码
Jun 11 Javascript
vue proxy 的优势与使用场景实现
Jun 15 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 Javascript
详解JavaScript中分解数字的三种方法
Jan 05 Javascript
JavaScript获取FCK编辑器信息的具体方法
Jul 12 #Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
Jul 12 #Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
Jul 12 #Javascript
jquery 滚动条事件简单实例
Jul 12 #Javascript
简约JS日历控件 实例代码
Jul 12 #Javascript
javascript中自定义对象的属性方法分享
Jul 12 #Javascript
javascript中的toFixed固定小数位数 简单实例分享
Jul 12 #Javascript
You might like
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
srcElement表格样式
2006/09/03 Javascript
摘自百度的图片轮换效果代码
2007/11/19 Javascript
JS解密入门 最终变量劫持
2008/06/25 Javascript
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
高考考python编程是真的吗
2020/07/20 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
经典c++面试题四
2015/05/14 面试题
经济与贸易专业应届生求职信
2013/11/19 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书