Uniapp开发过程中解决的一个Flex布局问题

简介: Uniapp开发过程中解决的一个Flex布局问题

九宫格:

八宫格:

五宫格:

问题越变越大

  1. 首先是图片没有紧贴下一个
  2. 然后是每行的间距突然变大

问题 2 的解决思路是:

把这个九宫格的高度 height: auto; 进行自适应,就解决了问题 2;

问题 1 的解决思路是:

使用部分空的 view 元素去占位,但是占位的时候要分情况进行讨论;

源代码如下

<template>
  <view class="container">
    <view class="avatar">
      <image class="img" src="https://cdn.nlark.com/yuque/0/2023/jpeg/34278134/1699776030126-324ac0b3-648e-4a09-80aa-2b257dbbfa89.jpeg"></image>
      <view class="info">
        <view class="name">一小池勺</view>
        <view class="date">2023-11-25</view>
      </view>
    </view>
    <view class="con">
      “越来越发现自己适合成为一个辅助型的人,不知道这算不算是不是一条平庸的想法,我会慢慢朝着一个强有力的辅助型的人方面去发展的”
    </view>
    <view class="imgList">
      <view v-for="(item,index) in imgList" class="item" @click="previewImage(index)">
        <image :src="item" class="img" mode="aspectFill"></image>
      </view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 1 && imgList.length <= 2"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 3 && imgList.length <= 5"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
      <view v-if="imgList.length > 6 && imgList.length < 9"></view>
    </view>
    <view class="like">
      <view class="box">
        <image class="img" src="../../static/025_点赞-30.png" @click="dynamicLike"></image>
        <text class="num">
          3
        </text>
      </view>
      <image class="img" src="../../static/025_分享-17.png"></image>
    </view>
    <view class="comments">
      <view class="title">全部评论</view>
      <view
        class="comment-box"
        :class="{ expanded: isExpanded }"
        @click="toggleExpand"
      >
        <textarea class="inp" v-model="commentContent" :maxlength="300" placeholder="说点什么吧..."></textarea>
        <view class="box">
          <view class="num">{{ commentContent.length }} / 300</view>
          <view class="publish-btn" @click="publishComment">发表</view>
        </view>
      </view>
    </view>
    <view v-if="commentsList.length === 0 ? true : false" class="imgsbox">
      <!-- https://pic2.zhimg.com/v2-c24a51507ef271b12af06248bbfde3d5_r.jpg -->
      <image class="img" src="https://pic2.zhimg.com/v2-c24a51507ef271b12af06248bbfde3d5_r.jpg"></image>
      <view>还没有评论,快来占楼吧~</view>
    </view>
    <view v-else class="comments_item">
      <view class="title">最新评论</view>
      <view class="list">
        <view class="item"></view>
      </view>
    </view>
  </view>
</template>
<script>
  import { Dynamiclikes } from '../../services/AboutDynamics.js'
  export default {
    data() {
      return {
        commentContent: '',
        isExpanded: false,
        commentsList: [],
        imgList: [
          "https://pic3.zhimg.com/v2-e5c6964eb6126cc4623c7d23920766c2_r.jpg",
          "https://pic2.zhimg.com/v2-9450e2e4fd65e246fb4acc8fed1c6f01_r.jpg",
          "https://pic3.zhimg.com/v2-36cfbcc24668d6e98ccd614186fcdf5a_r.jpg",
          "https://pic3.zhimg.com/v2-ea3f4350334ce0e90dc82c9a9797dd86_r.jpg",
          "https://pic4.zhimg.com/v2-a6ae2af8cd7f488e8fd82ba2fd60dabf_r.jpg",
          "https://pic4.zhimg.com/v2-f1f0d78f47b4c8041ed2185e11f7cbbf_r.jpg",
          "https://pic2.zhimg.com/v2-1ff9560ff469dbe558f6d4bf0a740d21_r.jpg",
          "https://pic4.zhimg.com/v2-19de974caf855fb27bc0f962dbce9613_r.jpg",
          "https://pic2.zhimg.com/v2-1bf9e4d9a37bb5d1849c606b62ff52f5_r.jpg"
        ]
      }
    },
    methods: {
      // 点赞
      async dynamicLike() {
        // 假设跳转到该动态页面 并且拿到了该动态的标识信息
        try {
          let momentId = 0
          let sentenceId = 0
          let userId = 0
          await Dynamiclikes(momentId,sentenceId,userId)
        } catch (error) {
          console.log("错误信息:",error)
        }
      },
      previewImage(index) {
        uni.previewImage({
        urls: this.imgList,
        current: this.imgList[index] // 当前图片
        })
      },
        toggleExpand() {
          this.isExpanded = !this.isExpanded
        },
        publishComment() {
        this.commentContent = ''
        setTimeout(() => {
          uni.showToast({
            title: '发布成功',
            icon: 'success'
          })
          }, 1000)
      }
    }
  }
