位置: 编程技术 - 正文

jQuery实现瀑布流布局详解(PC和移动端)(jquery 瀑布流)

编辑:rootadmin

推荐整理分享jQuery实现瀑布流布局详解(PC和移动端)(jquery 瀑布流),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue瀑布流实现,jquery瀑布流插件,vue瀑布流实现,jquery瀑布流代码,vue瀑布流实现,vue瀑布流实现,html瀑布流,jquery 瀑布流,内容如对您有帮助,希望把文章链接给更多的朋友!

瀑布流布局已成为当今非常普遍的图片展示方式,无论是PC还是手机等移动设备上。这种布局图片的样式大概分为三种:等高等宽、等宽不等高、等高不等宽,接下来我们就最为普遍的等宽不等高形式来作为示例。

我们用百度图片作为范例:

这就是PC端比较常见的瀑布流布局方式,接下来我们审查下元素看看百度图片里面是如何布局:

可以看到,它里面实际是若干个等宽的列容器,通过计算将图片push到不同的容器里。而本文介绍的展示方法是通过定位的方式,虽然最后布局展示的方式不同,但之前的算法都比较类似。

动手

首先我们将如下样式的若干个单元写进body中,并将“box”向左浮动:

得到如下效果:

接下来:

以上代码大意为:

1. 首先计算出在浏览器中一行能容纳多少图片 (num) ,注意这里用了outerWidth,当传入true时会返回元素包括margin、padding、border全部盒模型属性的尺寸;

2. 创建一个存储每一列高度的数组 (columnHeightArr) ,该数组的长度即为num值;

3. 遍历所有图片,将第一行的图片高度分别存入列高数组中 (columnHeightArr) ,从第二行开始,首先计算出所有列中最小的高度 (minHeight) 以及最小高度所在的列 (minHeightIndex)。之后将第二行开始的图片定位在高度最小列的下面,效果如下:

可以看到虽然摆对了地方但是所有的图片都放在同一个地方了,这是因为我们需要在摆放一张图片后就要增加该列的高度:

结果正确:

注意:上面的代码需要运行于window.onload方法里,因为只有当页面中的图片资源全部加载完毕后,其每张图片的高度才会有效。

因此会有一些很严重的问题,当网络不好的时候图片没有完全加载完成就会出现图片展示不全高度缺失的情况,这点在移动端很明显。而且当我们加载更多时,更难判断新追加的图片是否加载完成。

在实际生产中更不会有一开始就将图片写死在HTML中的情况,所以我们通常用以下的方式来做:

首先我们在获得图片地址时同时也需要获取图片的宽和高 ,这点对服务端后台来说并不是什么难事,可以拜托后台兄弟将图片的宽高数据拼进JSON,传递给你;

*接下来介绍小技巧,非常实用,它能保证一个元素无论大小如何变化,比例始终保持一致。这个技巧尤其适用于移动端,因为元素为了响应式通常使用百分比的形式。

jQuery实现瀑布流布局详解(PC和移动端)(jquery 瀑布流)

假如手机页面中有一张图片,其宽度要为屏幕的一半,高宽比为2:1,需要在任何分辨的手机上保持比例不变。如何做?给元素设置如下属性:

不设置高度,而是用padding“挤”出元素高度,而padding的百分比值都是基于父级容器的宽度。padding需要挤多少呢?就是宽度乘以高宽比(width和padding值均为百分比值),这就是我们为什么需要获得图片尺寸的原因。

效果:

可以看到在chrome手机模拟器中ipone4和肾6Plus的显示效果是完全一样的。在手机页面中宽是固定的,而高会随着页面内容的多少而变化,这个技巧利用元素padding百分比的值其实是基于其父级容器的宽,将高的值巧妙的转化成与宽相关。

说到现在可能有人终于忍不住要问了,讲了这么多和瀑布流有什么关系!简单就是一句话,我们要抛弃 img 标签,而采用背景图的方式。为了使用背景图,就得保持元素的比例永远与图片保持一致。

通过这种方式,可以不用判断图片都加载完毕,直接产生一些与图片同比例的div,再为其设置背景图,如下:

这里比如最外层的box宽度为px,里面的img元素宽度就可以为%,高度就可以通过padding挤出了。

懒加载

使用背景图的方式还有好处那就是可以比较方便的实现懒加载。那什么是懒加载呢?就是当元素在我们的视野中时才展示图片,滚动时屏幕下方的图片并不展示,这可以很好的增加加载速度提升体验。

首先我们给最外层的box增加一个box-item类名(之后有用),将图片url并不设置给backgroundImage属性,而是赋给一个自定义属性:data-src。

接下来我们编写懒加载函数:

首先我们获取所有拥有 .box-item 类名的元素,遍历。viewTop 为图片相对于浏览器窗口的相对高度,类似于position:fixed感觉。

通过条件进行判断,只有当该图片在浏览器窗口内(之上或之下都不行)时,将需要设置背景图元素的 data-src 值展示出来,并删除该属性。

