美文网首页
「开发者笔记」关于better-scroll关闭useTrans

「开发者笔记」关于better-scroll关闭useTrans

作者: 阿啦琳 | 来源:发表于2020-07-07 15:55 被阅读0次

    先说下使用场景,使用了黄老师的better-scroll来做picker组件,但是参数调整好后出现了一个观感问题

    SDGIF_Rusult_1.gif

    然后寻找问题时发现,如果关闭插件开启的useTransition,使用插件默认关闭的requestAnimationFrame函数来做动画的话,就不会出现这种弹跳的问题,但是此时新的问题又出现了。

    首先是第一个问题,

    按理说点击组件的某一处会使其直接滚动到焦点处,但是关闭了useTransition后,并不会这样,基本只会让第一项滚动到焦点处。如图 SDGIF_Rusult_2.gif
    这个问题的解决方法

    给你要滚动的那些元素css加上这个属性,这样就可以正确点击焦点某项。

    li {
         pointer-events: auto!important; 
       }
    

    接着是第二个问题

    wheel自带的getSelectedIndex()并没有正确获取到index,而是要么返回一个0,或者返回NaN类型回来。选中的index是整个组件的核心,如果没这个参数后面的代码可以不用写了。

    先放一段正在处理多列滚动的配置。框架是是React。自带的index没法用了,那么就只有靠自己计算一下了。

    scrollEnd在滚动开始时和结束时都会触发,不知道为什么(我也有些迷惑)。滚动开始时可以查看当前的wheel,y属性是离顶部的距离,滚动开始时返回的值为NaN,应该排除掉。结束时则是正常带有y的参数,但是这个参数也不是正确的,它是你松开鼠标时离顶部的值,所以只能做一个每行高度的数组,用这个参数来做比对当前焦点聚焦的位置,方法如下代码。

        Array.from( wrapper.current.children).forEach((item, index) => {
            const wheel = new BScroll(item, {
                wheel: {
                    selectedIndex: 0,
                    wheelWrapperClass: 'wheel-scroll',
                    wheelItemClass: 'wheel-item',
                    wheelDisabledItemClass: 'wheel-disabled-item',
                    rotate: 0,
                },       
                useTransition: false,   
                deceleration: 0.0042,
                swipeTime: 1100,
            })  
            
            wheel.on('scrollEnd', () => {
                //滚动完成之后获取当前选取的索引值
                if(!Number.isNaN(wheel.y)) {
                    const currentIndex = getCurrentIndex(wheel)
                    console.log(index, currentIndex)
                }
            })  
        })
        const getCurrentIndex = wheel => {
            let heightArr = Array.from(wheel.items).map((item, index) => index * wheel.itemHeight)
            let stopY =  Math.floor(Math.abs(wheel.y))
            if(heightArr.findIndex(item => item === stopY) === -1) {
                heightArr.push(stopY)
                heightArr.sort((a, b) => a - b)
                let currentIndex = heightArr.findIndex(item => item === stopY)
                if(currentIndex === 0) {
                   return 1
                }else if(currentIndex === heightArr.length - 1) {
                   return heightArr.length - 2
                }else {
                    if(Math.abs(heightArr[currentIndex] - heightArr[currentIndex - 1]) < Math.abs(heightArr[currentIndex + 1] - heightArr[currentIndex])) {
                       return currentIndex - 1
                    }else {
                       return currentIndex
                    }
                }
            }else {
                return heightArr.findIndex(item => item === stopY)
            }
        }
    

    相关文章

      网友评论

          本文标题:「开发者笔记」关于better-scroll关闭useTrans

          本文链接:https://www.haomeiwen.com/subject/gowaqktx.html