js学习之原生js实现懒加载
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>
img{
width: 500px;
height: 500px;
display: block;
}
</style>
</head>
<body>
<div class = "box">
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
</div>
</body>
<script type="text/javascript">
(function(){
function tagName(tagName){
return document.getElementsByTagName(tagName);
}function addEvent(obj,type,func){
if(obj.addEventListener){
obj.addEventListener(type,func,false);
}else if(obj.attachEvent){
obj.attachEvent('on'+type,func);
}
}
var v = {
eleGroup:null,
eleTop:null,
eleHeight:null,
screenHeight:null,
limitHeight:null
}
function init(element){
v.eleGroup = document.getElementsByTagName(element);
v.screenHeight = document.documentElement.clientHeight;
var len = v.eleGroup.length;
for(var i = 0;i < len; i++){
if(v.eleGroup[i].offsetTop<v.screenHeight&&v.eleGroup[i].getAttribute("asrc")){
v.eleGroup[i].setAttribute("src",v.eleGroup[i].getAttribute("asrc"));
v.eleGroup[i].removeAttribute("asrc");
}
}
}
function lazyload(){
v.limitHeight = document.documentElement.scrollTop || document.body.scrollTop + document.documentElement.clientHeight;
var len = v.eleGroup.length;
for(var j = 0 ;j < len; j++){
if(v.eleGroup[j].offsetTop <= v.limitHeight&&v.eleGroup[j].getAttribute("asrc")){
v.eleGroup[j].setAttribute("src",v.eleGroup[j].getAttribute("asrc"));
v.eleGroup[j].removeAttribute("asrc");
}
}
}
init("img");
addEvent(window,"scroll",lazyload);
})()
</script>
</html>
我们知道了浏览器加载img是很耗费资源的,还有带宽,而且还有一个特点就是如果没有设置img的src属性,就不会消耗这些资源,所以我们用到的加载的方法就是首先将所有img的src置空,然后自定义一个asrc属性,这里放的是实际的src,当我们需要加载这张图片时就可以获取img的这个属性,并将其值赋值给src,实现图片的加载。
思路:首先在当前可视化的区域加载图片,首先需要获取浏览器的高度,然后查询每个元素相对浏览器顶部距离,然后加载满足:相对浏览器顶部的距离小于浏览器高度的图片,实现对可视化区域的初始化填充。
真正实现懒加载的原理是:获取当前元素距离浏览器顶部的高度,与浏览器+scroll卷到上面的高度相比较,如果前者小于后者就代表轮到这张图片显示了!就把它加载出来。
ps:需要注意的地方
addEventListener VS attachEvent
前者兼容主流浏览器,后者兼容ie(ie6及更高级版本兼容,低于ie6未测试)
document.documentElement VS document.body
ie默认的box-sizing为border-box不会将html识别为盒模型,所以用document.documentElement就获取不到clientHeight scrollHeight等值。所以使用
document.documentElement.scrollTop || document.body.scrollTop
可以解决兼容性问题
js学习之原生js实现懒加载的更多相关文章
- 001_Chrome 76支持原生HTML 图片懒加载Lazy loading
Table Of Content 什么是懒加载? 语法参数及使用方式? 有哪些特点? 与js有关的实践 什么是懒加载? 技术背景 Web应用需要经常向后台服务器请求资源(通过查询数据库,是非常耗时耗资 ...
- Spring5.0源码学习系列之浅谈懒加载机制原理
前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文挑一个比较重要的知识点Bean的懒加载进行学习 1.什么是懒加载? 懒加载(Lazy-ini ...
- 原生 JS 实现最简单的图片懒加载
懒加载 什么是懒加载 懒加载其实就是延迟加载,是一种对网页性能优化的方式,比如当访问一个页面的时候,优先显示可视区域的图片而不一次性加载所有图片,当需要显示的时候再发送图片请求,避免打开网页时加载过多 ...
- Vue-Router学习第二弹动态路由\懒加载\嵌套路由
在我们做项目时肯定会有出现动态路由: 举个栗子: 一个品种的商品页面会有同类不同样的商品就要在路由的后面加一个id: Vue的路由id是这样添加的: 两种动态路由 一种是params参数添加: 首先现 ...
- 原生javascript代码懒加载
1.先定义需要懒加载的样式: class="lazyload" 2.设置初始透明度为0.1: .lazyload{ filter: Alpha(opacity=10); -moz- ...
- 【转】ViewPager学习笔记(一)——懒加载
在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...
- [转]ViewPager学习笔记(一)——懒加载
在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...
- Swift 学习一函数&函数属性&懒加载
函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值} func 函数名(参数列表){ // 返回值为Void 可 ...
- Chrome 75 将原生支持图片懒加载
4 月 6 日,Google 的 Chrome & Web 平台工程经理 Addy Osmani 在个人博客发文,介绍到 <img> 和 <iframe> 的 load ...
随机推荐
- php的运行模式
1.php最常见的五种运行模式. CGI 通用网关接口 FastCGI 常驻内存的CGI CLI 命令行 Web模块 Apache等Web服务器 模块的形式加载php进程 ISAPI 已经不用了
- 【BZOJ2054】疯狂的馒头(并查集)
/* 经典思路, 倒序并查集处理即可 */ #include<cstdio> #include<algorithm> #include<cstring> #incl ...
- 【转】【测试用例设计】WEB通用测试用例
易用性 1.便于使用.理解.并能减少用户发生错误选择的可能性 2.当数据字段过多时,使用便于用户迅速吸取信息的方式表现信息,突出重点信息,标红等方式 3.显示与当前操作相关的信息,给出操作提示. 4. ...
- 【学习】Python进行数据提取的方法总结【转载】
链接:http://www.jb51.net/article/90946.htm 数据提取是分析师日常工作中经常遇到的需求.如某个用户的贷款金额,某个月或季度的利息总收入,某个特定时间段的贷款金额和笔 ...
- kubernetes nginx ingress controller部署
Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...
- js基本知识
1.js中的数据类型: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 2.typeof 返回的是字符串,有 ...
- 201772020113 李清华《面向对象程序设计(java)》第16周学习总结
1.实验目的与要求 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程的优先级属性及调度方法: (4) 掌握线程同步的概念及实现技术: 2.实验内容和步骤 实验1:测试程 ...
- C罗转会尤文图斯
皇家马德里头号球星C罗转会意甲尤文图斯,结束了9年的皇马生涯,已获得5座金球奖.
- 11Linux_sshd_Apache
1.Linux系统中一切都是文件. 2.配置服务实际上就是在修改配置文件. 3.重启相应服务来加载最新的配置参数. 4.为了保证下次还生效,加入到开机启动项中.
- Java数据类型(Primivite 和引用数据类型!)
一.byte(8位) short(16位) int(32位) long(64位) float(32位) double(64位) boolean(Java虚拟机决定) true 或者false! ...