微信公开课
微信公开课小程序热议问题「转微信小程序中实现瀑布流布局和无限加载」
摘要:如何解决转微信小程序中实现瀑布流布局和无限加载
展开:瀑布流布局是一种比较流行的页面布局方式,最典型的就是Pinterest.com,每个卡片的高度不都一样,形成一种参差不齐的美感。在HTML5中,我们可以找到很多基于jQuery之类实现的瀑布流布局插件,轻松做出这样的布局形式。在微信小程序中,我们也可以做出这样的效果,不过由于小程序框架的一些特性,在实现思路上还是有一些差别的。今天我们就来看一下如何在小程序中去实现这种瀑布流布局:小程序瀑布流布局我们要实现的是一个固定2列的布局,然后将图片数据动态加载进这两列中而加载进来的图片,会根据图片实际的尺寸,来决定到底是放在左列还是右列中。/*单个图片容器的样式*/.img_item{width:48%;margin:1%;display:inlineblock;verticalalign:top;}我们知道,在HTML中,我们要动态加载图片的话,通常会使用newImage()创建一个图片对象,然后通过它来动态加载一个url指向的图片,并获取图片的实际尺寸等信息。而在小程序框架中,并没有提供相应的JS对象来处理图片加载。其实我们可以借助wxml中的组件来完成这样的功能,虽然有点绕,但还是能满足我们的功能要求的。viewstyle=display:noneimagewx:for={{images}}wx:key=idid={{item.id}}src={{item.pic}}bindload=onImageLoadimageview我们可以在Page中通过数据绑定,来传递要加载的图片信息到wxml中,让组件去加载图片资源,然后当图片加载完成的时候,通过bindload指定的事件处理函数来做进一步处理。我们来看一下Page文件中定义的onImageLoad函数。在其中,我们可以从传入的事件对象e上,获取到组件的丰富信息,包括通过它加载进来的图片的实际大小。然后我们将图片按照页面上实际需要显示的尺寸,计算出同比例缩放后的尺寸。接着,我们可以根据左右两列目前累积的内容高度,来决定把当前加载进来的图片放到哪一边。letcol1H=0;letcol2H=0;Page({data:{scrollH:0,imgWidth:0,loadingCount:0,images:[],col1:[],col2:[]},onLoad:function(){wx.getSystemInfo({success:(res)={letww=res.windowWidth;letwh=res.windowHeight;letimgWidth=ww*0.48;letscrollH=wh;this.setData({scrollH:scrollH,imgWidth:imgWidth});//加载首组图片this.loadImages();}})},onImageLoad:function(e){letimageId=e.currentTarget.id;letoImgW=e.detail.width;//图片原始宽度letoImgH=e.detail.height;//图片原始高度letimgWidth=this.data.imgWidth;//图片设置的宽度letscale=imgWidth/oImgW;//比例计算letimgHeight=oImgH*scale;//自适应高度letimages=this.data.images;letimageObj=null;for(leti=0;iimages.length;i++){letimg=images[i];if(img.id===imageId){imageObj=img;break;}}imageObj.height=imgHeight;letloadingCount=this.data.loadingCount1;letcol1=this.data.col1;letcol2=this.data.col2;//判断当前图片添加到左列还是右列if(col1H=col2H){col1H+=imgHeight;col1.push(imageObj);}else{col2H+=imgHeight;col2.push(imageObj);}letdata={loadingCount:loadingCount,col1:col1,col2:col2};//当前这组图片已加载完毕,则清空图片临时加载区域的内容if(!loadingCount){data.images=[];}this.setData(data);},loadImages:function(){letimages=[{pic:../../images/1.png,height:0},{pic:../../images/2.png,height:0},{pic:../../images/3.png,height:0},{pic:../../images/4.png,height:0},{pic:../../images/5.png,height:0},{pic:../../images/6.png,height:0},{pic:../../images/7.png,height:0},{pic:../../images/8.png,height:0},{pic:../../images/9.png,height:0},{pic:../../images/10.png,height:0},{pic:../../images/11.png,height:0},{pic:../../images/12.png,height:0},{pic:../../images/13.png,height:0},{pic:../../images/14.png,height:0}];letbaseId=img+(+newDate());for(leti=0;iimages.length;i++){images[i].id=baseId++i;}this.setData({loadingCount:images.length,images:images});}})这里是显示在两列图片的wxml代码,我们可以看到在组件上,我们通过使用bindscrolltolower设置了事件监听函数,当滚动到底部的时候,会触发loadImages去再加载下一组的图片数据,这样就形成了无限的加载:scrollviewscrolly=truestyle=height:{{scrollH}}pxbindscrolltolower=loadImagesviewstyle=width:100%viewclass=img_itemviewwx:for={{col1}}wx:key=idimagesrc={{item.pic}}style=width:100%;height:{{item.height}}pximageviewviewviewclass=img_itemviewwx:for={{col2}}wx:key=idimagesrc={{item.pic}}style=width:100%;height:{{item.height}}pximageviewviewviewscrollview好了,挺简单的一个例子,如果你有更好的方法,不吝分享一下哦。完整代码可以在我的Github下载:https://github.com/zarknight/wxfallslayout原作者:一斤代码简书作者原文链接:http://www.jianshu.com/p/260f2623562d
更多有关转微信小程序中实现瀑布流布局和无限加载的小程序开发问题勤请扫码关注微信公开课小程序参与讨论!了解更多
方法1:微信扫描微信公开课小程序码即可订阅热议问题「转微信小程序中实现瀑布流布局和无限加载」
方法2:微信搜索微信公开课小程序名称进入,即可订阅热议问题「转微信小程序中实现瀑布流布局和无限加载」
方法3:微信网页访问即速商店,长按识别微信公开课小程序码即可订阅热议问题「转微信小程序中实现瀑布流布局和无限加载」
微信公开课小程序热议问题「转微信小程序中实现瀑布流布局和无限加载」由微信公开课原创摘录于微信小程序商店shop.jisuapp.cn,转载请注明出处。
微信公开课热议问题「转微信小程序中实现瀑布流布局和无限加载」由微信公开课开发者向微信用户提供,并对本服务内容、数据资料及其运营行为等真实性、合法性及有效性承担全部责任。