vux的scroller组件ios13异常问题

scroller组件在ios13上滚动到底部时onScroll方法的pos.top异常很厉害,从正常的比如500,突变为-1,基本上无法使用了,滚动组件在ios13上问题很大,求解决办法
<template>
<div class="car-custom" >

  <scroller style="overflow: visible!important;" lock-x scrollbar-y use-pullup height="100%" :disablePullup="true" 
    @on-scroll="onScroll" v-model="status" ref="scroller">
    <div class="scroller-container" >
      <div class="li"  v-for="(item,index) in list">{{item.a}}</div>
    </div>
  </scroller>

</div>
</template>

<script>
import {Scroller} from 'vux'
export default {
components: {

Scroller,

},
name: 'carCustom',
props:["initTabStyle"],
data () {

return {
  status: {
    pullupStatus: 'default',
    pulldownStatus: 'default'
  },//控件配置
 list:[{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 },{
   a:1
 }]
}

},
computed: {
},

activated(){

let self=this;

},

watch: {

},
beforeDestroy:function(){

},
beforeRouteLeave (to, from, next) {

next();

},
mounted: function() {

let self=this;

},
methods: {

// 滚动方法
onScroll(pos){
    let self = this;
    console.log(pos.top)
},

}
}
</script>
<style lang="scss" scoped>
.car-custom{
.li{

height: 100px;
background: red;
margin: 6px 0;

}

}
</style>
简单的demo如上

阅读 3.3k
2 个回答

下面是我的解决方案

var transY = window.getComputedStyle(this.container)[transform].match(/[\d|-].*\d/)[0].split(",");

在 node_modules_vux-xscroll@3.1.12@vux-xscrollbuildcmdsimulate-scroll.js下的getScrollTop方法中添加如上代码,替换原有代码
理论上问题就能解决????


时 间 回 溯 到我发现问题的时候
安卓模拟器正常情况

ios13异常
同问,热心网友deepdarkLove的解决方案https://blog.csdn.net/sllailc...
照搬修改之后貌似不会回弹了,但是还是会触发很多次run....


2019-10-16 11:07:57
刚研究了一顿,趁热发
正如链接文中所说,问题理论上是发生在‘getScrollTop’这个方法中

var transY = window.getComputedStyle(this.container)[transform].match(/[-\d\.*\d*]+/g);

最后正则.match(/[-d.d]+/g);(老实说我根本看不懂是什么意思、、、求dalao解释、、、)
在匹配ios端的时候无法处理"-3.1415926e-16"这类科学计数法(匹配时遇到e会强行把科学计数法分段??)
导致了transY这个变量接收的.match()返回的数组由理论上矩阵中的6个变为了8个。
而后文中

return transY ? Math.round(transY[5]) === 0 ? 0 : -Math.round(transY[5]) : 0;

transY[5]只是机械地选取数组中最后一个,当原数组内容从6变为8之后是会出问题的(上述导致回弹的top:-1正巧是错误地匹配到了matrix(1, 0, 0, 1, 0, -25)中第二个‘1’)


下面是我的解决方案

var transY = window.getComputedStyle(this.container)[transform].match(/[\d|-].*\d/)[0].split(",");

在 node_modules_vux-xscroll@3.1.12@vux-xscrollbuildcmdsimulate-scroll.js下的getScrollTop方法中添加如上代码,替换原有代码
理论上问题就能解决????

.match(/[\d|-].*\d/)[0].split(",");

我的正则中首先match(/[d|-].*d/)匹配的是matrix(1, 0, 0, 1, 0, -25)中,从左边第一个数字(或者负号)到右边最后一个数字(‘1, 0, 0, 1, 0, -25’)
.split(",")然后以‘,’号进行分段,规避科学计数法-3.1415926e-16转成字符串后无法用d匹配的问题、、、
如有更优雅的方案请通知!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题