微信小程序实现容器图片流式布局功能,配合小程序原生框架使用。

小程序实现容器图片流式布局功能,因为目前论坛上也有很多博主出过类似的文章,这里我就以一个小白角度去讲一下如何实现的吧。给作者一点点鼓励,先点个赞赞吧👍,蟹蟹!!

目标

实现下方效果图

技术栈

微信小程序原生框架,wxml+wxss+js,因为后端是云开发的,所以网络请求是官方的api,比如wx.cloud.database().collection("community") .get()

这样做的好处

能根据图片的高度自适应容器高度,整体美观,易读

实现逻辑

1.页面布局wxml,一个大容器(宽度撑满屏幕高度)中,包含两列容器,左边一列,右边一列。如图所示,有图清晰一点。

2.首先获取一个数组dataList,用于渲染到页面上的数据,这里就用闲置帖子为例。

3.准备两个变量,一个是整型leftheight,作为左边容器实时高度,另一个是整型rightheight,作为右边容器实时高度。

4.获取数组后将回调值res中的data赋值给list局部变量,并循环这个list数组,同时判断左边的容器高度和右边的容器哪个更低,将子元素(子元素为对象)设置一个index属性标记属于左边容器,还是右边容器,这里的例子是index == 0 时候是左边容器,index==1时候是右边容器。每一次循环渲染子元素的时候判断左右容器高低,左边容器低则index设置为0标记到左边容器中去,否则亦反。

注意:picheight为数据库中数据已有的字段属性,为图片的高度

var that = this
var list = res.data //res.data为获取数据库中返回的数据数组 ,list为临时存储变量
var dataList = that.data.dataList //dataList为最终渲染到页面的数组数据
var leftheight = that.data.leftheight // 获取全局变量保存的左边容器高度
var rightheight = that.data.rightheight // 获取全局变量保存的右边容器高度

for (let i = 0; i < list.length; i++) {

//这里的picheight为存储到数据库时候的高度
  if (leftheight <= rightheight) {
      leftheight = leftheight + list[i].picheight + 120
      list[i].index = 0
  } else {
      rightheight = rightheight + list[i].picheight + 120
      list[i].index = 1
  }
          
   dataList.push(list[i])
}
    that.setData({
      dataList: dataList,
      leftheight: leftheight,
      rightheight: rightheight
  })

5.在wxml通过for循环渲染出来

部分关键代码:

 <view class="shop-big-box flex-row-center-x">
    <!-- 左列表 -->
    <view class='shop'>
      <block wx:for="{{dataList}}" wx:key="_id" wx:if="{{item.index == 0}}">
        <my-datalist item="{{item}}" index="{{index}}" data-src="{{item.pictures[0]}}" data-index="{{index}}" bind:getimage="getimage" />
      </block>
    </view>

    <!-- 右列表 -->
    <view class='shop'>
      <block wx:for="{{dataList}}" wx:key="_id" wx:if="{{item.index == 1}}">
        <my-datalist item="{{item}}" index="{{index}}" data-src="{{item.pictures[0]}}" data-index="{{index}}" bind:getimage="getimage" />
      </block>
    </view>
  </view>

my-datalist组件

<view class="shop-detail" bindtap="godetail" data-id="{{item._id}}">
  <view class='imagecont' style="height:{{item.picheight}}rpx;">
    <block wx:if="{{item.pictures.length > 0}}">
      <image src="{{item.pictures[0]}}" data-index="{{index}}" class="prodimg" style="height:{{item.picheight}}rpx;z-index: 3;"  mode="aspectFill" />
    </block>
    </view>
  </view>
  <view style="width: 100%;display: flex;flex-wrap: wrap;height: 120rpx;">
    <view class="shop-detail-text">{{item.text}}</view>
    <view class="shop-detail-user flex-row-center">
      <image src="{{item.user.imagavatares}}" style="border-radius: 50%;width: 30rpx;height: 30rpx;margin: 0 10rpx;background-color: rgb(247, 247, 247);" />
      <text>{{item.user.username}}</text>
    </view>
  </view>
</view>

完整代码

index.wxml

javascript 复制代码
  <view class="shop-big-box flex-row-center-x">
    <!-- 左列表 -->
    <view class='shop'>
      <block wx:for="{{dataList}}" wx:key="_id" wx:if="{{item.index == 0}}">
        <my-datalist item="{{item}}" index="{{index}}" data-src="{{item.pictures[0]}}" data-index="{{index}}" bind:getimage="getimage" />
      </block>
    </view>

    <!-- 右列表 -->
    <view class='shop'>
      <block wx:for="{{dataList}}" wx:key="_id" wx:if="{{item.index == 1}}">
        <my-datalist item="{{item}}" index="{{index}}" data-src="{{item.pictures[0]}}" data-index="{{index}}" bind:getimage="getimage" />
      </block>
    </view>
  </view>

index.wxss

javascript 复制代码
.shop-big-box{
  width: 100%;
}

