dom元素分屏加载
载入一个内容较多的页面的时候,如果不做任何处理,则会在一开始就把全部内容加载出来,影响了性能和体验,所以现在常用分屏加载的功能,就是dom内容出现在屏幕可视范围内的时候,再加载dom节点,起到优化的作用。
我在项目中用的是textarea,原理就是把需要滚动加载的dom内容放进一个textarea里,然后用一个容器包裹住,当这部分内容高度出现在屏幕中的时候,就释放出textarea中的值append到容器中,实现滚动加载。
代码不多,js部分就两个函数,直接上代码吧:
完整版去github看: demo
//定义空间命名
var GLOBAL = {}; //window
$(function () {
GLOBAL.lazyLoad = {
//循环每一个指定textarea,如果在可见区域就写入html,如果有回调函数执行回调函数
eachElem: function ($elem, scollTop, windowH, callback) {
$elem.each(function (index, el) {
var $this = $(el);
var elemTop = $this.parent().offset().top;
var htmls = $this.text(); if ((elemTop > scollTop - 100) && (elemTop - scollTop < windowH)) { //容器出现在屏幕可视范围的时候
if ($this.data("addYet") != 1) {
$this.parent().append((htmls)); //容器添加textarea释放出的html
$this.data("addYet", "1"); if (callback && $.type(callback) == "function") { //如果该html是绑定了js功能的,则传入绑定函数名,比如轮播等,或者其他第三方插件等等
callback(htmls, $this.parent());
}
}
}
});
},
//动态创建dom元素
creatEle: function (targetElm, callback) {
var $elem = $.type(targetElm) == "string" ? $(targetElm) : $("textarea.js_addToDom"),
$window = $(window),
windowH = $window.height(),
that = this;
var _blank = null;
that.eachElem($elem, $window.scrollTop(), windowH, callback); $window.scroll(function () { //滚动时检测
var scrollTop = $(this).scrollTop(); if (_blank) {
clearTimeout(_blank);
}
_blank = setTimeout(function () { //加载dom
that.eachElem($elem, scrollTop, windowH, callback);
}, 300);
});
}
}
GLOBAL.lazyLoad.creatEle("textarea.img_load"); //绑定需要加载的内容
});
html部分:
<img src="img/a1.jpg" alt=""/><br/>
<img src="img/a1.jpg" alt=""/><br/>
<img src="img/a1.jpg" alt=""/><br/> <div class="wrap">
<textarea class="img_load none">
<img src="img/a1.jpg" alt=""/><br/>
</textarea>
</div>
当容器wrap出现在可视范围内后,则会释放textarea中的内容,添加进wrap,起到加载作用.
GLOBAL.lazyLoad.creatEle("textarea.img_load");绑定,如果有js功能,则需要传入第二个参数绑定函数,比如轮播插件flexslider:
function initBuyerShowImg(htmls, $warp) {
$warp.flexslider({
namespace: "",
animation: "slide",
selector: ".slider > li",
pauseOnAction: false,
itemWidth: 150,
controlNav: false,
animationLoop: false
});
}
GLOBAL.lazyLoad.creatEle("textarea.js_buyShowslide", initBuyerShowImg);
html:
<!--轮播-->
<div class="buyer-show-slide">
<a href="javascript:;" rel="nofollow" target="_blank" class="buyer-show-cover"></a>
<textarea class="js_buyShowslide none">
<ul class="slider">
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
<li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
</ul>
</textarea>
</div>
差不多就这样啦,挺简单的。
dom元素分屏加载的更多相关文章
- 关于Echarts的原生js获取DOM元素与动态加载DOM元素的冲突问题
1.前言: 最近在做的看板项目,因为需要循环加载后台数据,并且用Echarts做数据呈现,所以jQuery和angular等库统统靠边站,Echarts用的是原生js获取DOM元素,至于诸多不兼容等深 ...
- ready是先执行的,load后执行,DOM文档的加载步骤
在jq中在文档载入完毕后有这几种方式去执行指定函数: $(document).ready(function() { // ...代码... }); //document ready 简写 $(func ...
- vuejs学习之 项目打包之后的首屏加载优化
vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...
- Gemfile分平台加载gem
Gemfile分平台加载gem 区分平台以便加载不同的web server,象tzinfo-data只适用于windows # Windows does not include zoneinfo fi ...
- 滚屏加载--jQuery+PHP实现浏览更多内容
滚屏加载技术,就是使用Javascript监视滚动条的位置,每次当滚动条到达浏览器窗口底部时,触发一个Ajax请求后台PHP程序,返回相应的数据,并将返回的数据追加到页面底部,从而实现了动态加载,其实 ...
- vue项目首屏加载优化实战
问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...
- DOM编程以及domReady加载的几种方式
1,关于DOM编程 DOM编程主要是对dom树节点进行操作,所以你必须掌握基本的节点类型,如何去获取节点名字以及值(这些相关知识你可以去网上查,这里推荐一个慕课学习网站->https ...
- react 首屏加载优化
react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转 ...
- jQuery 超屏加载
jQuery 超屏加载,当文档超出屏幕的高度时,加载最新下个列数据 $(window).scroll(function () { var height = $(document).height(); ...
随机推荐
- JS全局函数里面的一些区别
- Sharepoint常见概念
有待补充: 1.环境部署(AD+DNS+SQL+SharePoint前端): SharePoint基本都是这样的结构,可以在多台服务器中,也就是场,当然也可以在一台服务器上.说说这几部分的功能 (1) ...
- <b> <i> 标记
<b></b> bold 加粗 <i></i> italic 斜线 : 对应Word文档的 I 斜体 <u></u>unde ...
- codeforces 514E-Darth Vader and Tree
题意:有个无限大的有根树,每个节点都有N个孩子,每个孩子距离父亲节点的距离为di.求距离根节点距离<=x的节点个数. 思路:注意观察数据范围,每一个d[i]均小于等于100所以我们可以设dp[i ...
- Cesium官方教程9--粒子系统
原文地址:https://cesiumjs.org/tutorials/Particle-Systems-Tutorial/ 粒子系统介绍 这篇教程带你学习Cesium的粒子相关API,比如如何在你的 ...
- day70test
day_70: #api / urls: from django.conf.urls import url from . import views urlpatterns = [ url(r'^car ...
- Spring Cloud Config-Client 无法获取 Config-Server 在 github 上的配置文件的属性值,竟然是因为
Spring Cloud Config-Client 无法获取 Config-Server 在 github 上的配置文件的属性值,竟然是因为!!! 2018年07月23日 16:33:25 一颗很菜 ...
- css3之2D 转换
浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号. 紧跟在 -webkit-, -ms- 或 -moz- 前的数字为支持该前缀属性的第一个浏览器版本号. Chrome 和 Safari 要求 ...
- linux crontab定时任务运行shell脚本(shell执行sql文件)
https://www.cnblogs.com/tiankongjava/p/6106743.html 今天做个linux定时任务(每晚12点把表汇总). 顺便写个博客记录一下~~ 为什么用linux ...
- WildFly配置gzip压缩
使用jboss-cli.sh 执行下面的脚本 /subsystem=undertow/configuration=filter/gzip=gzipFilter:add() /subsystem=und ...