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


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 相关文章推荐
javascript之卸载鼠标事件的代码
May 14 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
jQuery 1.5最新版本的改进细节分析
Jan 19 Javascript
JQuery中$(document)是什么意思有什么作用
Jul 21 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
Sep 05 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
微信小程序 本地图片按照屏幕尺寸处理
Aug 04 Javascript
BACKBONE.JS 简单入门范例
Oct 17 Javascript
JS复杂判断的更优雅写法代码详解
Nov 07 Javascript
详解从react转职到vue开发的项目准备
Jan 14 Javascript
vuex实现的简单购物车功能示例
Feb 13 Javascript
基于javascript实现放大镜特效
Dec 03 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
多文件上传的例子
2006/10/09 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
JS 进度条效果实现代码整理
2011/05/21 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
逻辑链路控制协议
2016/10/01 面试题
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
毕业实习证明范本
2015/06/16 职场文书
社会实践心得体会范文
2016/01/14 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技