</script>
<style lang="scss" scoped>
.container {
  width: 100vw;
  height: auto;
  .avatar {
    display: flex;
    width: 90%;
    margin: 0 auto;
    .img {
      width: 100rpx;
      height: 100rpx;
      border-radius: 50%;
    }
    .info {
      margin-left: 20rpx;
      .name {
        font-size: 35rpx;
        color: skyblue;
        font-weight: 200;
        margin-bottom: 10rpx;
      }
      .date {
        font-size: 20rpx;
        color: #ccc;
        font-weight: 100;
      }
    }
  }
  .con {
    width: 90%;
    margin: 50rpx auto;
  }
  .imgList {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    width: 90vw;
    height: auto;
    // background-color: red; 背景板
    margin: 0 auto;
    .item {
      width: 32%;
      height: 200rpx;
      border-radius: 10rpx;
      overflow: hidden;
      margin-bottom: 15rpx;
      box-shadow: 0px 0px 7rpx 2rpx rgba(0, 0, 0, 0.1);
      .img {
        width: 100%;
        height: 100%;
      }
    }
  }
  .like {
    width: 90%;
    display: flex;
    justify-content: flex-start;
    margin: 30rpx auto;
    .box {
      display: flex;
      height: auto;
      align-items: center;
      .img {
        width: 40rpx;
        height: 40rpx;
      }
      .num {
        margin: 0 35rpx 0 10rpx;
        font-weight: 100;
      }
    }
    .img {
      width: 40rpx;
      height: 40rpx;
    }
  }
  .comments {
    width: 90%;
    margin: 0 auto;
    .title {
      font-weight: 800;
      font-size: 40rpx;
      margin-bottom: 40rpx;
    }
    .comment-box {
      width: 90%;
      margin: 0 auto;
      padding: 20rpx;
      border: 1px solid #ccc;
      border-radius: 10rpx;
      overflow: hidden;
      background-color: #F8F8F8;
      .inp {
          width: 100%;
        height: 80rpx;
          box-sizing: border-box;
          padding: 10rpx;
          margin-bottom: 10rpx;
          transition: all 0.3s; // 过渡一下
      }
      .box {
        display: flex;
        justify-content: space-between;
        width: 100%;
        color: #ccc;
        .num {
        }
        .publish-btn {
        }
      }
      &.expanded {
          .inp {
            height: 200px; // 评论框的高度变大
          }
      }
    }
  }
  .imgsbox {
    width: 90%;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    color: #ccc;
    font-size: 35rpx;
    font-weight: 100;
    margin-bottom: 100rpx;
  }
  .comments_item {
    .title {}
    .list {
      .item {}
    }
  }
}
</style>

结语

欢迎各位大佬指出我这个解决方法的不足之处,一起进步!

目录
相关文章
|
7月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
248 1
|
7月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
496 0
|
11月前
|
设计模式 容器
13.HarmonyOS流式卡片列表实现指南:Flex多行布局详解
在现代移动应用开发中,流式卡片列表是一种常见且实用的UI设计模式。它能够自适应屏幕宽度,在有限空间内高效展示多个内容项。本教程将详细讲解如何使用HarmonyOS的ArkUI框架中的Flex组件实现一个灵活的流式卡片列表,重点关注多行布局与对齐策略的应用。
382 2
|
11月前
|
开发者 UED 容器
07.精通HarmonyOS Flex对齐:从基础到高级布局技巧(上)
在HarmonyOS Next的ArkUI框架中,Flex容器提供了强大而灵活的对齐系统,使开发者能够精确控制子元素在容器中的排列方式。掌握这些对齐技术,是构建专业级用户界面的关键。
338 0
|
11月前
|
UED 容器
5.HarmonyOS Next开发宝典:掌握Flex布局的艺术
Flex布局(弹性布局)是HarmonyOS Next中最强大的布局方式之一,它提供了一种更加高效、灵活的方式来对容器中的子元素进行排列、对齐和分配空间。无论是简单的居中显示,还是复杂的自适应界面,Flex布局都能轻松应对。
321 0
|
API 开发者 Windows
uniapp 极速上手鸿蒙开发
uniapp 自版本 `4.28.2024092502` 起支持鸿蒙应用开发,现版本 `4.36.2024112817` 同时支持鸿蒙应用和元服务开发。本文介绍使用 HBuilderX 4.24+ 和 DevEco Studio 进行环境配置、项目创建及运行的详细步骤,涵盖从 AGC 平台新建项目、配置证书到最终运行项目的全流程,帮助开发者快速上手鸿蒙开发。注意:HBuilderX 4.31+ 构建的鸿蒙运行包不支持 x86_64 平台,需使用真机调试。
1295 85
uniapp 极速上手鸿蒙开发
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
727 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
12月前
|
JavaScript 小程序 API
UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路·优雅草卓伊凡
UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路·优雅草卓伊凡
799 12
UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路·优雅草卓伊凡
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
886 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
开发者 容器
鸿蒙开发:弹性布局Flex
在实际的开发中,需要掌握主轴与交叉轴的关系、换行规则及子元素属性,同时注意性能与兼容性问题,还有一点,Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。
354 10
鸿蒙开发:弹性布局Flex

热门文章

最新文章