uniapp view怎么按长度排列一行最多四个元素,并且换行后,每一行之间都有间隔

文章目录

1.使用 Flex 布局并设置间距

  • 在uniapp中,可以利用flex布局来实现view按要求排列。以下是一个示例代码:
  • 模板部分(template)
html 复制代码
<template>
    <view class="parent-view">
        <view v-for="(item, index) in itemList" :key="index" class="child-view">{{item}}</view>
    </view>
</template>
  • 脚本部分(script)(这里简单定义一个示例数据数组):
javascript 复制代码
export default {
    data() {
        return {
            itemList: ['元素1', '元素2', '元素3', '元素4', '元素5', '元素6']
        };
    },
};
  • 样式部分(style):
css 复制代码
.parent-view {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    gap: 10px; /* 设置元素之间的间距,这里是10px,可以根据需求调整 */
}

.child-view {
    width: calc(25% - 10px); /* 考虑间距后每个元素的宽度,这里假设父容器宽度为100% */
    box-sizing: border-box;
    background-color: #f0f0f0; /* 可根据需求添加背景色等样式 */
    padding: 5px; /* 元素内部的间距,可调整 */
}

在上述代码中,parent - view类使用flex - wrap: wrap来实现换行,justify - content: flex - start使元素左对齐(如果需要其他对齐方式可以修改),gap: 10px设置了元素之间的间距。child - view类中计算了每个元素的宽度,考虑了间距因素,同时设置了一些基本的样式。

2.动态根据内容长度排列(可选补充)

  • 如果想要根据内容的实际长度(例如文本长度)动态调整排列,并且满足每行最多四个元素和换行有间隔的要求,可以使用uni.createSelectorQuery()来获取每个view元素的宽度,然后进行动态布局调整。
  • 以下是一个大致的示例思路(在mounted生命周期钩子中):
javascript 复制代码
mounted() {
    const that = this;
    const query = uni.createSelectorQuery().in(this);
    query.selectAll('.child - view').boundingClientRect(data => {
        let items = that.itemList;
        let line = [];
        let lines = [];
        let currentWidth = 0;
        let maxWidthPerLine = uni.getSystemInfoSync().windowWidth;
        let gap = 10; /* 元素之间的间距,与CSS中的设置一致 */
        for (let i = 0; i < data.length; i++) {
            let itemWidth = data[i].width;
            if (currentWidth+itemWidth <= maxWidthPerLine && line.length < 4) {
                line.push(items[i]);
                currentWidth += itemWidth + gap;
            } else {
                lines.push(line);
                line = [items[i]];
                currentWidth = itemWidth + gap;
            }
        }
        if (line.length > 0) {
            lines.push(line);
        }
        // 这里可以根据lines重新渲染视图,例如更新数据结构或者使用v - if/v - for组合来正确显示布局
    }).exec();
}

这种方式通过获取每个view元素的实际宽度,按照每行最多四个元素和间距要求进行分组,然后可以根据分组结果进一步调整布局。不过这种方法相对复杂一些,并且在内容动态变化时可能需要重新计算布局。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

关注我看更多有意思的文章哦!👉👉

相关推荐
Macbethad7 小时前
半导体EFEM设备TwinCAT程序设计方案
java·前端·网络
ggaofeng7 小时前
理解npm的原理
前端·npm·node.js
电商API_180079052477 小时前
1688商品详情采集API全解析:技术原理、实操指南与业务落地
大数据·前端·人工智能·网络爬虫
記億揺晃着的那天7 小时前
Chrome 自动填充“用户名”到普通输入框 - 解决方案
前端·chrome
LawrenceLan7 小时前
Flutter 零基础入门(二十一):Container、Padding、Margin 与装饰
开发语言·前端·flutter·dart
96778 小时前
初始web server的认识1---webserver的用途和工作流程
前端
叫我:松哥8 小时前
基于神经网络算法的多模态内容分析系统,采用Flask + Bootstrap + ECharts + LSTM-CNN + 注意力机制
前端·神经网络·算法·机器学习·flask·bootstrap·echarts
vx_bisheyuange8 小时前
基于SpringBoot的知识竞赛系统
大数据·前端·人工智能·spring boot·毕业设计
搂着猫睡的小鱼鱼8 小时前
签名逆向与浏览器自动化 / 动态渲染抓取京东评论信息
前端·javascript·自动化
wangbing11258 小时前
ES6 (ES2015)新增的集合对象Set
前端·javascript·es6