前段时间在搞移动终端(移动web)的项目,其中需要用到滚动的功能(html的滚动效果不好,且在低版本上不支持)。后面上网找了下资料,发现大部分人都在用iscroll4(下面简称v4),下载下来试了下确实不错。在PC上滚动效果确定很好,在整合到移动web中,在部分机型(或者部分系统版本)上有卡顿,不是很流畅,有可能是配置低,也有可能某些属性设置错误造成滑动不顺畅。后面又上网查找资料,发现了iscroll5(下面简称v5)的测试版本(bate5.0.1)已经出来,果断下载下来耍耍(地址:http://cubiq.org/iscroll-5-ready-for-beta-test)

不过v5和v4差距也是有点大,对于想升级到v5的朋友们,可能要花点时间看源码做相应的升级调整(因为官方还未有相关文档出来),今天笔者借着使用过的一些功能的升级调整方式和注意点大概说明下(笔者没有去看全部的源码,只是将之前iscroll4用到的功能做相应调整),废话不多说,开始!

1、  首先是iscroll的实例化方式

v4
var scroller = new iScroll('id'); v5
var scroller = new IScroll('#id');

i改成大写了,应该是为了规范写法。后面的目标由原来的只能是DOM对象或者id改成可以支持DOM对象和选择器选择,源码中的选择方式是document.querySelector(el),而不再是document.getElementById(el);

2 、v5不再对目标添加overflow:hidden,用户有需求可以自行添加

3、v5的事件也不再是在option里面写了,而是仿造jquery的on绑定事件的方式。

 v4
var scroller = new iScroll('id',{
scrollStart : function(){
onsole.log('scroll started');
}
}); v5
var scroller = new IScroll('#id');
scroller.on('scrollStart', function () { console.log('scroll started'); });

4、v4中获取当前页的索引什么的是通过this.currPageX或者this.currPageY,而v5则是放在this.currentPage中,如要获取水平当前页的索引this.currentPage.pageX;

v4中滚动到某一页的事件调用是scrollToPage(x,y,time) ,而v5中则是gotoPage(x,y,time,easing);easing 为v5中新加的滚动到边界时的反应特效,这里不细说,大家可以自己尝试看看,注意:若添加了特效,scrollEnd事件不会触发(测试版本可能没有添加支持,笔者已经留言给iscroll作者),如在v4中有实现上拉加载更多等事件,则无法添加特效,否则你会发现上拉加载更多的逻辑不会执行。

5、v5测试版中的事件比较少,很多事件都还没添加,如v4中的scrollMove也没有,由于项目需要,我暂时在源码中_move函数的最后面添加了支持

6、v5默认水平滚动禁用掉,竖直默认启用,而v4中则是默认都启用。

7、V4中可通过设置option的以下参数来控制当滚动时出现滚动条,滚动结束则隐藏滚动条,v5无法实现(实际上很多option都不一样了,或者说根本没有支持了,也许以后会慢慢的添加,毕竟现在只是测试版本)

fixedScrollbar : true,
hideScrollbar : true,

目前可以通过以下代码来暂时实现

 var iSObj = new IScroll(obj,opt);  

 //滚动条在滚动时显示出来,滚动结束隐藏
iSObj.on("scrollEnd",function(){
if(this.indicator1){
this.indicator1.indicatorStyle['transition-duration'] = '350ms';
this.indicator1.indicatorStyle['opacity'] = '0';
}
});
iSObj.on("scrollMove",function(){
if(this.indicator1){
this.indicator1.indicatorStyle['transition-duration'] = '0ms';
this.indicator1.indicatorStyle['opacity'] = '0.8';
}
});

8、v4默认若内容不超过显示区域,则不会出现滚动条,就算手指过去滚动,也不会有任何反应,就算你设置了滚动条默认显示,他也不会出现滚动条。v4中就算内容比较少,但是你去滚动,还是会有到边界反弹回来的效果,而且若有开启滚动条,滚动条也会显示。

-------------------------------------------------------------------------------------------------------------

9、v5.0.4目前还未提供下拉刷新和上拉加载的demo,上拉加载和v4的demo类似,下拉需要临时方案解决(改源码)

1)、options中加一个属性 topOffset : 0

