转自http://lhdst-163-com.iteye.com/blog/1239784javascript
iscroll.js是Matteo Spinelli开发的一个js文件,使用原生js编写,不依赖与任何js框架。旨在解决移动webkit系浏览器的区域滚动问题,兼容mobile safari、Android默认浏览器、safari、chrome、firefox5+、opera11+、IE9+及其余webkit核心浏览器。最新版本为iscroll4。
官方网站:iscroll4
iscroll的用武之地
1.区域滚动
咱们在pc端web开发中,有时会用固定某一区域的宽度和高度,而后使用overflow:auto,使其内容在该区域内滚动。
iphone默认浏览器(mobile safari)也支持固定区域的滚动,但必须双指滑动操做,并且没有滚动条。mobile safari中的单指滑动只针对页面级别,不针对页面元素。这样的操做体验很麻烦,并且不少用户根本不知道双指可以区域滑动。
android自带浏览器也支持区域滚动,且能够单指滑动操做,可是滑动起来卡的半死半活,很不流畅。
使用iscroll,能够完美解决上述问题了,不只能够在iphone和android上单指滑动,并且滑动起来流畅之极,酣畅淋漓。滑动过程当中也有漂亮的滚动条提示,让你舒心不已。
2.固定定位
固定定位不是iscroll的原生用法,而是使用iscroll协助解决固定定位问题。
话说iphone很先进,但就是不支持position:fixed。这下苦了咱们了,固定定位怎么解决啊,咱们会常常遇到固定标题栏、固定工具栏等状况啊!!
使用iscroll协助解决:首先获取浏览器窗口高度;而后获取固定工具栏的高度;接着将除固定工具栏以外的内容所有放在一个固定区域内,该固定区域的高度=窗口高度-工具栏高度;以后对固定区域使用iscroll。这样,整个html页面的高度正好等于窗口高度,页面级别不会出现滚动,工具栏就一直固定在当前的位置。在固定区域内滑动,能够查看页面其余内容,不会影响工具栏的定位。
鼠标滚轮滚动
iscroll支持在pc端浏览器中使用鼠标滚轮控制区域滚动,但操做起来很不灵敏。这是因为iscroll对鼠标滚轮事件作了拦截,而后缩小了滚轮的滚动距离,详见iscroll4.js源代码608-609行:
wheelDeltaX = e.wheelDeltaX / 12;//控制X轴鼠标滚轮速度
wheelDeltaY = e.wheelDeltaY / 12;//控制Y轴鼠标滚轮速度
iscroll将每次的滚轮距离缩小为系统默认距离的12分之一,难怪滚起来很慢,感受不灵敏。只须要将12改为1,滚轮的滚动速度就恢复正常了。你也能够根据实际须要设置成其余值。
输入框聚焦不灵敏、没法选择文字
使用了iscroll以后,你会发现点击输入框时不灵敏,常常没法聚焦;页面文字也没法选择和复制。这是因为iscroll要监听鼠标事件和触摸事件来进行滚动,因此禁止了浏览器的默认行为,详见源代码92行:
onBeforeScrollStart: function (e) { e.preventDefault(); },
iscroll不分青红皂白,禁止了浏览器的一切默认行为,致使上述问题。因此咱们须要稍做修改:
onBeforeScrollStart: function (e) {
var target = e.target;
while (target.nodeType != 1) target = target.parentNode;
if (target.tagName != ‘SELECT’ && target.tagName != ‘INPUT’ && target.tagName != ‘TEXTAREA’)
e.preventDefault();
},
判断触发事件的元素是否是input、select、textarea等表单输入类元素,若是不是就阻止默认行为。这样保证了输入类元素能正确快速聚焦。
在上述修改中追加一个条件 target.tagName != ‘body’或者直接将onBeforeScrollStart修改成null,便可作到鼠标选取文字,但这样的修改会致使iscroll滚动失效或不灵敏,因此没法选取文字这个问题先放一边吧。如你有更好的方法,欢迎回复。
select元素操做不灵敏或操做后白屏
使用iscroll后,还有一个较麻烦的问题,就是select元素点击不灵敏(滚动以后点击select,常常无响应);有时点击有反应了,下拉菜单显示却错位(pc端);选择一项以后,页面直接变成了空白(iphone、android中)或者页面位置向上偏离,滚动区域位置出现偏离。
说白了,就是致使select无法用。为此我调试了好久,最后发现了问题所在:iscroll默认使用的是css的transform变形中的translate3d实现区域滚动,每次滚动实际是改变translate3d中的y轴值,实际的dom位置并无发生变化。translate3d会致使页面的焦点错误,系统级下拉菜单的显示则会致使其出现显示偏离。
控制滚动模式的代码在67行:useTransform: true。好在iscroll提供了另外一种滚动方式,基于绝对定位位置变化的滚动。修改成useTransform: false以后,iscroll就会使用对定位位方式来实现滚动,该方式是咱们在web开发中模拟动画的最经常使用方式,滚动以后dom的实际位置也同步发生了变化,不会出现错位偏离现象。
在pc端主流浏览器、iphone、android2.2下测试,select问题完美解决。
不过须要注意,使用对position决定定位后,滚动区的宽度默认会自适应内容宽度,而不是父元素的100%,因此最好将滚动区域宽度设为100%。
美中不足
iscroll是小而精的经典做品,名字也带着apple范。但惟一美中不足的是,只能使用id调用。css
=================================================================================html
下面是另外一篇博文,转自http://blog.chinaunix.net/uid-25820084-id-3524194.htmljava
iscroll4 是一款针对web app使用的滚动控件,它能够模拟原生iOS应用里的滚动列表操做,虽然插件不大可是效果十分好。是web app开发必备的控件之一。node
iscroll4官网 : http://cubiq.org/iscroll-4android
为何要用iscroll4ios
由于在IOS5以前,web webkit是不支持一种原生方法去滚动固定 长/宽 容器里的内容的。简单的说,就是css属性 overflow:scroll在IOS5 以前是不生效的。css3
这就像兼容万恶的IE6同样,做者但愿经过写一个控件,让全部web浏览器支持这种滚动,因而iscroll4应运而生。web
在解决了兼容性的问题以外,它还提供了需求许多交互的解决方案,如:chrome
1.双指放大缩小操做
2.下拉刷新/上拉加载更多
3.逐个元素定位的滚动列表
使用iscroll4可能会遇到的问题
1.在iscroll4的滚动容器范围内,点击input框、select等表单元素时没有响应
这个问题缘由在于iscroll须要一直监听用户的touch操做,以便灵敏的作出对应效果,因此它把其他的默认事件屏蔽了,解决的方法是,在iscroll4源码里面找到这一行
1
|
onBeforeScrollStart: function (e) { e.preventDefault(); }
|
而后把它改为
1
|
onBeforeScrollStart: function (e) { var nodeType = e.explicitOriginalTarget © e.explicitOriginalTarget.nodeName.toLowerCase():(e.target © e.target.nodeName.toLowerCase():'');if(nodeType !='select'&& nodeType !='option'&& nodeType !='input'&& nodeType!='textarea') e.preventDefault(); }
|
这样只要你touch的元素是 select || option || input || textarea时,它就不会执行e.preventDefault(),默认的事件就不会被屏蔽了。
若是你有其余不想被屏蔽的元素,能够本身修改,不过须要注意onBeforeScrollStart里的屏蔽默认事件很重要,它是iscroll进行流畅滚动的基础,不要随便的把它去掉,不然你会发现滚动起来很卡顿。
2.往iscroll容器内添加内容时,容器闪动的bug
我在作上拉加载更多内容的时候,确定须要把新的内容插入到容器内,这时发现有时容器会出现闪动,一开始认为是insert进去的内容太多,后来又以为是否是由于里面布局用了float的缘由致使从新渲染,最后统统排除。
其实病灶在于iscroll使用了太为先进的CSS3属性,可能web webkit对这些属性的支持力度仍是不够好。
涉及的两个属性是 translate3d 和 TransitionTimingFunction,或许是这两个属性在列表长度改变时会影响到渲染,因此致使页面闪动,解决办法就是找到源代码的
1
|
has3d = 'WebKitCSSMatrix' in window && 'm11' in new WebKitCSSMatrix()
|
改为
1
|
has3d = false
|
和在配置iscroll时,useTransition设置成false就能够了(useTransition默认是false的)。
这样作有一点瑕疵就是滚动起来和原来比没那么流畅了(原来的效果然的是能够媲美原生app的),可是假如你不对比的话,是看不出来了。
在效果和体验上面选择,我更看重体验。
不够若是你符合下面的条件,我仍是不建议你修改为我这样
1)即便你不修改,不管你怎么往iscroll容器里面插内容,它都不会闪动,这种状况大多出如今纯文字的列表。假如列表涉及复杂的布局和图片,不少时候会出现闪动bug
2)若是你的web app只是单纯在手机浏览器浏览。translate3d 和 TransitionTimingFunction只是在ios里的uiwebview支持不成熟,可是在手机上的safari彻底没有问题,因此若是你不是用phonegap之类的框架开发混合app,你不须要担忧这个问题。
3)只针对android,由于android的webkit暂时还不支持translate3d,iscroll会自动选择不用。
3.过长的滚动内容,致使卡顿和app直接闪退
说白了iscroll都是用js+css3实现的,对浏览器的消耗确定是可观的,避免无限制的内容加载自己就是web产品应该避免的。
假如无可避免,咱们能够尽可能减低iscroll对浏览器内存的消耗
1)不要使用checkDOMChanges。虽然checkDOMChanges很方便,定时检测容器长度是否变化来refresh,但这也意味着你要消耗一个Interval的内存空间
2)隐藏iscroll滚动条,配置时设置hScrollbar和vScrollbar为false。
3)不得已的状况下,去掉各类效果,momentum、useTransform、useTransition都设置为false
4.左右滚动时,不能正确响应正文上下拉动
在作这种效果时 ,假如这个幻灯片模块只是你页面的一部分,你还须要上下拉动页面去浏览其它内容时,你的手指在这个模块上作上下拨动时,恐怕会没有反应。缘由仍是和问题1同样的,由于屏蔽了默认事件。
完美的解决方法是没有的,若是把 e.preventDefault() 去掉,幻灯片的滚动效果就会大打折扣,并且有时用户上下拨动的操做会被误操做成幻灯片的滚动。因此在效果仍是体验上,你们仍是本身选择吧。在技术上解决不了的问题,我认为仍是多和产品和UI沟通比较好,共同协商一个良好的方案。