Options 参数

  • startX: 0 开始的X轴位置
  • startY: 0 开始的Y轴位置
  • scrollY: true 滚动方向为 Y 轴
  • scrollX: 'true' 滚动方向为 X 轴
  • click: true 是否派发click事件
  • directionLockThreshold: 5
  • momentum: true 当快速滑动时是否开启滑动惯性
  • bounce: true 是否启用回弹动画效果
  • selectedIndex: 0 wheel 为 true 时有效,表示被选中的 wheel 索引
  • rotate: 25 wheel 为 true 时有效,表示被选中的 wheel 每一层的旋转角度
  • wheel: false 该属性是给 picker 组件使用的,普通的列表滚动不需要配置
  • snap: false 该属性是给 slider 组件使用的,普通的列表滚动不需要配置
  • snapLoop: false 是否可以无缝循环轮播
  • snapThreshold: 0.1 用手指滑动时页面可切换的阈值,大于这个阈值可以滑动的下一页
  • snapSpeed: 400, 轮播图切换的动画时间
  • swipeTime: 2500 swipe 持续时间
  • bounceTime: 700 弹力动画持续的毫秒数
  • adjustTime: 400 wheel 为 true 有用,调整停留位置的时间
  • swipeBounceTime: 1200 swipe 回弹 时间
  • deceleration: 0.001 滚动动量减速越大越快,建议不大于0.01
  • momentumLimitTime: 300 符合惯性拖动的最大时间
  • momentumLimitDistance: 15 符合惯性拖动的最小拖动距离
  • resizePolling: 60 重新调整窗口大小时,重新计算better-scroll的时间间隔
  • preventDefault: true 是否阻止默认事件
  • preventDefaultException: { tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT)$/ } 阻止默认事件
  • HWCompositing: true 是否启用硬件加速
  • useTransition: true 是否使用CSS3的Transition属性
  • useTransform: true 是否使用CSS3的Transform属性
  • probeType: 1 滚动的时候会派发scroll事件,会截流。2滚动的时候实时派发scroll事件,不会截流。 3除了实时派发scroll事件,在swipe的情况下仍然能实时派发scroll事件

Events 事件

  • beforeScrollStart - 滚动开始之前触发
  • scrollStart - 滚动开始时触发
  • scroll - 滚动时触发
  • scrollCancel - 取消滚动时触发
  • scrollEnd - 滚动结束时触发
  • touchend - 手指移开屏幕时触发
  • flick - 触发了 fastclick 时的回调函数
  • refresh - 当 better-scroll 刷新时触发
  • destroy - 销毁 better-scroll 实例时触发

Example:

let scroll = new BScroll(document.getElementById('wrapper'),{
   probeType: 3
})
 
scroll.on('scroll', (pos) => {
  console.log(pos.x + '~' + pos.y)
})

方法列表

  • scrollTo(x, y, time, easing)

滚动到某个位置,x,y 代表坐标,time 表示动画时间,easing 表示缓动函数
scroll.scrollTo(0, 500)

  • scrollToElement(el, time, offsetX, offsetY, easing)

滚动到某个元素,el(必填)表示 dom 元素,time 表示动画时间,offsetX 和 offsetY 表示坐标偏移量,easing 表示缓动函数

  • refresh()

强制 scroll 重新计算,当 better-scroll 中的元素发生变化的时候调用此方法

  • getCurrentPage()

当 snap 为 true 时,获取滚动的当前页,返回的对象结构为 {x, y, pageX, pageY},其中 x,y 代表滚动横向和纵向的位置;pageX,pageY 表示横向和纵向的页面索引

  • goToPage(x, y, time, easing)

当 snap 为 true,滚动到对应的页面,x 表示横向页面索引,y 表示纵向页面索引, time 表示动画,easing 表示缓动函数

  • enable()

启用 better-scroll,默认开启

  • disable()

禁用 better-scroll

  • destroy()

销毁 better-scroll,解绑事件

左右滑动的组件 - slider.vue:

  • 实现效果:

自动轮播, 左右滑动切换,循环轮播

  • 效果图:

  • 代码:

slider.vue

