一、什么是图片懒加载

当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),当图片出现在浏览器的可视区域内时,才设置图片真正的路径,让图片显示出来。这就是图片懒加载。

通俗一点:

1、就是创建一个自定义属性data-src存放真正需要显示的图片路径,而img自带的src放一张大小为1 * 1px的图片路径

2、当页面滚动直至此图片出现在可视区域时,用js取到该图片的data-src的值赋给src。

ps:自定义属性可以取任何名字


HTML:

html.png

CSS:

  1. <style>
  2. .container {
  3. max-width: 800px;
  4. margin: 0 auto;
  5. }
  6. .container:after{
  7. content: '';
  8. display: block;
  9. clear: both;
  10. }
  11. .container img {
  12. float: left;
  13. width: 50%;
  14. }
  15. h1{
  16. clear: both;
  17. }
  18. </style>

二、需要了解的问题

1、如何加载图片?

2、如何判断一个元素出现在视野中?

  • 如何加载图片

    只需要把data-src中的地址放到src的里面就好了

代码:

  1. function loadImg($img){
  2. //.attr(值)
  3. //.attr(属性名称,值)
  4. $img.attr('src', $img.attr('data-src')) //把data-src的值 赋值给src
  5. $img.attr('data-isLoaded', 1) //已加载过的图片做标记
  6. }

结果如下:

地址更换.png
  • 如何判断一个元素出现在视野中?

    元素相对顶点的距离(文字) <= 窗口高度 + 滚动的距离

代码:

  1. function isShow($node){
  2. return $node.offset().top <= $(window).height() + $(window).scrollTop()
  3. }

如图:

判断一个元素出现在视野中.png

原理.png

js:

  1. start()
  2. $(window).on('scroll', function(){
  3. start()
  4. })
  5.  
  6. function start(){
  7. //.not('[data-isLoaded]')选中已加载的图片不需要重新加载
  8. $('.container img').not('[data-isLoaded]').each(function(){
  9. var $node = $(this)
  10. if( isShow($node) ){
  11. loadImg($node)
  12. }
  13. })
  14. }
  15.  
  16. //判断一个元素是不是出现在窗口(视野)
  17. function isShow($node){
  18. return $node.offset().top <= $(window).height() + $(window).scrollTop()
  19. }
  20. //加载图片
  21. function loadImg($img){
  22. //.attr(值)
  23. //.attr(属性名称,值)
  24. $img.attr('src', $img.attr('data-src')) //把data-src的值 赋值给src
  25. $img.attr('data-isLoaded', 1)//已加载的图片做标记
  26. }
  27.  
  28. </script>

注:记得引用jQuery,元素浮动,必须清除。

img 的data-src 属性及懒加载的更多相关文章

  1. 计算型属性 vs 懒加载

    只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性 计算型属性本身不占用内存空间 不可以给计算型属性设置数值 计算型属性可以使用以下代码简写 var titl ...

  2. Spring - bean的lazy-init属性(懒加载)

    默认情况下,容器初始化的时候便会把bean实例化,通常这样做可以让一些配置或者bean实例化的异常在容器启动的时候就发现,而不是在N久之后.但有时候,我们希望某个可能不会用到但又不是100%不用的be ...

  3. Hibernate Lazy属性与懒加载 整理

    lazy概念:要用到的时候,再去加载,对于关联的集合来说,只有当访问到的时候,才去加载它所关联的集合,比如一个user对应很多权限,只有当user.getRights()的时候,才发出select r ...

  4. swift的计算属性和懒加载

    计算属性每次都重新计算. 懒加载只计算一次. 可以借助backing store将计算属性转化为懒加载属性. 计算属性实质上退化为函数调用. 计算属性的标示是get.set.

  5. hibernate--lazy(懒加载)属性

    关联映射文件中<class>标签中的lazy(懒加载)属性 Lazy(懒加载):只有在正真使用该对象时,才会创建这个对象 Hibernate中的lazy(懒加载):只有我们在正真使用时,它 ...

  6. js 图片懒加载

    图片懒加载(图片出现在可视区域再加载) 兼容性:兼容目前流行的全部浏览器,包括:兼容到IE6) 使用方法: 引入相应的js文件<script src="js/lazy.js" ...

  7. angular配置懒加载路由的思路

    前言 本人记性不好,对于别人很容易记住的事情,我愣是记不住,所以还是靠烂笔头来帮我长长记性. 参考文章:https://blog.csdn.net/xif3681/article/details/84 ...

  8. 懒加载 字典转模型 自定义cell

    1 懒加载: 1>  什么是懒加载? 懒加载又称为延时加载,即在系统调用的时候加载,如果系统不调用则不会加载.所谓的懒加载其实就是重写其 get 方法. 2>  特点:在使用懒加载的时候要 ...

  9. JPA数据懒加载LAZY配合事务@Transactional使用(三)

    上篇博文<JPA数据懒加载LAZY和实时加载EAGER(二)>讲到,如果使用懒加载来调用关联数据,必须要保证主查询session(数据库连接会话)的生命周期没有结束,否则,你是无法抽取到数 ...

