美文网首页
滑动绑定事件(基于vue)

滑动绑定事件(基于vue)

作者: edisonTechBlog | 来源:发表于2020-02-28 12:10 被阅读0次

    需求:滑动右侧字母列表,手指停在哪屏幕就显示哪儿一个字母开头的城市列表


    思路

    第一步

    首先,给右侧字母表得先绑定三个事件。分别是touchstart、touchmove、touchend。

    第二步

    现在得需要知道手指滑倒的地方对对应的字母是什么。这就需要通过一些计算去得出。有一个解决办法是先计算出A与顶部的距离H,然后在算出每一个字母所占的高度h,然后计算手指与顶部的距离X,然后(X-H) / h。 如果计算出1.5,就代表是第二个字母,2.1就是第三个。

    当然以上只是一种想法,具体实现看代码

    第三步

    具体算法有了,那么怎么实现呢?现在有几个问题需要解决。

    1 计算出值后,怎么通过这个值去找到对应的字母?类似与数组,求出了下标,怎么得出这个具体的值

    在计算属性中通过for in 循环。 同时需要注意,之前在v-for中因为cities是对象,而现在得出了letters,所以可以改变循环的方法

            letters(){
                const letters=[]
                // for...in 语句用于对数组或者对象的属性进行循环操作。
                for(let item in this.cities){
                    letters.push(item)
                }
                return letters
                // ["A","B",.......]
            }
    

    2 现在就可以开始写计算位置的代码了

                //计算A与顶部的距离
                const startY=this.$refs["A"][0].offsetTop
                //计算当前滑动手指所在的地方与顶部的距离
                //79是header和search的总高度
                //所以touchY就是距离顶部的高度
                //这里的e是touchmove被触发时传递的参数
                //e.touches[0].clientX为横坐标
                const touchY=e.touches[0].clientY-79
                // index为字母下标
                //14为每一个字母所占的高度
                //Math.floor为取整
                //这里要格外注意 14为字母高度,但是还得算上margin、padding等  所以修改为19
                const index=Math.floor((touchY-startY)/19)
                //最后触发change事件
                this.$emit("change",this.letters[index])
    

    相关文章

      网友评论

          本文标题:滑动绑定事件(基于vue)

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