之后将最外层元素的 box-item 删除,因为已经展示出来的图片不需要再进行这些判断,删除了该类名下一次滚动时就不会获取到已经展示过的元素,需要遍历的次数就会越来越少,这样能起到一个优化的作用。

该函数需要在你的元素已经append进页面时调用,以及在滚动时调用:

lazyLoad();$(window).scroll(lazyLoad);

滚动加载

说完了懒加载,再说说滚动加载。所谓滚动加载就是当页面滚动到底部附近时加载新的图片。我这里选择的是滚动到高度最小的列底部时加载新的数据,你也可以根据自己的喜好来做判断。

滚动加载也是在window的滚动事件中进行监听,可以与懒加载一起进行:

说完了PC端,我们来说下手机端。其实原理是一样的,只是从多列变成固定的两列了。

不同的是为了适应不同屏幕的手机,最外层的box容器宽度和边距要设置成百分比的形式。

最后有一点要注意,因为我们没有像百度一样用一个个列盒子去装,而是用定位的方式。导致的问题是图片元素的父级没法自适应高度,如果你有相关的需求我们可以计算出所有列中最长的长度,并将这个值赋值给父容器的min-height属性:

$('body').css('minHeight',Math.max.apply(null, columnHeightArr));

整理下完整的代码,瀑布流的全套服务就到这了

标签: jquery 瀑布流

本文链接地址:https://www.jiuchutong.com/biancheng/370455.html 转载请保留说明!

上一篇:jQuery实现切换页面过渡动画效果(jquery点击切换div)

下一篇:jQuery实现的仿百度分页足迹效果代码(jquery的实现原理)

  • 个体工商户能开多少钱的普票
  • 出口退税进项税额转出怎么申报
  • 交通运输企业车辆折旧能加速扣除
  • 上季度忘记申报个税了
  • 购买金蝶软件多少钱
  • 客运地方税务局监制发票还能用吗?
  • 销售费用与管理的关系
  • 发放股票股利增资
  • 个人非专利技术转让属于什么收入
  • 如何做现金支票凭证
  • 公司基本账户销户需要带什么资料
  • 工程报废及毁损如何做会计处理合适呢?
  • 预收装修款并开发票如何转成本?
  • 信用卡产生滞纳金
  • 企业亏损需要缴税吗
  • 增值税免税收入进项税额转出
  • 红字发票勾选平台里有吗
  • 简易计税视同销售如何处理?
  • 主营业务净利率和销售净利率一样吗
  • 股金属于金融产品吗
  • win10 搜狗
  • 主营业务成本如何算
  • 预缴税款是否计入成本
  • 马齿苋的功效与作用的功能与主治与用量
  • PHP:Memcached::decrementByKey()的用法_Memcached类
  • 打印机疑难解答显示打印机问题
  • 查补以前年度税款账务处理
  • johnny kim宇航员
  • 收到投标保证金利息如何账务处理
  • 购入固定资产的会计处理
  • 'The Wave' sandstone formation in Coyote Buttes North, Paria Canyon-Vermilion Cliffs National Monument, Arizona (© Dennis Frates/Alamy)
  • 国家规定发票多久之内可以开
  • phpsubstr_replace
  • php rsa
  • php中实现文件上传需要用到哪几个函数
  • 自然人税收管理系统扣缴客户端app
  • php socket_create
  • 增值税已认证抵扣
  • stm32cubeIDE开发串口 修改速率
  • 麻雀优化算法和鲸鱼算法哪个好
  • centos7编译安装内核
  • node.js最新版本
  • 物业公司的会计科目有哪些
  • 流动资产的含义及常见项目
  • 投资收益如何记账
  • 视同销售到底如何纳税调整?
  • php array_fill
  • php安装不了
  • 如何修改php网页内容
  • 公司还没有注销但是银行账户已经去注销了
  • 成本核算方法是资源到作业,作业到产品吗?
  • 商场扣钱犯法
  • 短期借款可以用于在建工程吗
  • 个体工商户的个税起征点
  • 利润表的所得税和所得税申报表所得税
  • 汽车销售公司办理贷款重点调查哪些
  • 固定资产清理账户期末有余额吗
  • 工程总包含设备工程吗
  • 小规模纳税人企业所得税税率
  • 进项税额大于销项税月末结转
  • 360天认证期是什么时候发布的
  • 电子承兑到期怎么申请付款
  • 怎么样建账做账
  • 管理费用的明细科目如何设置
  • 基于Sql Server通用分页存储过程的解决方法
  • FreeBSD架? FTP
  • 电脑主板bios是什么意思
  • ubuntu20开机自启动
  • win8优化驱动器
  • 千元以内电脑
  • winxp鼠标右键菜单栏怎么改
  • win7系统怎么操作
  • jquery的deferred
  • pip工具安装
  • jquery选择器的分类有哪些
  • python中的stringvar
  • 进项票当月认证怎么操作
  • 网上报税失败什么原因
  • 车辆购置税是国税吗
  • 电子税务局备案财务会计制度
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设