<template>
  <div class="slider" ref="slider">
    <div class="slider-group" ref="sliderGroup">
      <slot></slot>
    </div>
    <div class="dots">

      <!--上图点的html  -->
      <span class="dot" :class="{active: currentPageIndex === index }" v-for="(item, index) in dots"></span>
    </div>
  </div>
</template>

<script type="text/ecmascript-6">

import {addClass} from 'common/js/dom'
import BScroll from 'better-scroll'

export default {

name: 'slider',
props: {
  loop: {  //是否循环播放
    type: Boolean,
    default: true
  },
  autoPlay: { //是否自动播放
    type: Boolean,
    default: true
  },
  interval: { //轮播频率
    type: Number,
    default: 4000
  }
},

data() {
  return {
    dots: [],          // 用于设置有多小个点
    currentPageIndex: 0 // 当前播放到第几张图片
  }
},
mounted() {

  // 加上延迟20毫秒是因为dom初始化完,才可以执行以下操作
  setTimeout(() => {
    this._setSliderWidth()   //初始化宽度
    this._initDots()            //初始化上图的点
    this._initSlider()          //初始化better-scroll

    if (this.autoPlay) {
      this._play()      // 自动播放
    }
  }, 20)

  //resize 监听设备窗口发生变化,要重新计算高宽

  window.addEventListener('resize', () => {
    if (!this.slider) {
      return
    }
    this._setSliderWidth(true)
    this.slider.refresh()
  })
},

activated() {
  if (this.autoPlay) {
    this._play()   // 进入页面,重新执行自动播放,因为跳出页面会清除定时器
  }
},
deactivated() {
  clearTimeout(this.timer)  //跳出路由,清理定时器
},
beforeDestroy() {
  clearTimeout(this.timer)  //清理定时器
},
methods: {

  // 初始化高宽方法
  _setSliderWidth(isResize) {

    // <slot></slot>应该会被外面组件通过for循环生成的列表替换,获取这些列表
    this.children = this.$refs.sliderGroup.children

    // 用于保存总宽度
    let width = 0

    //获取组件的宽度
    let sliderWidth = this.$refs.slider.clientWidth
    for (let i = 0; i < this.children.length; i++) {
      let child = this.children[i]

      // 在这里添加样式,是因为如果在父组件添加样式,会增强父子组件的依赖
      addClass(child, 'slider-item')

      // 给每一个子组件的宽度,都应该=组件最外层div的宽度,保证每次轮播,都能填满
      child.style.width = sliderWidth + 'px'
      width += sliderWidth

    }
    if (this.loop && !isResize) {

      //循环播放的时,在第一个元素之前,会自动添加最后一个元素的克隆对象,

      //在最后一个元素之后,也会自动添加第一个元素的克隆对象,

      // 所以比实际上市多出2和元素, 计算宽度要加 2 * sliderWidth
      width += 2 * sliderWidth
    }
    this.$refs.sliderGroup.style.width = width + 'px'
  },
  _initSlider() {

this.slider = new BScroll(this.$refs.slider, {
  scrollX: true,
  scrollY: false,
  momentum: false,
  snap: true,
  snapLoop: this.loop,
  snapThreshold: 0.3,
  snapSpeed: 400

    })

this.slider.on('scrollEnd', () => {

  // 获取当前播放的索引
  let pageIndex = this.slider.getCurrentPage().pageX
  if (this.loop) {

    // 如果是循环播放,实际当前播放元素的索引,计算要减去1,原因也是多了2个元素
    pageIndex -= 1
  }

  // 改变当前选中的样式
  this.currentPageIndex = pageIndex

  if (this.autoPlay) {
    clearTimeout(this.timer)

    // 能自动播放的关键,每次滑动完成都会重新调用 _play 方法
    this._play()
  }
})

  },
  _initDots() {
    this.dots = new Array(this.children.length)
  },
  _play() {
    let pageIndex = this.currentPageIndex + 1
    if (this.loop) {
      pageIndex += 1
    }
    this.timer = setTimeout(() => {

      // 跳转到哪个页面
      this.slider.goToPage(pageIndex, 0, 400)
    }, this.interval)
  }
}

}

</script>

父组件引用插件:

import Slider from 'base/slider/slider'

components: {
  Slider
}

<!--  v-if="recommends.length"作用是保证有数据才会渲染组件  -->

