前段时间在搞移动终端(移动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. Spark RDD、DataFrame原理及操作详解

    RDD是什么? RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用. RDD内部可以 ...

  2. 用WordPress建立专业网站教程 (一步步建站, 一步也不少)

    最新美国域名中心US Domain Center: http://www.usdomaincenter.com/ 建站教程 (10分钟上线, 无需备案): https://www.qiyewp.com ...

  3. 一个tomcat服务器上部署多个Web项目,不同域名访问

    [参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...

  4. 大华等其他NVR接入海康IPC H.264方法

    有一次遇到这个问题,因为时间急,没有注意,这次一个朋友也遇到这个问题,各种百度,也没有看到答案 只好自己研究了一下,最终发现以下方式来解决 下面办法可以解决海康IPC不能能过ONVIF连接到大华等其他 ...

  5. C#中 Excel和其他文件类型的Content-Type/mime-type

    C#中 Excel和其他文件类型的Content-Type/mime-type For BIFF .xls files application/vnd.ms-excel For Excel2007 a ...

  6. MTK LCM的添加

    对于LCM驱动移植,一般分为三部曲: 1.硬件IO口配置: 2.确保LCM背光能够正常点亮: 3.LCM驱动移植: 硬件电路: 1.GPIO配置 打开 mediatek\dct\DrvGen.exe ...

  7. 一、Sql Server 基础培训《进度1-建库建数据表(实际操作)》

    知识点: 1.建数据库示例参考 --创建一个数据库名为‘dbtest’ create database dbtest go --打开数据库 dbtest use dbtest go 2.建表示例参考 ...

  8. js库 - 浅拷贝 & 深拷贝

    学了堆栈内存空间,应该就理解了什么叫简单数据类型存在栈内存,复杂数据类型存在堆内存了. 然后面试中经常会问.业务中也经常会遇到的问题就是深浅拷贝的问题了. 栈内存中简单数据类型直接拷贝就能得到一个副本 ...

  9. centos7上修改lv逻辑卷的大小

    author:headsen  chen date: 2019-03-18 15:24:22 1,查看 [root@localhost mnt]# df -h Filesystem Size Used ...

  10. 管理菜单 结贴回复 来自 202.112.36.253 的回复: TTL 传输中过期

    发表于 2010-08-26 18:29:14 楼主 其实标题是我执行如下命令时的输出:C:\Users\ChenWeiguang>ping 218.198.81.190 正在 Ping 218 ...