小程序瀑布流解决左右两边高度差距过大的问题


Posted in HTML / CSS onFebruary 20, 2019

想要实现瀑布流的布局效果,并且是按照从左到右顺序显示的话,css布局方式暂时还不能满足我们的需求。参考小红书的瀑布流效果,小红书是分左右两栏的,按照奇数偶数来显示就可以。

<view class="waterfall">
     <view class="waterfall-left">
           <view wx:if="{{index%2 == 0}}" class="item"></view>
     </view>
     <view class="waterfall-right">
           <view wx:if="{{index%2 == 1}}" class="item"></view>
     </view>
</view>

但是问题来了,随着每个元素高度的不确定性,很大几率会出现左右两栏高度相差大的问题。

解决方法:

要解决这个问题,我们要找出导致每个元素的高度不同的原因,一般是图片的高度,也可能是根据条件显示的某些区域,建议只有图片的高度不同,其它部分的高度保持不变,这会使得我们的计算变得简单。
大概思路,取得左右两栏的高度,计算左右两栏的高请输入代码度差值,移动两栏差值threshold的2分之1,如图:

小程序瀑布流解决左右两边高度差距过大的问题

上面是理想的状态,但是我们不可能切开元素,我们要知道高度高的一边的是否有符合移动的元素,如果高度高的那栏中高度最小的元素minH 小于 差值threshold,那么我们可以移动,可以取长边某个与差值的二分之一高度最接近的一个元素minH(一般是高度最小的那个,也可以取巧地移动高度最小的一个)。如果高度最小的元素比差值还大,则不需要移动。

小程序瀑布流解决左右两边高度差距过大的问题

那么怎么移动,默认给元素一个属性position,值为center,如果该元素要移动到左边,那么给该元素一个属性:position:left;优先根据position属性来显示,其次才根据奇数偶数来显示,如下:

<view class="waterfall">
     <view class="waterfall-left">
           <view wx:if="{{item.position=='left' || (index%2 == 0&&item.position=='center')}}" class="item"></view>
     </view>
     <view class="waterfall-right">
           <view wx:if="{{item.position=='right' || (index%2 == 1&&item.position=='center')}}" class="item"></view>
     </view>
</view>

至此,高度相差较大的问题就可以解决了。

我们如何计算两栏的高度呢?

重点是获取图片的宽高,我们就可以知道两栏的高度,这里分两种情况:

1. 接口返回图片的宽高

接口返回了图片的宽高,那么我们直接累加图片的高度,就可以比较两栏的高度,得出高度差。

如果较高的一边的minH比两栏高度的差值threshold小,即minH < threshold,那么minH就需要移动

这种方式在拿到数据的同时,我们就可以知道某个元素是否需要移动。处理完数据后马上渲染到视图层。

这种方法当然是最省心的,但是接口也有可能不返回图片的宽高,于是就要用第2种方法了。

2. 接口不返回图片的宽高,在图片load事件取得图片宽高

监听图片的load事件,获得图片的宽高,在最后一张图片load完之后,用boundingClientRect测量两栏的高度,得出高度差。

这种方法则必须在图片加载完,再测量某个元素是否需要移动,元素移动会比较明显。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS中一些@规则的用法小结
Mar 09 HTML / CSS
详解CSS的border边框属性及其在CSS3中的新特性
May 10 HTML / CSS
CSS3实现DIV圆角效果完整代码
Oct 10 HTML / CSS
css3 box-sizing属性使用参考指南
Jan 08 HTML / CSS
css3让div随鼠标移动而抖动起来
Feb 10 HTML / CSS
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
May 07 HTML / CSS
网页切图的CSS和布局经验与要点
Apr 09 HTML / CSS
CSS3让登陆面板3D旋转起来
May 03 HTML / CSS
纯HTML5+CSS3制作生日蛋糕代码
Nov 16 HTML / CSS
HTML5上传文件显示进度的实现代码
Aug 30 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
Oct 16 HTML / CSS
canvas学习总结三之绘制路径-线段
Jan 31 HTML / CSS
h5网页水印SDK的实现代码示例
Feb 19 #HTML / CSS
canvas绘图按照contain或者cover方式适配并居中显示
Feb 18 #HTML / CSS
canvas 橡皮筋式线条绘图应用方法
Feb 13 #HTML / CSS
Canvas系列之滤镜效果
Feb 12 #HTML / CSS
canvas学习总结三之绘制路径-线段
Jan 31 #HTML / CSS
移动端Html5中百度地图的点击事件
Jan 31 #HTML / CSS
Html5页面内使用JSON动画的实现
Jan 29 #HTML / CSS
You might like
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
php+mysql实现无限级分类
2015/11/11 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
js 操作select相关方法函数
2009/12/06 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
分享Python文本生成二维码实例
2016/01/06 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
体育老师的教学自我评价分享
2013/11/19 职场文书
行政部主管岗位职责
2013/12/28 职场文书
置业顾问岗位职责
2014/03/02 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
企业口号大全
2014/06/12 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
开学典礼致辞
2015/07/29 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫
zabbix配置nginx监控的实现
2022/05/25 Servers