当前位置: 首页 > news >正文

图片懒加载:基于jQuery判断某元素是否显示在可视范围内,并实现背景图片根据随机下标进行懒加载

有时候用jq写页面功能的时候,可能需要判断某元素是否显示在可视范围内,再加载该元素中的图片等内容,那么怎么实现这个功能呢?

知识点一: 判断某元素是否显示在可视范围内


知识点二: 实现图片懒加载


知识点三: 随机下标的生成

效果图:


image

话不多说,下面直接上代码:

工具函数 util.js

var util = {
    // 判断某元素是否显示在可视范围内
    isShow: function ($el) {
        var scroll_top = $(window).scrollTop(),
            window_height = $(window).height(),
            offset_top = $el.offset().top,
            height = $el.height();
        return $el.is(':visible') && scroll_top <= offset_top + height && scroll_top >= offset_top - window_height;
	},
	// 随机数
	randomNum: function(minNum, maxNum) {
			switch (arguments.length) {
				case 1:
					return parseInt(Math.random() * minNum + 1, 10);
			case 2:
				return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
			default:
				return 0;
		}
	},
	/**
     * 背景图的懒加载
     * @param {String} options.selector 选择器的名称,必须为类选择器
     * @param {String} options.error 图片加载失败显示内容,默认<i class="icon icon-lazy icon-lazy-error">暂无封面图</i>
     */
    lazyBackgroundImg: function(options) {
		var that = this,
			$lazys = $('.' + options.selector),
			delayTime = options.delayTime || 300,
			error = options.error || '<i class="icon icon-lazy icon-lazy-error">暂无封面图</i>',
			loadBgImg = function() {
				clearTimeout(y);
				if ($lazys.length) {
					var showLazys = [];
					for (var i = 0; i < $lazys.length; i++) {
						that.isShow($($lazys[i])) && showLazys.push(i);
					}
					if (showLazys.length) {
						var l = showLazys.length - 1,
							r = that.randomNum(0, l),
							i = showLazys[r],
							$el = $($lazys[i]),
							url = $el.attr('data-url'),
							$img = $('<img src="' + url + '"/>');
						$el.css('background', "url('" + url + "')");
						$img.error(function() {
							$el.append(error);
							$el.css('background', '');
						});
						$el.removeClass(options.selector);
						$lazys.splice(i, 1);
						var y = setTimeout(function() {
							loadBgImg();
						}, delayTime);
					}
				} else {
					$(window).off('scroll', delayScroll);
				}
			}
		if ($lazys.length) {
			loadBgImg();
			$(window).on('scroll', delayScroll);
			function delayScroll() {
				clearTimeout(d);
				var d = setTimeout(function() {
					loadBgImg();
				}, delayTime);
			}
		}
	}
}

示例 lazyBgImg.html:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}
			.imgBox {
				float: left;
				width: 200px;
				height: 200px;
				margin: 20px;
			}
		</style>
	</head>
	<body>
		<div class="lazyBox">
			<div class="imgBox bg-lazy" data-url="https://via.placeholder.com/1000x200.png/ff0000"></div>
			<div class="imgBox bg-lazy" data-url="https://via.placeholder.com/1000x200.png/4682B4"></div>
			<div class="imgBox bg-lazy" data-url="https://via.placeholder.com/1000x200.png/F0FFF0"></div>
			<div class="imgBox bg-lazy" data-url="https://via.placeholder.com/1000x200.png/FFDEAD"></div>
			<div class="imgBox bg-lazy" data-url="https://via.placeholder.com/1000x200.png/FF4500"></div>
			<div class="imgBox bg-lazy" data-url="https://via.placeholder.com/1000x200.png/A9A9A9"></div>
			<!-- 多复制点上面的代码看效果 -->
		</div>
		<script type="text/javascript" src="https://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
		<script type="text/javascript" src="util.js"></script>
		<script type="text/javascript">
			$(function() {
				util.lazyBackgroundImg({
					delayTime: 100,
					selector: 'bg-lazy'
				});
			});
		</script>
	</body>
</html>

相关文章:

  • 占位图推荐:web前端开发,推荐4个常用在线占位图网址
  • MongoDB副本集搭建
  • nodejs搭建服务篇章三:nodejs搭建服务项目目录的简单介绍及app.js文件简单说明
  • 搭建rsync服务器,实现文件备份同步
  • nodejs搭建服务篇章四:前端通过nodejs搭建的服务连接MySQL数据库中的数据(数据库安装,数据库管理,ajax查询数据),超多图超详细
  • XCode升级到7后,规范注释生成器VVDocumenter插件没有用了,怎么办?
  • vue传值处理:vue中父组件通过props传值给子组件,子组件表单控件使用值,子组件改变该值时如何避免报错
  • axios的二次封装:在vue中如何灵活运用axios请求,二次封装更加灵活,更多参数可配置
  • 清理C盘内存:电脑C盘飘红了,那么如何清理垃圾文件,总结几种亲测方案
  • Part05 - (图文)NSX系列之检查NSX Controller状态
  • JSON.parse转化:如何使得一个字符串类型‘false‘等于布尔类型的false(使‘1‘===1?成立的2种处理办法,与JSON.stringify的)
  • 常用工具函数推荐:前端开发常用的工具函数(拷贝、排序、防抖、去重、合并、时间处理、DOM操作...).md
  • 正则表达式校验文件路径
  • img制图技巧:给img图片添加背景颜色和背景图片,制作出新图片
  • 移动端h5页面click事件延迟300ms,出现该问题的原因分析及解决方案FastClick.js
  • 5、React组件事件详解
  • ES6系列(二)变量的解构赋值
  • HashMap剖析之内部结构
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Yeoman_Bower_Grunt
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 技术胖1-4季视频复习— (看视频笔记)
  • 爬虫模拟登陆 SegmentFault
  • 前端临床手札——文件上传
  • 以太坊客户端Geth命令参数详解
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在Mac OS X上安装 Ruby运行环境
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​水经微图Web1.5.0版即将上线
  • ​虚拟化系列介绍(十)
  • #13 yum、编译安装与sed命令的使用
  • #pragma once
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (2)(2.10) LTM telemetry
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)hibernate配置管理
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (四) Graphivz 颜色选择
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • .gitattributes 文件
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework .NET Core与 .NET 的区别
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 微服务 服务保护 自动重试 Polly
  • .net流程开发平台的一些难点(1)
  • @Autowired和@Resource装配
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Repository 注解
  • @开发者,一文搞懂什么是 C# 计时器!
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [1127]图形打印 sdutOJ