<div v-if="recommends.length" class="slider-wrapper" ref="sliderWrapper">
  <slider>
    <div v-for="item in recommends">
      <a :href="item.linkUrl">

        <img class="needsclick" @load="loadImage" :src="item.picUrl">
      </a>
    </div>
  </slider>
</div>

方法loadImage :由于图片下载时异步的,所以有可能出现列表已经渲染好,但是图片还没有下载完的情况,导致的结果就是组件的宽度不正确,所以当图片加载完成,要重新计算宽度

loadImage() {
  if (!this.checkloaded) {
    this.checkloaded = true
    this.$refs.scroll.refresh()
  }
},

(生产)better-scroll - 下拉刷新的更多相关文章

  1. js 前端实现下拉刷新 上拉加载

    效果 css html,body{ height:100%; // 其他界面未设置html 无法监听scroll } /* 下拉刷新 */ .refresh-loading { transition: ...

  2. 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新

    在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...

  3. mui scroll和上拉加载/下拉刷新

    mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/*   */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...

  4. iscroll5实现一个下拉刷新上拉加载的效果

    直接上代码!!! <!DOCTYPE html><html><head lang="en"> <meta charset="UT ...

  5. mui 下拉刷新

    mui 下拉刷新 此文提供的是mui这种下拉刷新.悬浮于页面上,比较好用. <!DOCTYPE html> <html> <head> <meta chars ...

  6. iscroll.js 下拉刷新和上拉加载

    html代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  7. IOS UIWebView 下拉刷新功能的简单实现

    1.运行效果图 2.swift 代码的实现 import UIKit class RefreshWebViewController: UIViewController,UIScrollViewDele ...

  8. react + iscroll5 实现完美 下拉刷新,上拉加载

    经过几天的反复折腾,总算做出一个体验还不错的列表页了,主要支持了下拉刷新,上拉加载两个功能. 一开始直接采用了react-iscroll插件,它是基于iscroll插件开发的组件.但是开发过程中,发现 ...

  9. Android—自定义控件实现ListView下拉刷新

    这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...

随机推荐

  1. GET/POST/g和钩子函数(hook)

    GET请求和POST请求: 1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放在url中,并且是通过`?`的 ...

  2. React Native 在用户网络故障时自动调取缓存

    App往往都有缓存功能,例如常见的新闻类应用,如果你关闭网络,你上次打开App加载的数据还在,只是不能加载新的数据了. 我的博客bougieblog.cn,欢迎前来尬聊. 集中处理请求 如果你fetc ...

  3. sap abap 流水号设置

    1.TCODE:SNRO,进入如图所示界面 2. 短文本和长文本用来说明这个编号范围对象,输入任意描述即可. 子对象数据元素我们这里不填.这里需要说明一下,所谓子对象,多数指一个组织结构,比如公司代码 ...

  4. oracle小知识

    设置显示执行时间 set timing on; 不显示:off 最简单的块: begin dbms_output.put_line('Hello,World'); end; 执行结果出现这种情况(执行 ...

  5. SysPeek打不开解决方法

    SysPeek 是Linux平台下一款简洁小巧的系统状态指示软件,可实时显示 CPU.Memory.Swap.硬盘和网络使用情况.然而最近却使用不了,打不开.无论点击图标或者是终端打开,都不显示.看错 ...

  6. Windows多个应用程序共享全局变量,静态变量

    默认情况下exe不同实例使用copy-on-write技术避免共享数据,比如运行了两个exe,最开始它们使用的都是一份虚拟内存页,然后第一个实例修改了全局变量, 这时候COW就会复制那一页,然后将第一 ...

  7. C++基础学习8:类的定义(class)

    先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错(??) b) C语言中内存为空结构体分配大小为0,C++中为结构体和类分配大小为1byte c) C语言中的结构体只涉及到 ...

  8. leecode第三题(无重复字符的最长子串)

    class Solution { public: int lengthOfLongestSubstring(string s) { int len=s.size(); ||len==)//边界 ret ...

  9. Query获取多种input值的方法

    1 if($("input[name=item][value='val']").attr('checked')==true) //判断是否已经打勾 name即控件name属性,va ...

  10. python3 logging笔记

    #coding:utf-8import logging logger = logging.getLogger("simple_example")#可以说是日志信息的名字吧,可以随便 ...