.shop{
  width: 340rpx;
  margin: 0 10rpx;
}
/* 盒子水平摆放并水平居中 */
.flex-row-center-x{
  display: flex;
  flex-direction: row;
  justify-content: center;
}

index.js

javascript 复制代码
// pages/index/index.js
const app = getApp()
const db = wx.cloud.database()
const _ = db.command
Page({

  /**
   * 页面的初始数据
   */
  data: {
    dataList: [],
    leftheight: 0,
    rightheight: 0,
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad() {

    this.getList()


  },


  getList() {
    var that = this
    wx.cloud.database().collection("community")
      .orderBy('top', 'desc')
      .orderBy('date', 'desc')
      .get({
        success(res) {
          console.log("出来的数据", res.data);
          if (res.data.length > 0) {
            var list = res.data
            var dataList = that.data.dataList
            var leftheight = that.data.leftheight
            var rightheight = that.data.rightheight

            for (let i = 0; i < list.length; i++) {
              if (leftheight <= rightheight) {
                leftheight = leftheight + list[i].picheight + 120
                list[i].index = 0
              } else {
                rightheight = rightheight + list[i].picheight + 120
                list[i].index = 1
              }
              dataList.push(list[i])
            }
            that.setData({
              dataList: dataList,
              leftheight: leftheight,
              rightheight: rightheight,
            })

          } 
        },
        fail(err) {
          wx.showToast({
            title: '网络出错啦!' + err,
            icon: 'none'
          })


        }
      })





  },


})

index.json

javascript 复制代码
{
  "usingComponents": {
    "my-datalist": "../../components/datalist/datalist"
  },
  "navigationStyle": "custom",
  "enablePullDownRefresh": true
}

components/datalist.js

javascript 复制代码
const app = getApp()
const db = wx.cloud.database()
const _ =db.command
Component({
  properties: {
    item: JSON,
    index:String,
  },
  methods: {
     
      godetail(e) {
        wx.navigateTo({
          url: '/pages/Filecommunity/detail/detail?id=' + e.currentTarget.dataset.id,
        })
      },
      getimage() {
        this.triggerEvent('getimage');
      },
    
  },
});

components/datalist.json

javascript 复制代码
{
  "component": true,
  "usingComponents": {}
}

components/datalist.wxml

html 复制代码
<view class="shop-detail" bindtap="godetail" data-id="{{item._id}}">
  <view class='imagecont' style="height:{{item.picheight}}rpx;">
    <block wx:if="{{item.pictures.length > 0}}">
      <image src="{{item.pictures[0]}}" data-index="{{index}}" class="prodimg" style="height:{{item.picheight}}rpx;z-index: 3;" mode="aspectFill" />
    </block>

  </view>
  <view style="width: 100%;display: flex;flex-wrap: wrap;height: 120rpx;">
    <view class="shop-detail-text">{{item.text}}</view>

    <view class="shop-detail-user flex-row-center">
      <image src="{{item.user.imagavatares}}" style="border-radius: 50%;width: 30rpx;height: 30rpx;margin: 0 10rpx;background-color: rgb(247, 247, 247);" />
      <text>{{item.user.username}}</text>
    </view>
  </view>
</view>

components/datalist.wxss

css 复制代码
.shop-detail{
  border-radius: 10rpx;
  width: 340rpx;
  background: #fff;
  display: inline-block;
   font-size: 28rpx;
  margin: 10rpx 0;
}


.shop-detail-text{
  font-size: 28rpx;
  width: 100%;
  margin: 10rpx 0;
  overflow:hidden;
  white-space:nowrap;
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
}
.shop-detail-user{
  display: flex;
  flex-direction: row;
  align-items: center;
  overflow:hidden;
  white-space:nowrap;
  font-size: 24rpx;
  height: 26rpx;
  margin: 10rpx 0 10rpx 0;
  text-overflow: ellipsis;
  width: 100%;
}


.imagecont{
  width: 100%;
  font-size: 0;
  position: relative;
}
.prodimg {
  width: 100% !important;
  vertical-align: middle !important;
  border-radius: 10rpx !important;
  position: absolute !important;
  font-size:0 !important;

}
/* 盒子水平摆放并垂直居中 */
.flex-row-center{
  display: flex;
  flex-direction: row;
  align-items: center;
}

这篇对您有所帮助的话,来个点赞或关注吧❀❀~,另外要预览效果的可以搜索邑学宝微信小程序呦~

相关推荐
建投数据2 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
燃先生._.4 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖5 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
郭wes代码5 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
black^sugar6 小时前
纯前端实现更新检测
开发语言·前端·javascript
2401_857600957 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js
2401_857600957 小时前
数字时代的医疗挂号变革:SSM+Vue 系统设计与实现之道
前端·javascript·vue.js
GDAL7 小时前
vue入门教程:组件透传 Attributes
前端·javascript·vue.js
小白学大数据7 小时前
如何使用Selenium处理JavaScript动态加载的内容?
大数据·javascript·爬虫·selenium·测试工具