微信公开课
如何看待微信公开课小程序热门讨论「小程序微信小程序中实现瀑布流布局和无限加载」
摘要:小程序微信小程序中实现瀑布流布局和无限加载
展开:瀑布流布局是一种比较流行的页面布局方式,最典型的就是Pinterest.com,每个卡片的高度不都一样,形成一种参差不齐的美感。在HTML5中,我们可以找到很多基于jQuery之类实现的瀑布流布局插件,轻松做出这样的布局形式。在微信小程序中,我们也可以做出这样的效果,不过由于小程序框架的一些特性,在实现思路上还是有一些差别的。今天我们就来看一下如何在小程序中去实现这种瀑布流布局:小程序瀑布流布局我们要实现的是一个固定2列的布局,然后将图片数据动态加载进这两列中(而加载进来的图片,会根据图片实际的尺寸,来决定到底是放在左列还是右列中)。/单个图片容器的样式/.img_item{width:48%;margin:1%;display:inlineblock;verticalalign:top;}我们知道,在HTML中,我们要动态加载图片的话,通常会使用newImage()创建一个图片对象,然后通过它来动态加载一个url指向的图片,并获取图片的实际尺寸等信息。而在小程序框架中,并没有提供相应的JS对象来处理图片加载。其实我们可以借助wxml中的组件来完成这样的功能,虽然有点绕,但还是能满足我们的功能要求的。viewstyledisplay:noneimagewx:for{{images}}wx:keyidid{{item.id}}src{{item.pic}}bindloadonImageLoadimageview我们可以在Page中通过数据绑定,来传递要加载的图片信息到wxml中,让组件去加载图片资源,然后当图片加载完成的时候,通过bindload指定的事件处理函数来做进一步处理。我们来看一下Page文件中定义的onImageLoad函数。在其中,我们可以从传入的事件对象e上,获取到组件的丰富信息,包括通过它加载进来的图片的实际大小。然后我们将图片按照页面上实际需要显示的尺寸,计算出同比例缩放后的尺寸。接着,我们可以根据左右两列目前累积的内容高度,来决定把当前加载进来的图片放到哪一边。letcol1H0;letcol2H0;Page({data:{scrollH:0,imgWidth:0,loadingCount:0,images:[],col1:[],col2:[]},onLoad:function(){wx.getSystemInfo({success:(res){letwwres.windowWidth;letwhres.windowHeight;letimgWidthww0.48;letscrollHwh;this.setData({scrollH:scrollH,imgWidth:imgWidth});//加载首组图片this.loadImages();}})},onImageLoad:function(e){letimageIde.currentTarget.id;letoImgWe.detail.width;//图片原始宽度letoImgHe.detail.height;//图片原始高度letimgWidththis.data.imgWidth;//图片设置的宽度letscaleimgWidth/oImgW;//比例计算letimgHeightoImgHscale;//自适应高度letimagesthis.data.images;letimageObjnull;for(leti0;iimages.length;i++){letimgimages[i];if(img.idimageId){imageObjimg;break;}}imageObj.heightimgHeight;letloadingCountthis.data.loadingCount1;letcol1this.data.col1;letcol2this.data.col2;//判断当前图片添加到左列还是右列if(col1Hcol2H){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}];letbaseIdimg+(+newDate());for(leti0;iimages.length;i++){images[i].idbaseId++i;}this.setData({loadingCount:images.length,images:images});}})这里是显示在两列图片的wxml代码,我们可以看到在组件上,我们通过使用bindscrolltolower设置了事件监听函数,当滚动到底部的时候,会触发loadImages去再加载下一组的图片数据,这样就形成了无限的加载:scrollviewscrollytruestyleheight:{{scrollH}}pxbindscrolltolowerloadImagesviewstylewidth:100%viewclassimg_itemviewwx:for{{col1}}wx:keyidimagesrc{{item.pic}}stylewidth:100%;height:{{item.height}}pximageviewviewviewclassimg_itemviewwx:for{{col2}}wx:keyidimagesrc{{item.pic}}stylewidth:100%;height:{{item.height}}pximageviewviewviewscrollview好了,挺简单的一个例子,如果你有更好的方法,不吝分享一下哦。完整代码可以在我的Github下载:https://github.com/zarknight/wxfallslayout原作者:一斤代码(简书作者)原文链接:http://www.jianshu.com/p/260f2623562d了解更多
方法1:微信扫描微信公开课小程序码即可订阅热门讨论「小程序微信小程序中实现瀑布流布局和无限加载」
方法2:微信搜索微信公开课小程序名称进入,即可订阅热门讨论「小程序微信小程序中实现瀑布流布局和无限加载」
方法3:微信网页访问即速商店,长按识别微信公开课小程序码即可订阅热门讨论「小程序微信小程序中实现瀑布流布局和无限加载」
微信公开课小程序热门讨论「小程序微信小程序中实现瀑布流布局和无限加载」由微信公开课原创摘录于微信小程序商店shop.jisuapp.cn,转载请注明出处。
微信公开课热门讨论「小程序微信小程序中实现瀑布流布局和无限加载」由微信公开课开发者向微信用户提供,并对本服务内容、数据资料及其运营行为等真实性、合法性及有效性承担全部责任。