uni-app 左右2个容器错位问题:一边view一边scroller+list,两边设置同样高度且每个子元素高度相同,列表过长时左右子元素错位,经排查右边子元素的margin异常
uni-app 左右2个容器错位问题:一边view一边scroller+list,两边设置同样高度且每个子元素高度相同,列表过长时左右子元素错位,经排查右边子元素的margin异常
问题已确认 建议左边单挑列表也用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 样式问题
- 检查
margin
和padding
:确保左右两边的margin
和padding
设置一致。如果右边的子元素margin
异常,可能是由于某些样式覆盖或继承导致的。 - 使用
box-sizing
:确保两边的box-sizing
设置为border-box
,这样可以避免由于padding
和border
导致的尺寸差异。
.container {
box-sizing: border-box;
}
2. 布局问题
- 使用
flex
布局:确保左右两边的容器使用flex
布局,并且设置相同的flex
属性,这样可以保证它们的高度一致。
.container {
display: flex;
}
.left, .right {
flex: 1;
}
3. scroller
和 list
的高度问题
- 动态设置高度:如果
scroller
和list
的高度是动态的,确保在数据加载完成后重新计算并设置高度。 - 使用
calc
计算高度:如果scroller
和list
的高度需要根据父容器的高度动态调整,可以使用calc
函数。
.scroller {
height: calc(100% - 20px); /* 根据实际情况调整 */
}
4. scroller
的滚动问题
- 禁用
scroller
的滚动:如果不需要scroller
滚动,可以禁用滚动,或者使用view
代替scroller
。
.scroller {
overflow: hidden;
}
5. 子元素高度问题
- 确保子元素高度一致:如果左右两边的子元素高度不一致,可能会导致错位。可以通过设置固定的高度或者使用
flex
布局来确保高度一致。
.item {
height: 50px; /* 根据实际情况调整 */
}
6. 调试工具
- 使用开发者工具:使用浏览器的开发者工具(如 Chrome DevTools)检查元素的
margin
、padding
、height
等属性,找出具体的差异。
示例代码
<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>