随机推荐

  1. 探索 .NET Core 依赖注入的 IServiceProvider

    在上一篇文章中,我们学习了Microsoft.Extensions.DependencyInjection中的IServiceCollection,包括服务注册转换为ServiceDescriptor ...

  2. 12张图打开JMeter体系结构全局视角

    JMeter是Java技术栈工具,在软件测试领域应用非常广泛,无论是性能测试还是接口测试,技术都很成熟和稳定.它有一个突出特点:开源,适合做二次开发,以阿里为代表的Java技术栈公司都对它青睐有加.在 ...

  3. 微信小程序折线图表折线图加区域图

    1.先来个效果图 这里我用的是插件@antv/f2-canvas(安装的方法如下) npm init 此处如果直接使用官方npm install 可能会出现没有node_modules错误 npm i ...

  4. 安全计算环境之剩余信息保护-windows

    参考https://blog.csdn.net/ubjewen/article/details/107587951 应保证鉴别信息所在的存储空间被释放或重新分配前得到完全清除 交互式登录: 之前登录到 ...

  5. HTML的基础语法

    区别于c语言这类高级语言,HTML不是编程语言,而好似一种描述型语言,用于描述网页中内容的显示方式. HTML标记以<>来进行标记.HTML中的标记按其是否成对出现,可以分为单标记和双标记 ...

  6. 【linux】系统编程-8-Socket

    目录 前言 11. 套接字 11.1 Socket简介 11.2 socket() 11.3 bind() 11.4 connect() 11.5 listen() 11.6 accept() 11. ...

  7. 【Azure Developer】Github Action部署资源(ARM模板)到Azure中国区时,遇见登录问题的解决办法

    问题描述 在参考文档"使用 GitHub Actions 部署 ARM 模板"一文中,由于是在中国区Azure上操作,所以生产的部署凭证为中国区凭证.当创建工作流时,在登录到Azu ...

  8. 通过xshell实现内网linux上公网yum、apt-get安装软件

    环境:在内网,我的机器可上网,内网服务器不可上网,本来在我机器上开个代理,服务器直接通过我机器上网就可以,奈何网络配置太复杂,目前只有ssh端口可通. 先安装ccproxy软件,配置http监听端口为 ...

  9. Python基础之数据类型详解

    为什么会有数据类型? 在介绍具体的数据类型之前,需要了解为什么需要区分数据类型.我们知道,一个公司会有很多个大的部门,每个部门下又会有许多细分的小部门,构成了公司的完整体系结构.如果把python的数 ...

  10. .net 预处理指令符的使用

    目录 什么是预处理指令符? 预处理指令符的使用 自定义指令符 使用Visual Studio快速定义指令符 定义指令符区域 什么是预处理指令符? 当C#编译器找到一条预处理指令#if,最后找到一条指令 ...