让我们更好的滑动起来

1,138 阅读5分钟

'overflow: scroll'在iOS上滑动卡顿初体验

http://geek100.com/demo/os.html   (没事点一下)
在iOS系统的手机上浏览时,则会出现明显的卡顿现象;但是在android系统的手机上则不会出现该问题

解决方案: 百度到: -webkit-overflow-scrolling: touch; 一行css解决。

这行代码说是启用了硬件加速特性,所以滑动很流畅。
在WebKit 108400版本左右才支持,所以iOS Safari应该是需要5.0。Android则是在4.0以上支持。

实现 无限加载/刷新 + 滑动特效; 方案:

   1. -webkit-overflow-scrolling: touch + mint-ui(loadMore);
   2.better-scroll
   3: iscroll
    <mt-loadmore :top-method="loadTop" :bottom-method="loadBottom" :bottom-all-loaded="allLoaded" :auto-fill='false' ref="loadmore" :height ='wrap的高度'>
          <ul>
            <li v-for="item in list">{{ item }}</li>
          </ul>
    </mt-loadmore>
    <!--
        loadTop: 下拉满足伐值 触发事件
        loadBottom: 上拉满足伐值 触发事件
        bottom-all-loaded: 上拉满足伐值 是否触发事件
        auto-fill: 初始化时是否触发上拉事件
        注意:每次事件触发进行同步/异步操作完 要执行 this.$refs.loadmore.onBottomLoaded();或者
        this.$refs.loadmore.onTopLoaded(); (组件自己会进行一些重新定位的操作)
    -->

注意: 如果上拉加载 content层(ul元素)dom高度没有变化,即不能触发上拉加载事件!

2.better-scroll 插件

其实文档都有介绍的(https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#%E8%B5%B7%E6%AD%A5)
讲一下常用的api, 和里面的一些坑!

1.原理

    <div class="wrapper" :height='设置的高度'>
      <ul class="content">
        <li v-for='item in dataList'>...</li>
      </ul>
      <!-- 这里可以放一些其它的 DOM,但不会影响滚动 -->
    </div>
    <!--
        (wrapper层的高度/宽度) > (content层的高度/宽度)? 才能触发滑动 : 无效果;
    -->

一些常用配置 / 钩子和Events方法

let scroll = new BScroll('.wrapper',{
    swipeBounceTime: 1200,// swipe 回弹 时间
    deceleration: 0.001,// 滚动动量减速越大越快,建议不大于0.01
    momentumLimitTime: 300,// 符合惯性拖动的最大时间
    momentumLimitDistance: 15,// 符合惯性拖动的最小拖动距离
    resizePolling:60,//重新调整窗口大小时,重新计算better-scroll的时间间隔
    preventDefault: true,// 是否阻止默认事件
   
    <!--+++++++++++++++++++++common ++++++++++++++++++-->
    HWCompositing: true ,//是否启用硬件加速
    useTransition: true,// 是否使用CSS3的Transition属性
    useTransform: true ,//是否使用CSS3的Transform属性
    probeType: 1 ,//滚动的时候会派发scroll事件,会截流。2滚动的时候实时派发scroll事件,不会截流。 3除了实时派发scroll事件,在swipe的情况下仍然能实时派发scroll事件
    })
    //事件api
    beforeScrollStart - 滚动开始之前触发
    scrollStart - 滚动开始时触发
    scroll - 滚动时触发
    scrollCancel - 取消滚动时触发
    scrollEnd - 滚动结束时触发
    touchend - 手指移开屏幕时触发
    flick - 触发了 fastclick 时的回调函数
    refresh - 当 better-scroll 刷新时触发
    destroy - 销毁 better-scroll 实例时触发
{
 <!--scroll组件 -->
    scrollY: true ,//滚动方向为 Y 轴
    scrollX: true ,//滚动方向为 X 轴
    startX: 0 ,// 开始的X轴位置
    startY: 0,//开始的Y轴位置
    click: true ,//是否派发click事件,通常判断浏览器派发的click还是betterscroll派发的click,可以用event._constructed,若是BS派发的则为true
    momentum: true,// 当快速滑动时是否开启滑动惯性
    bounce: true,// 是否启用回弹动画效果
}
 //事件api
    scrollTo(x, y, time, easing) -滚动到某个位置,x,y 代表坐标,time 表示动画时间,easing 表示缓动函数
         example: scroll.scrollTo(0, 500);
    scrollToElement(el, time, offsetX, offsetY, easing) - 滚动到某个元素,el(必填)表示 dom 元素,time 表示动画时间,offsetX 和 offsetY 表示坐标偏移量,easing 表示缓动函数
    refresh() - 强制scroll重新计算,当better-scroll中的元素发生变化的时候调用此方法

     <!--slide组件-->
    {
        snap: {
            loop: this.loop,
            threshold: 0.3,
            speed: 400
        }, //该属性是给slider组件使用的,1.0.0版本以上需按此配置
        snapLoop: true,// 是否可以无缝循环轮播
        snapThreshold:0.1,//用手指滑动时页面可切换的阈值,大于这个阈值可以滑动的下一页
        snapSpeed: 400,//轮播图切换的动画时间
        swipeTime: 2500,// swipe 持续时间
        bounceTime: 700,// 弹力动画持续的毫秒数
    }
    //事件api
      getCurrentPage() - snap为true时,获取滚动的当前页,返回的对象结构为 {x, y, pageX, pageY},其中x,y代表滚动横向和纵向的位置;pageX,pageY 表示横向和纵向的页面索引。用法如:getCurrentPage().pageX
        goToPage(x, y, time, easing) - snap 为 true,滚动到对应的页面,x
        表示横向页面索引,y表示纵向页面索引,time表示动画,easing表示缓动函数(可省略不写)   
        next(time, easing) //滚动到下一个页面
        prev(time, easing) //滚动到上一个页面
        getCurrentPage() //获取当前页面的信息。
    <!--pick组件-->
    {
         wheel: {
            selectedIndex: (this.whellIndex[m])  || 0, //表示被选中的 wheel 索引
            rotate: 25, //表示被选中的 wheel 每一层的旋转角度
            adjustTime: 400,  //调整停留位置的时间
            wheelWrapperClass: 'wheel-scroll', 
            wheelItemClass: 'wheel-item'
        }
        //如果配置为 Object 的时候wheelWrapperClass 和 wheelItemClass 必须对应于你的实例 better-scroll 的 wrapper 类名和 wrapper 内的子类名。二者的默认值是 "wheel-scroll"/"wheel-item",如果你不配置或者配置的名称和你对应DOM节点的类名不一致的话会导致一个问题:滚动起来的时候点击一下终止滚动并不会触发 scrollEnd 事件,进而影响诸如城市选择器联动数据的这种组件的结果。
    }
     //事件api
        wheelTo(index)//当我们做picker组件的时候,调用该方法可以滚动到索引对应的位置。
        getSelectedIndex() //获取当前选中的索引值。
        enable()启用 better-scroll,默认开启
        disable()  禁用 better-scroll
        destroy() 销毁 better-scroll,解绑事件