【性能优化】懒、懒加载、懒动画 --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调

/*
 *
 * 扩展jq原型: 懒、懒加载、懒动画
 * --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调
 *
 * $jq.viewChange( {top:100,bottom:100,change:function(status){}} ) --- status: ‘in‘/‘out‘
 * $jq.viewChange(‘off‘)
 *
 * $jq[n].viewChange.status = ‘in‘/‘out‘ ----- 状态为‘in‘表示该DOM在规定的可视区
 *
 */
(function() {

	var $win = $(window);
	var winH = $win.height();

	var _isRun = true;
	$win.resize(function() {
		winH = $win.height();
		if (_isRun) {
			_isRun = false;
			setTimeout(function() {
				$win.trigger(‘scroll.viewChange‘);
				_isRun = true;
			}, 100);
		}
	});

	var setStatus = function(params) {
		if (this.parentElement) { //判断DOM是否还在页面中
			var $self = $(this);
			var offsetTop = $self.offset().top,
				selfH = $self.height(),
				scrollTop = $win.scrollTop();
			if (scrollTop + winH + params.bottom > offsetTop && scrollTop - params.top < offsetTop + selfH) {
				if (this.viewChange.status !== ‘in‘) {
					this.viewChange.status = ‘in‘;
					params.change.call(this, this.viewChange.status);
				}
			} else {
				if (this.viewChange.status !== ‘out‘) {
					this.viewChange.status = ‘out‘;
					params.change.call(this, this.viewChange.status);
				}
			}
		} else {
			$win.off(‘scroll.‘ + this.viewChange.eventNamespace);
		}
	};

	$.fn.viewChange = function(options) {
		if (options === ‘off‘) {
			this.each(function() {
				if (this.viewChange) {
					$win.off(‘scroll.‘ + this.viewChange.eventNamespace);
					delete this.viewChange;
				}
			});
		} else {
			var params = {
				top: 0, //增加或缩小顶部范围
				bottom: 0, //增加或缩小底部范围
				change: $.noop //视图状态发生改变时的回调:function(status){}
			};
			params = $.extend(params, options);
			params.top = parseInt(params.top);
			params.bottom = parseInt(params.bottom);
			this.each(function() {
				if (this.viewChange) {
					$win.off(‘scroll.‘ + this.viewChange.eventNamespace);
				}
				this.viewChange = {
					eventNamespace: ‘viewChange.‘ + Math.random().toString().replace(‘0.‘, ‘‘),
				};
				$win.on(‘scroll.‘ + this.viewChange.eventNamespace, function() {
					setStatus.call(this, params);
				}.bind(this));
				setStatus.call(this, params);
			});
		}
		return this;
	};

})();

//使用情况
$jq.viewChange({
	top: -100, //缩小顶部范围
	bottom: 100, //增加底部范围
	change: function(status) {
		if (status === ‘in‘) {
			//当滚动到规定的可视区时
		} else if (status === ‘out‘) {
			//当滚动出规定的可视区时
		}
	}
}); 

  

时间: 2024-10-14 19:47:27

【性能优化】懒、懒加载、懒动画 --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调的相关文章

web性能优化之页面加载体验(骨架屏)

针对web页面的首屏加载问题,一直是个问题,为此还引出一个性能考量标准:白屏时间.首屏时间. 1.白屏时间 打开chrome控制台的Performance,我们可以看到页面的渲染快照: 这段白屏时间影响的因素归根结底就是:资源加载耗时较长(chunk.js文件下载耗时35.75s): 而对于现在的大行其道的SPA来说,只要这个js文件没有执行,那么页面的代码就只是这样: 自然渲染结果暂时就只是一个白板咯 2.首屏时间 通常首屏内容中加载最慢的就是图片或者 iframe 资源,因此可以理解为当图片

移动网站性能优化:网页加载技术概览

