(生产)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:
0wheel 为 true 时有效,表示被选中的 wheel 索引- rotate:
25wheel 为 true 时有效,表示被选中的 wheel 每一层的旋转角度- wheel:
false该属性是给 picker 组件使用的,普通的列表滚动不需要配置- snap:
false该属性是给 slider 组件使用的,普通的列表滚动不需要配置- snapLoop:
false是否可以无缝循环轮播- snapThreshold:
0.1用手指滑动时页面可切换的阈值,大于这个阈值可以滑动的下一页- snapSpeed:
400, 轮播图切换的动画时间- swipeTime:
2500swipe 持续时间- bounceTime:
700弹力动画持续的毫秒数- adjustTime:
400wheel 为 true 有用,调整停留位置的时间- swipeBounceTime:
1200swipe 回弹 时间- 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下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...
随机推荐
- Apache 性能调优-参考篇
1 内存 适当选用适合大小的内存,保证谷峰负载时,有足够的内存使用 2 使用ab测试apache性能 ab -n 1000 -c 10 http://www.test.com 使用ab的缺点: ...
- ArrayList深度分析:ArrayList和数组间的相互转换
一.ArrayList转换为数组ArrayList提供public <T> T[] toArray(T[] a)方法返回一个按照正确的顺序包含此列表中所有元素的数组,返回数组的运行时类型就 ...
- spring中IOC容器注册和获取bean的实例
spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结 1.使用xml文件配置 在idea中创建maven工程,然后创建实例Person,然后在 ...
- 使用esp32-Arduino+PubSubClient+mqtt 上传数据到中移动OneNet
使用esp32-doit-dev-v1开发板,测试mqtt协议, 发布(publish)到onenet 平台.注意:1.使用的mqtt arduino 客户端是 pubsubclient 库.其默认是 ...
- Linux(ubuntu)下固定IP的方法
写在前面,问:为什么要固定ip.答:要知道固定IP的好处多多,随意搬动,固定共享地址,不怕断网等等 首先,我们要选取一个局域网内的IP,方法如下: 1.选取IP号段,一般是路由器DCHP以外的IP地址 ...
- HDU1085 Holding Bin-Laden Captive!
Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long t ...
- AdvancedEncryptionStandard
import java.security.GeneralSecurityException; import javax.crypto.Cipher; import javax.crypto.spec. ...
- 两个数据库通过DataTable实现差异传输
两个主要方法 /// <summary>/// 用途:/// 用源表和目标表比较,返回差异的数据(目标表为参照物)/// /// 逻辑:/// 1.合并两个表/// 2.循环合并后得到的表 ...
- spring bean name生成规则
现象: PVService PVServiceImpl ===>名称就是PVServiceImpl, 首字母没有小写 PageViewServiceImpl ==>名称是pageViewS ...
- 创建有关hbase数据库的项目时所遇到的问题
1.在以前使用其他数据库时,经常会使用id自增来做主键,但是hbase数据库中不知道怎么来设置自增主键,所以我打算不要id自增主键.然后删除原来的表,重新创建表. 删除表语句: 用drop命令可以删除 ...