uni-app swiper + (waterfall/list) 在Android端横屏后转竖屏影响 (waterfall/list) 滚动位置

uni-app swiper + (waterfall/list) 在Android端横屏后转竖屏影响 (waterfall/list) 滚动位置

开发环境 版本号 项目创建方式
Windows 10 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:10

HBuilderX类型:正式

HBuilderX版本号:3.2.16

手机系统:Android

手机系统版本号:Android 9.0

手机厂商:小米

手机机型:9

页面类型:nvue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

### 示例代码:

#### index.nvue
```html
<template>  
    <view class="content">  
        <swiper style="height: 300px;">  
            <swiper-item>  
                <waterfall column-count="2" column-width="auto">  
                    <cell v-for="(num, index) in lists" :key="index">  
                        <navigator url="play" class="list" :class="index % 2 == 1 ? 'bgc1' : 'bgc2'">  
                            <text>{{ num }}</text>  
                        </navigator>  
                    </cell>  
                </waterfall>  
            </swiper-item>  
            <swiper-item>  
                <waterfall column-count="2" column-width="auto">  
                    <cell v-for="(num, index) in lists" :key="index">  
                        <navigator url="play" class="list" :class="index % 2 == 1 ? 'bgc1' : 'bgc2'">  
                            <text>{{ num }}</text>  
                        </navigator>  
                    </cell>  
                </waterfall>  
            </swiper-item>  
        </swiper>  
        <swiper style="height: 300px;">  
            <swiper-item>  
                <list>  
                    <cell v-for="(num, index) in lists" :key="index">  
                        <navigator url="play" class="list" :class="index % 2 == 1 ? 'bgc1' : 'bgc2'">  
                            <text>{{ num }}</text>  
                        </navigator>  
                    </cell>  
                </list>  
            </swiper-item>  
            <swiper-item>  
                <list>  
                    <cell v-for="(num, index) in lists" :key="index">  
                        <navigator url="play" class="list" :class="index % 2 == 1 ? 'bgc1' : 'bgc2'">  
                            <text>{{ num }}</text>  
                        </navigator>  
                    </cell>  
                </list>  
            </swiper-item>  
        </swiper>  
    </view>  
</template>  

<script>  
export default {  
    data() {  
        return {  
            lists: ['A', 'B', 'C', 'D', 'E', 'A1', 'B1', 'C1', 'D1', 'E1', 'A2', 'B2', 'C2', 'D2', 'E2', 'A3', 'B3', 'C3', 'D3', 'E3', 'A4', 'B4', 'C4', 'D4', 'E4']  
        };  
    },  
    onLoad() {},  
    methods: {}  
};  
</script>  

<style>  
.list {  
    height: 240px;  
    margin: 5px;  
}  
.bgc1 {  
    background-color: rgba(255, 255, 0, 0.5);  
}  
.bgc2 {  
    background-color: rgba(0, 255, 255, 0.5);  
}  
</style>

play.vue

<template>  
    <view>  
        <video src="https://www.w3school.com.cn/i/movie.mp4" controls></video>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            return {  

            }  
        },  
        methods: {  

        }  
    }  
</script>  

<style>  

</style>

操作步骤:

预期结果:

(waterfall/list) 滚动位置不变

实际结果:

(waterfall/list) 滚动位置回到顶部

bug描述:

页面一: (waterfall/list) 滚动到任意位置 转跳
页面二: 播放视频 并全屏 在 返回
页面一: (waterfall/list) 回到顶部
主要Android端,ios未复现
怀疑是修复此BUG 引出的新BUG


更多关于uni-app swiper + (waterfall/list) 在Android端横屏后转竖屏影响 (waterfall/list) 滚动位置的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

请提供完整示例项目

更多关于uni-app swiper + (waterfall/list) 在Android端横屏后转竖屏影响 (waterfall/list) 滚动位置的实战教程也可以访问 https://www.itying.com/category-93-b0.html


代码我不是发了么… 下边附件是代码及录屏视频.

回复 DCMarvel: 以后直接提供demo然我们闭嘴只复现问题就好了。相对来说响应速度和bug确认会更快

大致原因清楚了 因为横竖屏导致重新排版 我们看下问题如何解决

代码及演示

HX3.3.1 alpha已修复

正式版何时发布…

这是一个已知的nvue页面在Android平台上的特定问题,主要涉及横竖屏切换时页面布局的重绘机制。

问题核心: 在Android端,当页面包含<video>组件并触发全屏(横屏)播放后返回时,系统会重新触发页面的onShow生命周期。对于nvue页面中的<swiper>嵌套<waterfall><list>组件,此时会触发整个布局的重新计算,导致滚动位置重置。

直接原因:

  1. 全屏播放触发页面重绘<video>全屏本质上改变了设备方向,退出全屏时系统会重新布局页面。
  2. Swiper的重新初始化:作为父容器的<swiper>在页面重绘时会重新计算尺寸和位置,导致其内部的<waterfall>/<list>滚动位置丢失。
  3. Android与iOS差异:Android系统对横竖屏切换的处理机制与iOS不同,特别是在WebView/渲染引擎层面。

临时解决方案:

  1. 缓存滚动位置(推荐)
    // 在离开页面时保存滚动位置
    onHide() {
      // 获取waterfall/list的滚动位置
      const scrollTop = this.$refs.waterfallRef.getScrollOffset()
      uni.setStorageSync('scroll_position', scrollTop)
    },
    
    onShow() {
      // 页面显示时恢复位置
      const scrollTop = uni.getStorageSync('scroll_position')
      if (scrollTop) {
        this.$nextTick(() => {
          this.$refs.waterfallRef.scrollTo(scrollTop)
        })
      }
    }
回到顶部