性能一直是网站成功的关键.越来越多的研究已经证明,不管是小型电商,还是像沃尔玛那样的连锁店,即使是页面加载时间方面的细微改善,都可以带来更多的业务,更多的广告收入,更多的用户粘性和更多的客户满意度. 在过去几年,Web开发者都是基于改善硬件或者提高带宽速度来优化用户体验.但是最近几年,爆炸式的移动Web浏览器的使用打破了这个途径.低带宽,高延迟,小内存,低处理器性能的移动设备环境,迫使开发者不得不想办法通过优化前端页面的性能来满足用户的性能预期. 在强调如何解决移动端性能问题上,这篇文章总结了一

移动网站性能优化:网页加载(转)

原文链接:http://caibaojian.com/mobile-optimization.html 由于移动设备存在的环境限制,如低带宽,高延迟,小内存,低处理器性能的等,迫使开发者不得不想办法通过优化前端页面的性能来满足用户的性能预期.在强调如何解决移动端性能问题上,这篇文章总结了一些前端优化的案例,并且概括了一些加速页面的方法和策略.· 为什么性能会影响这么多 不论你的页面设计地多么有趣.漂亮.交互性好,不管是在桌面还是移动设备上,如果页面需要花2到3秒时间去渲染展示,那么用户都会很快变

前端性能优化 - 资源预加载

转帖: https://css-tricks.com/prefetching-preloading-prebrowsing 当提到前端性能优化时,我们首先会联想到文件的合并.压缩,文件缓存和开启服务器端的 gzip 压缩等,这使得页面加载更快,用户可以尽快使用我们的 Web 应用来达到他们的目标. 资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到. 引用 Patrick Hamann 的解释: 预加载是浏览器对将来可能被使用资源的一种暗示,一些资源可

前端性能优化 – 资源预加载

导语    当提到前端性能优化时,我们首先会联想到文件的合并.压缩,文件缓存和开启服务器端的 gzip 压缩等,这使得页面加载更快,用户可以尽快使用我们的 Web 应用来达到他们的目标. 资源预加载是另一个性能 当提到前端性能优化时,我们首先会联想到文件的合并.压缩,文件缓存和开启服务器端的 gzip 压缩等,这使得页面加载更快,用户可以尽快使用我们的 Web 应用来达到他们的目标. 资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到. 引用 Patr

Android_性能优化之ViewPager加载成百上千高清大图oom解决方案

一.背景 最近做项目需要用到选择图片上传,类似于微信.微博那样的图片选择器,ContentResolver读取本地图片资源并用RecyclerView+Glide加载图片显示就搞定列表的显示,这个没什么大问题,重点是,点击图片进入大图浏览,比如你相册有几百张图片,也就意味着在ViewPager中需要加载几百个view,况且手机拍出来的图片都是1-2千万左右像素的高清大图(笔者手机2千万像素 也就是拍照出来的照片3888*5152),大小也有5-7个兆,ViewPager滑动不了十几张就oom了,

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

按需加载/懒加载

按需解析HTML 按需解析HTML,就是页面一开始不解析HTML,根据需要来解析HTML.解析HTML都是需要一定时间,特别是HTML中包含有img标签.引用了背景图片时,如果一开始就解析,那么势必会增加请求数.常见的有对话框.拉菜单.多标签的内容展示等,这些一开始是不需要解析,可以按需解析. 实现按需解析,首先用<script type=”text/x-template”>html</sccript> 这个标签来对忽略对HTML的解析.然后根据触发的动作,把script里面的HT

vue学习指南:第十二篇(详细) - Vue的 路由 第二篇 ( 路由按需加载(懒加载))

各位朋友 因 最近工作繁忙,小编停更了一段时间,快过年了,小编祝愿 大家 事业有成 学业有成 快乐健康 2020开心过好每一天.从今天开始 我会抽时间把 Vue 的知识点补充完整,以及后期会带给大家更完善的知识体系!!! 路由的按需加载(懒加载) 我们都知道 vue的路由是我们必学的,也是不可分离的一部分,我们传统引入路由的方式是这样的, import Home from '@/components/home/Home' 但是在真正项目的开发中,这种现象是杜绝的,是不建议使用这种传统方式引入的.