(生产)better-scroll - 下拉刷新
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-scrollif (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 = pageIndexif (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 - 下拉刷新的更多相关文章
- js 前端实现下拉刷新 上拉加载
效果 css html,body{ height:100%; // 其他界面未设置html 无法监听scroll } /* 下拉刷新 */ .refresh-loading { transition: ...
- 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新
在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...
- mui scroll和上拉加载/下拉刷新
mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/* */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...
- iscroll5实现一个下拉刷新上拉加载的效果
直接上代码!!! <!DOCTYPE html><html><head lang="en"> <meta charset="UT ...
- mui 下拉刷新
mui 下拉刷新 此文提供的是mui这种下拉刷新.悬浮于页面上,比较好用. <!DOCTYPE html> <html> <head> <meta chars ...
- iscroll.js 下拉刷新和上拉加载
html代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- IOS UIWebView 下拉刷新功能的简单实现
1.运行效果图 2.swift 代码的实现 import UIKit class RefreshWebViewController: UIViewController,UIScrollViewDele ...
- react + iscroll5 实现完美 下拉刷新,上拉加载
经过几天的反复折腾,总算做出一个体验还不错的列表页了,主要支持了下拉刷新,上拉加载两个功能. 一开始直接采用了react-iscroll插件,它是基于iscroll插件开发的组件.但是开发过程中,发现 ...
- Android—自定义控件实现ListView下拉刷新
这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...
随机推荐
- jdk 1.6.0_43 下载
Java SE Development Kit 6u43 Product / File Description File Size Download password Linux x86 65.43 ...
- ArrayList深度分析:ArrayList和数组间的相互转换
一.ArrayList转换为数组ArrayList提供public <T> T[] toArray(T[] a)方法返回一个按照正确的顺序包含此列表中所有元素的数组,返回数组的运行时类型就 ...
- socket中close发生的事情,RST,pipe信号错误
1.server端close之后,client端write,导致server端发送RST(服务器关闭套接字):对方已经关闭或者异常终止,但是client端,不知道,这个成为半打开 当server端cl ...
- 20.Add Two Numbers(两个链表的和)
Level: Medium 题目描述: You are given two non-empty linked lists representing two non-negative integer ...
- pacman命令用法
Pacman 是一个命令行工具,这意味着当你执行下面的命令时,必须在终端或控制台中进行. 1.更新系统 在 Arch Linux 中,使用一条命令即可对整个系统进行更新: pacman -Syu 如果 ...
- Ueeidor 使用
setContent 要放在 ue.read(function(){ })中... js 字符串参数不要忘记 引号.....而且最好是单引号!!!
- 本地访问Vmware虚机Web网站
情况:公司是域环境,Vmware网络设置的是NAT连接模式,里外装的都是Windows,虚机网络IP地址是自动获取的. 查看: 1.虚机Ping本地的IP地址可以Ping通: 2.本地Ping虚机的I ...
- 查询多列得到map与查询得到po对象
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; i ...
- python练习六十五:类的使用实例
代码: class human(): #定义基类,包括属性和方法 def __init__(self,name,eye=2,age=98,city='陕西'): #属性值有四个,分别为name,eye ...
- angularJs(1)指令篇
angularJs模板 <!DOCTYPE html> <html> <head lang="en"> <meta charset=& ...