uni-app 左右2个容器错位问题:一边view一边scroller+list,两边设置同样高度且每个子元素高度相同,列表过长时左右子元素错位,经排查右边子元素的margin异常

发布于 1周前 作者 eggper 来自 Uni-App

uni-app 左右2个容器错位问题:一边view一边scroller+list,两边设置同样高度且每个子元素高度相同,列表过长时左右子元素错位,经排查右边子元素的margin异常

10 回复

问题已确认 建议左边单挑列表也用list


这个我试过,用list确实能解决问题,但是我最原始的需求是左右一起滚动,之前用的bindingx绑定左右一起滑动,bingdingx绑定list不生效所以换成了scroller+view,但是现在错位了,现改了方案,使用demo里面的那种多层scroller嵌套,但是在最外层scroller上面加上loadmore事件,ios上不会触发loadmore,安卓正常,定位到是子集横向scroller影响的,深层次的原因不清楚,现在就造成了这种使用list能修复的方案不能左滑动绑定,不改的方案又是错位的,希望老师能给个建议

回复 7***@qq.com: 这个问题我们已经知晓 在优化中 主要原因就是浮点精度导致对不齐

回复 DCloud_Android_ST: 老师,demo中这种布局,ios中外层scroller无法触发loadmore事件,我需要重新提供一个demo吗

回复 7***@qq.com: 这个你可以单独发帖 说明问题

还有老师,这个问题有没有大概的修复时间,比较着急

回复 DCloud_Android_ST: 好的

回复 7***@qq.com: 这个精度问题比较难解决。改动牵扯的比较多 很容易修改出其他问题 所以具体时间不定

回复 DCloud_Android_ST: 好的,烦请老师尽快,谢谢

uni-app 中,如果你遇到左右两个容器错位的问题,尤其是当一边是 view,另一边是 scroller + list 时,可能是由于以下几个原因导致的:

1. CSS 样式问题

  • 检查 marginpadding:确保左右两边的 marginpadding 设置一致。如果右边的子元素 margin 异常,可能是由于某些样式覆盖或继承导致的。
  • 使用 box-sizing:确保两边的 box-sizing 设置为 border-box,这样可以避免由于 paddingborder 导致的尺寸差异。
.container {
    box-sizing: border-box;
}

2. 布局问题

  • 使用 flex 布局:确保左右两边的容器使用 flex 布局,并且设置相同的 flex 属性,这样可以保证它们的高度一致。
.container {
    display: flex;
}
.left, .right {
    flex: 1;
}

3. scrollerlist 的高度问题

  • 动态设置高度:如果 scrollerlist 的高度是动态的,确保在数据加载完成后重新计算并设置高度。
  • 使用 calc 计算高度:如果 scrollerlist 的高度需要根据父容器的高度动态调整,可以使用 calc 函数。
.scroller {
    height: calc(100% - 20px); /* 根据实际情况调整 */
}

4. scroller 的滚动问题

  • 禁用 scroller 的滚动:如果不需要 scroller 滚动,可以禁用滚动,或者使用 view 代替 scroller
.scroller {
    overflow: hidden;
}

5. 子元素高度问题

  • 确保子元素高度一致:如果左右两边的子元素高度不一致,可能会导致错位。可以通过设置固定的高度或者使用 flex 布局来确保高度一致。
.item {
    height: 50px; /* 根据实际情况调整 */
}

6. 调试工具

  • 使用开发者工具:使用浏览器的开发者工具(如 Chrome DevTools)检查元素的 marginpaddingheight 等属性,找出具体的差异。

示例代码

<template>
    <view class="container">
        <view class="left">
            <view class="item" v-for="(item, index) in leftList" :key="index">{{ item }}</view>
        </view>
        <scroll-view class="right" scroll-y>
            <view class="item" v-for="(item, index) in rightList" :key="index">{{ item }}</view>
        </scroll-view>
    </view>
</template>

<script>
export default {
    data() {
        return {
            leftList: ['Item 1', 'Item 2', 'Item 3'],
            rightList: ['Item A', 'Item B', 'Item C', 'Item D', 'Item E']
        };
    }
};
</script>

<style>
.container {
    display: flex;
    height: 100%;
}
.left, .right {
    flex: 1;
    box-sizing: border-box;
}
.item {
    height: 50px;
    line-height: 50px;
    border-bottom: 1px solid #ccc;
}
.right {
    overflow-y: scroll;
}
</style>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!