2)、resetPostion方法中的

if ( x == this.x && y == this.y ) {
return false;
}

  

前面加上

 y = this.y >= this.minScrollY || this.maxScrollY > 0 ? this.minScrollY : this.y < this.maxScrollY ? this.maxScrollY : this.y;  

3)、refresh中的

 var rf = this.wrapper.offsetHeight;        // Force reflow

 this.wrapperWidth    = this.wrapper.clientWidth;
this.wrapperHeight = this.wrapper.clientHeight; //add
this.minScrollY = -this.options.topOffset || 0;
//end add
/* REPLACE START: refresh */ this.scrollerWidth = this.scroller.offsetWidth; //mdy
//this.scrollerHeight = this.scroller.offsetHeight
this.scrollerHeight = this.scroller.offsetHeight+ this.minScrollY;
//end mdy
/* REPLACE END: refresh */ this.maxScrollX = this.wrapperWidth - this.scrollerWidth; //mdy
//this.maxScrollY = this.wrapperHeight - this.scrollerHeight;
this.maxScrollY = this.wrapperHeight - this.scrollerHeight+ this.minScrollY;
//end mdy
..................
..................
..................

10、v4中如果既要上下又要左右滚动,可考虑双层嵌套,但是一般 不建议双层嵌套,体验不是很好,会有蛮多问题,尽量去避免这种需求,做到一个方向的滚动即可。如果实在是需要也不是很大问题。v4一个很大的问题是若用双层嵌套,用户在滑动时若稍微有点斜着滑就会造成整块滑动区域都飘起来了(也就是说他即在做左右滑动又在做上下滑动,但实际上我们的需求是用户同一时间只能是某一个方向滑动)v5.0.1版本有解决了这个问题,v5.0.4又有这个问题了(不知道作者什么想法),可以通过修改源码的临时方案解决.但是此种方案只能解决在用户一开始按住滑动只有一个方向,哪怕一像素,这时候不管你如果滑动,都会保证只有一个方向可以滑动(我们需要的),而如果用户一开始按住滑动是直接45度斜角滑的
,那么此问题还是存在。

 _move: function (e) {
if ( !this.enabled || utils.eventType[e.type] !== this.initiated ) {
return;
} if ( this.options.preventDefault ) { // increases performance on Android? TODO: check!
e.preventDefault();
} var point = e.touches ? e.touches[0] : e, //mdy
//这2句必须换成下面那2句,否则当多层嵌套(即有上下滚动又有左右滚动)时会变成一边左右滚一边上下滚,但实际上我们只需要专注某一个方向
//deltaX = this.hasHorizontalScroll ? point.pageX - this.pointX : 0,
//deltaY = this.hasVerticalScroll ? point.pageY - this.pointY : 0,
deltaX = point.pageX - this.pointX,
deltaY = point.pageY - this.pointY, //end mdy
timestamp = utils.getTime(),
newX, newY,
absDistX, absDistY; this.pointX = point.pageX;
this.pointY = point.pageY;
.............................
.............................
.............................

11、若遇到在滚动区域中某些地方的默认事件无法触发(如A标签的链接),基本上是由于IScroll把滚动区域中的表单元素默认事件都禁用掉了,也就是e.preventDefault()(为了滚动顺畅),可根据需要在源码中做个判断,比如你想保留A标签的默认事件,则可以对被点击的元素的tagName进行判断,然后决定要不要e.preventDefault()。

完整demo下载地址:http://download.csdn.net/detail/gcz564539969/6901753

iscroll4升级到iscroll5全攻略笔记的更多相关文章

  1. VSCode插件开发全攻略(十)打包、发布、升级

    更多文章请戳VSCode插件开发全攻略系列目录导航. 发布方式 插件开发完了,如何发布出去分享给他人呢?主要有3种方法: 方法一:直接把文件夹发给别人,让别人找到vscode的插件存放目录并放进去,然 ...

  2. 从小工到专家 ——读《Java程序员职场全攻略》有感

    从小工到专家 ——读<Java程序员职场全攻略>有感   <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...

  3. SQL Server 备份和还原全攻略

    原文:SQL Server 备份和还原全攻略 一.知识点 完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份, ...

  4. VSCode插件开发全攻略(一)概览

    文章索引 VSCode插件开发全攻略(一)概览 VSCode插件开发全攻略(二)HelloWord VSCode插件开发全攻略(三)package.json详解 VSCode插件开发全攻略(四)命令. ...

  5. LINUX SHELL脚本攻略笔记[速查]

    Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述 ...

  6. Windows Socket五种I/O模型——代码全攻略(转)

    Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操 ...

  7. H5 移动调试全攻略

    H5 移动调试全攻略 随着移动设备的高速发展,H5 开发也成为了 F2E 不可或缺的能力.而移动开发的重中之重就是掌握调试技巧,定 Bug于无形. 一.概要 因为移动端操作系统分为 iOS 和 And ...

  8. Retrofit全攻略——进阶篇

    最近事比较多,距离上次写文章已经过去了一个月了.上一篇文章Retrofit全攻略——基础篇 介绍了Retrofit的基础用法,这篇文章介绍点进阶的用法. 打印网络日志 在开发阶段,为了方便调试,我们需 ...

  9. Anaconda使用教程全攻略

    Anaconda使用教程全攻略 本文转自 https://zhuanlan.zhihu.com/p/32925500           〇.序 Python是一种面向对象的解释型计算机程序设计语言, ...

随机推荐

  1. RSA加密算法详解(一)

    如果你问我,哪一种算法最重要? 我可能会回答"公钥加密算法". 因为它是计算机通信安全的基石,保证了加密数据不会被破解.你可以想象一下,信用卡交易被破解的后果. 进入正题之前,我先 ...

  2. "title_activity_dist" is not translated in "zh-rCN" (Chinese: China)

    根据报错提示,是说我没有对string文件做国际化翻译操作,但是我报错的项目并没有做国际化,所以并没有values-zh-rCN和values-zh-rTW两个文件夹,最后我发现原来是当前项目引用的一 ...

  3. 关于pythoh面向过程开发人员三步转面向对象的补充,再加一步,四步走战略。转面向对象也可以有固定公式。

    前言: oop非常非常非常重要.搞不懂oop,就玩不了python,就算能写也一定是写代码时候喜欢靠猜瞎猫碰死老鼠写得心很虚.为什么这么说呢,我也是从面向过程编程到死走过来的,一路def到死,一看到有 ...

  4. 【Dubbo 源码解析】05_Dubbo 服务发现&引用

    Dubbo 服务发现&引用 Dubbo 引用的服务消费者最终会构造成一个 Spring 的 Bean,具体是通过 ReferenceBean 来实现的.它是一个 FactoryBean,所有的 ...

  5. Nessus中文报告自动化脚本

    前言 Nessus扫描完成,总要花挺多时间去整理报告,为此写了一个小脚本,用于自动化生成中文漏洞报告. 解析导出的html报告,自动翻译成中文,并提供修复建议,减少整理报告的时间,提升工作效率. gi ...

  6. 第七天 py

  7. 牛客练习赛39D

    n,m<=5e4; 首先操作2用并查集就行了.题解说的好啊! 考虑操作一,连的两个点如果同色,直接合并,然后这个颜色的联通块-1,然后合并bitset,就是或一下.bitset维护的是相连的异色 ...

  8. Java 中的泛型

    泛型的一般意义: 泛型,又叫 参数多态或者类型参数多态.在强类型的编程语言中普遍作用是:加强编译时的类型安全(类型检查),以及减少类型转换的次数. Java 中的 泛型: 编译时进行 类型擦除 生成与 ...

  9. vue3版本到vue2版本的桥接工具

    vue2的命令可以正常使用.

  10. 方差+标准差+四分位数+z-score公式

    一.方差公式 $S^2 = \frac{1}{N}\sum_{i=1}^{N}(X_i - \mu)^2 = \frac{1}{N}[(X_1-\mu)^2 + (X_2-\mu)^2 + ... + ...