开始

做一个小项目,算是对jsjQuery的一次练习吧。

图片资源来自这个网站(上面有很多高清图片关键还是免费下载的):
https://unsplash.com/

项目具体效果可以点这里:
https://bjw1234.github.io/ima...

项目GitHub地址点这里:
厚着脸皮再说一句,欢迎各位大佬star
https://github.com/bjw1234/im...

懒加载插件

使用jQuery封装一个简单的滚动加载插件scrollLoading

使用方式:

// jQuery对象调用scrollLoading方法即可。
// 通过传递实际参数扩展默认值。
$('.loading').scrollLoading({attr: 'data-url', // 可选: 图片实际地址属性container: $(window), // 可选: 滚动容器callback: $.noop() // 可选: 回调函数
});

在HTML中:

<img class="loading" data-url="http://xxx/xxx/xxx.jpg" src="https://img-blog.csdnimg.cn/2022010708135191528.gif">

插件实现思路:

通过给滚动容器绑定scroll事件,在滚动时判断元素(jQuery对象)是否位于可见区域,如果是则动态的改变imgsrc属性值。

代码实例:
只是简单示例,不代表具体内容。

var loading = function(){// 滚动容器高度let containerHeight = container.height();// 垂直滚动条位置(卷起的高度)let containerScrollTop = container.scrollTop();// 判断是否位于可见区域let position = obj.offset().top - containerScrollTop;if(obj.is(':visible')&&(position >= 0 && position < containerHeight)) {// 这时就可以去改变img的src属性obj.attr(src,url); ...}
}// 容器绑定滚动事件
container.bind('scroll',loading);

瀑布流布局

由于实现起来比较简单所以没有将其封装成插件。

实现思路:
维护好一个数组,这个数组个数为流体布局的列数,数组元素为每一列的高度值。通过绝对定位的方式将每一个元素布局在合适的位置。
这样说还是比较抽象的,且看代码示例:

