前段时间在搞移动终端(移动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. oozie调度sqoop Job 数据库密码无法保存

    问题描述 通过oozie调度sqoop作业时,需要输入数据库作业密码,但在sqoop元数据服务配置密码后,过一段时间会失效. 解决方法 将数据库密码写入HDFS文件,通过配置Sqoop job,实现传 ...

  2. msm audio machine 代码跟踪

    sound/soc/msm/msm8952.c // 注册平台设备 static int __init msm8952_machine_init(void) { return platform_dri ...

  3. windows系统下修改键盘按键的映射

    待解决的问题: 在windows系统下,在某些情况下,我们感觉键盘的按键位置不是特别方便,因此想重新映射它. 比如:要实现如下重新映射(我就有这样的需求),怎么办? Esc键 修改为 CapsLock ...

  4. python 中 __init__方法

    注意1,__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了. class A(object): def __init__(self,name): self.name=name ...

  5. Mock an function to modify partial return value by special arguments on Python

    Mock an function to modify partial return value by special arguments on Python python mock一个带参数的方法,修 ...

  6. python str byte 转换

    # bytes object b = b"example" # str object s = "example" # str to bytes bytes(s, ...

  7. yum安装mysql-5.6(centos7)

    centos 7.3 安装mysql 5.6 rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm yu ...

  8. Spark Distributed matrix 分布式矩阵

    RowMatrix行矩阵 import org.apache.spark.rdd.RDD import org.apache.spark.mllib.linalg.Vectors import org ...

  9. I - The lazy programmer 贪心+优先队列

    来源poj2970 A new web-design studio, called SMART (Simply Masters of ART), employs two people. The fir ...

  10. Solve Error: 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstraints:]: unrecognized selector sent to instance 0x7fa5c402fa00'

    下面是iOS开发用第三方库可能出现的错误,及其解决方法: 1. 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstra ...