微信小程序瀑布流实现

瀑布流

这就是大概的效果

一、WXML

这个是完整的两个板块,其实具体里面是什么不重要,重要的是两个最外层的view标签:

<view class="pubu_left" id="scroll2-left">
            <view class="photo_left_content" wx:for="{
   
   {random_left_content}}" bindtap="goDetail" data-id="{
   
   {item._id}}" style="color:{
   
   {bright2}}" wx:key="index" wx:index="index">
                <image lazy-load="true" class="photo_image" src="{
   
   {item.firstImage.url}}" mode="widthFix"></image>
                <view class="inform-container">
                    <view class="inform-title">{
   
   {item.title}}</view>
                    <view class="ava-name-like">
                        <view class="ava-name">
                            <image src="{
   
   {item.creator_inform.avatarUrl}}" class="inform-avatarUrl"></image>
                            <view class="name">{
   
   {item.creator_inform.nickName}}</view>
                        </view>
                        <view class="like" wx:if="{
   
   {item.userIsLike}}" catchtap="cancelLike" data-index="{
   
   {index}}" data-direction="left" data-id="{
   
   {item._id}}" data-publisheropenid="{
   
   {item.creator_inform.openId}}">
                            <image lazy-load="true" src="/image/smalllove-red.png"></image>
                            <text>{
   
   {item.like.length}}</text>
                        </view>
                        <view class="like" wx:else catchtap="addLike" data-index="{
   
   {index}}" data-direction="left" data-id="{
   
   {item._id}}" data-publisheropenid="{
   
   {item.creator_inform.openId}}">
                            <image lazy-load="true" src="/image/smalllove-white.png" ></image>
                            <text>{
   
   {item.like.length}}</text>
                        </view>
                    </view>
                </view>

            </view>
        </view>
        <view class="pubu_right" id="scroll2-right">
            <view class="photo_right_content" wx:for="{
   
   {random_right_content}}" bindtap="goDetail" data-id="{
   
   {item._id}}" style="color:{
   
   {bright2}}" wx:key="index" wx:index="index">
                <image lazy-load="true" class="photo_image" src="{
   
   {item.firstImage.url}}" mode="widthFix"></image>
                <view class="inform-container">
                    <view class="inform-title">{
   
   {item.title}}</view>
                    <view class="ava-name-like">
                        <view class="ava-name">
                            <image src="{
   
   {item.creator_inform.avatarUrl}}" class="inform-avatarUrl"></image>
                            <view class="name">{
   
   {item.creator_inform.nickName}}</view>
                        </view>
                        <view class="like" wx:if="{
   
   {item.userIsLike}}" catchtap="cancelLike" data-index="{
   
   {index}}" data-direction="right" data-id="{
   
   {item._id}}" data-publisheropenid="{
   
   {item.creator_inform.openId}}">
                            <image lazy-load="true" src="/image/smalllove-red.png"></image>
                            <text>{
   
   {item.like.length}}</text>
                        </view>
                        <view class="like" wx:else catchtap="addLike" data-index="{
   
   {index}}" data-direction="right" data-id="{
   
   {item._id}}" data-publisheropenid="{
   
   {item.creator_inform.openId}}">
                            <image lazy-load="true" src="/image/smalllove-white.png" ></image>
                            <text>{
   
   {item.like.length}}</text>
                        </view>
                    </view>
                </view>
            </view>
        </view>

缩略就是这样:

<view class="pubu_left" id="scroll-left">
    <view wx:for="{
   
   {arr1}}"><view/>
</view>
<view class="pubu_right" id="scroll-right">
    <view wx:for="{
   
   {arr2}}"><view/>
</view>

等于是有左列和右列,id分别为scroll-left和scroll-right

二、WXSS

原本我是外层套一个div然后用flex布局的,后面发现flex布局会让pubu_left和pubu_right两个板块高度一样,这样就获取不到实时的高度了,所以我就用浮动布局了。

.pubu_left {
    float: left;
}
.pubu_left {
    float: right;
}

三、JS

const query = wx.createSelectorQuery()
        let leftLength
        let rightLength
        for (let i = 0; i < arr.length; i++) {
            //获取pubu-left的高度
            leftLength = await new Promise((resolve,reject)=>{
                query.select("scroll-left").boundingClientRect(res=>{
                    resolve(res.bottom)
                }).exec()
            })
            //获取pubu-right的高度
            rightLength = await new Promise((resolve,reject)=>{
                query.select("scroll-right").boundingClientRect(res=>{
                    resolve(res.bottom)
                }).exec()
            })
            //哪个长就插入哪里
            if (leftLength <= rightLength) {
               //插入pubu-left数组
            } else if (leftLength > rightLength) {
               //插入pubu-right数组
            }
        }

这里用了promise解决boundingClientRect异步问题,不会可以去看看es6

猜你喜欢

转载自blog.csdn.net/weixin_55109830/article/details/129989023