// 需要实现瀑布流的一些元素
let boxes = $('.xxx');
// 一个盒子的宽度
let w = boxes.eq(0).outerWidth();
// 列数
let cols = Math.floor($(window) / w);
// 存放列高度的数组
let hArr = [];
boxes.each((index,item) => {let h = boxes.eq(index).outerHeight();if(index < cols){  // 第一行hArr[index] = h;} else {// 拿到最小的那个高度值let minH = Math(...hArr);// 拿到其对应的下标let i = $.inArray(minH,hArr);// 动态的设置元素的定位$(item).css({'position':'absolute','left': w * i + 'px','top': minH + 'px'});      // 更新存放列高度的数组hArr[i] += boxes.eq(index).outerHHeight();}
});

LightBox插件

通过事件代理,当用户点击某一张图片时,弹出一个弹框展示高清大图。在img标签中需要传递的一些参数。

需要的一些参数:

data-role="lightbox"  // 启动LightBox插件
data-id="xxxxxx" // 该图片的唯一标识符
data-group="xxx-group" // 图片分组的名称
data-source="xxx-url" // 原始大图地址
data-caption="xxxx" // 图片的描述文字

使用方式:
除了引入必要的js和css文件之外,在代码中new这个插件即可:

new LightBox({maskOpacity: 0.5, // 遮罩层透明度(可选)animateSpeed: 'fast' // 动画执行速度(可选)    ...
});

比较重要的一点就是关于图片预加载的实现:

function preLoadPicture(src,callback) {let image = new Image();image.src = src;if(!!window.ActiveXObject){ // IEimage.onreadystatechange = function(){if(image.readyState === 'complete') {callback(image.width,image.height);}}} else { // NOT IEimage.onload = function(){callback(image.width,image.height);}}
}

结束

了解了以上内容,实现图片搜索、展示、无限滚动加载的效果就比较简单啦。
无非就是:

  • 获取用户输入的keyWord
  • ajax获取图片json信息
  • 组装、填充页面HTML数据
  • 瀑布流布局处理
  • 在页面滚动时判断最后一张图片是否可见,如果是则重复以上内容

查看源码:
https://github.com/bjw1234/im...

懒加载、瀑布流和LightBox实现图片搜索效果相关推荐

  1. RecyclerView加载瀑布流,图片自适应问题

    在使用recyclerView加载瀑布流时,由于图片加载慢于item绘制,从而导致item中的图片无法正常显示,不是被压缩就是拉伸. 解决方案: 1.后台给一个图片的原始宽高,在recyclerVie ...

  2. 纯JS实现懒加载+瀑布流布局

    瀑布流布局一般用于图片布局,其视觉表现为参差不齐的多栏布局,随着页面的滑动,会不断加载新的图片. 懒加载主要用于实现提高系统的响应速度.对于图片比较多的网页,如果一次性加载出所有的图片,会导致系统的加 ...

  3. ajax瀑布流布局,懒加载 瀑布流布局

    前几天星星零零的学习,终于搞定了懒加载和瀑布流布局,下面我们通过这篇文章一起学习和探讨一下~ 懒加载 首先,什么是懒加载呢?原理? 其原理是:将图片的 src 设置为统一的一张默认图片 / loadi ...

  4. Php资讯瀑布流模板,无限下拉加载瀑布流zblogphp模板 还有自适应+seo优化-收费zblogphp模板-天兴工作室...

    主题更新: 2019年01月11日更新:此次更新较大,请老用户先浏览演示网站确定符合需求后再升级. 1.增加主题自带seo配置(新增seo标题和间隔符): 2.大幅度优化了界面,彻底修复了某些分辨率下 ...

  5. Java对图片懒加载_[Java教程]JQuery实现图片懒加载_星空网

    JQuery实现图片懒加载 2018-08-16 0 懒加载的原因: 对于图片过多的场景,为了提高页面的加载速度,降低服务器的负载,增强用户体验,我们对还没出现在视野的图片先不加载,当元素出现在我们视 ...

  6. jQuery动态加载瀑布流

    jquery实现瀑布流 案例分析 首先,它的每个图片是等宽的 其次,除第一排正常显示其余的图片都会显示在上一排中高度最小的那个图片的下面 最后,就是根据最矮图片所在位置的宽高来,决定绝对定位设置图片显 ...

  7. 分页组件change_javascript原生瀑布流+图片懒加载组件

    我不是天使:javascript原生手动分页组件​zhuanlan.zhihu.com 我不是天使:javascript原生自定义轮播图组件​zhuanlan.zhihu.com 一大早就去办签证,啦 ...

  8. 图片懒加载的原理和实现

    一,前置知识 1,为什么要图片懒加载 懒加载是一种对网页性能优化的方式,比如当访问一个页面的时候,优先显示可视区域的图片而不是一次性加载所有图片,当需要显示时,再发送图片请求,避免打开网页时加载过多资 ...

  9. Python:图片懒加载技术

    一. 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import reques ...

最新文章

  1. (C++)对用户输入的整形数组进行冒泡排序
  2. 操作系统学习:Linux0.12初始化详细流程-进程退出与系统进入怠速
  3. Layui框架 中table解决日期格式问题
  4. 虚拟机备份oracle异常,客户端连接虚拟机Oracle服务器异常
  5. iOS学习笔记19 地图(一)定位CoreLocation
  6. extern “C”
  7. 这40张图送给单身程序员,情人节请一笑而过!
  8. Spark基础学习笔记23:DataFrame与Dataset
  9. 如何在服务器运行aspx_ASP.NET开发实战——(四)MVC是如何运行?它的生命周期是什么?...
  10. vue如何让一句代码只执行一次_lt;Vue 源码笔记系列4gt;异步更新队列与$nextTick...
  11. 'React' must be in scope when using JSX react/react-in-jsx-scope报错:
  12. 四个措施打造安全的DevOps流程
  13. Ubuntu 16.04 安装caffe(CPU)以及编译问题处理
  14. 使用Flutter开发一个仿微信飞机大战游戏
  15. 浪曦视频在线的ASP.NET AJAX视频教程下载
  16. HTML与CSS面试题汇总
  17. MathType7.0嵌入Office2019教程
  18. 单片机光敏电阻c语言程序怎么写,光敏传感器原理图 单片机程序及光敏电阻简介文档下载...
  19. Verilog语法概述(一)
  20. Vonage与华尔街英语合作为其数字教室提供助力

热门文章

  1. 看我如何用python来玩百万英雄
  2. linux中 字符串,linux内核驱动中对字符串的操作
  3. python如何判断QQ是否在线?
  4. 安装easydict
  5. Java 8 方法引用 (Method Reference)快速介绍与示例
  6. [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab)
  7. Oracle 9i和10g安装后的基本环境与服务
  8. Alibaba Druid 源码阅读(一) 数据库连接池初步
  9. 滚动图片广告_女排赢球可喜看台马桶广告扎眼 网友:去男足赛场!别在这儿蹭热点...
  10. mysql 高并发 卡死,高并发中的卡死状态 -HashMap