这个不幸的规则导致所有web-app要模拟成app的样子时,只能由一个绝对定位的header 或是footer再加上一个可以内容的滚动的中间区域组成。
幸运的是移动webkit提供了一种强大的硬件加速的CSS属性,这个属性可以用来模拟这个缺失的功能,Iscroll从这里开始了前进之路,但是没有不带刺的玫瑰。让内容滚动像原生方式一般比想象中要难
iscroll官网
iscroll例子
截至到笔者发布这篇文章时,通过样式:
overflow:scroll; -webkit-overflow-scrolling:touch;
IOS5 已经能够支持区域滚动了。但是andriod4 还是不行...
iScroll 使用起来很简单,首先你需要一个合理的DOM结构:
... ...
其次是推荐的样式:
#wrapper { position:relative; z-index:1; width:/* your desired width, auto and 100% are fine */; height:/* element height */; overflow:/* hidden|auto|scroll */; }
官方推荐这样的结构,因为iscroll只能滚动wrapper里的第一个子节点,或者说唯一一个子节点才能使得iscroll正确的生效。因为这个节点需要一个绝对定位的CSS属性,更重要的是这个节点里所包裹的内容有了一个统一的容器,我们只需要计算之后修改这个容器的属性值就可以达到我们滚动的效果。
iscroll 需要两个参数,第一个很简单就是外容器的id,第二个参数是一个参数对象。
通过这个对象可以传入iscroll的各项参数来配置iscroll。
他的参数基本分为四个部分
- 基础
- 滚动条
- 放大缩小
- 事件回调
hScroll: true, //是否水平滚动 vScroll: true, //是否垂直滚动 x: 0, //滚动水平初始位置 y: 0, //滚动垂直初始位置 bounce: true, //是否超过实际位置反弹 bounceLock: false, //当内容少于滚动是否可以反弹,这个实际用处不大 momentum: true, //动量效果,拖动惯性 lockDirection: true, //当水平滚动和垂直滚动同时生效时,当拖动开始是否锁定另一边的拖动 useTransform: true, //是否使用CSS形变 useTransition: false, //是否使用CSS变换 topOffset: 0, //已经滚动的基准值(一般情况用不到) checkDOMChanges: false, //是否自动检测内容变化
checkDOMChanges 这个不是十分靠得住,因为他目前是轮询检测offsetWidth、offsetHeight,然后才去调自身的refresh 重新计算滚动区域,但是有时候只检测这个不是很准..
// Scrollbar 的相关参数 hScrollbar: true, //是否显示水平滚动条 vScrollbar: true, //同上垂直滚动条 fixedScrollbar: isAndroid, //对andriod的fixed hideScrollbar: isIDevice, //是否隐藏滚动条 fadeScrollbar: isIDevice && has3d, //滚动条是否渐隐渐显 scrollbarClass: '', //字定义滚动条的样式名
通过scrollbar这些参数可以配置iscroll的滚动条,通过scrollbarClass可以自己定义一套滚动条的样式。
// Zoom 放大相关的参数 zoom: false, //默认是否放大 zoomMin: 1, //放大的最小倍数 zoomMax: 4, //最大倍数 doubleTapZoom: 2, //双触放大几倍 wheelAction: 'scroll', //鼠标滚动行为(还可以是zoom)
这个Zoom我觉得比较好用,对于一个固定显示图片区域的类似应用,可以非常简单的做到固定滚动,包括两指放大的应用。
wheelAction 这个参数是给PC的鼠标滚动定义的,可以定义为滚动鼠标滚轮放大。
// 自定义 Events 的相关参数 onRefresh: null, //refresh 的回调,关于自身何时调用refresh 后面会继续谈到 onBeforeScrollStart: function (e) { e.preventDefault(); }, //开始滚动前的时间回调,默认是阻止浏览器默认行为 onScrollStart: null, //开始滚动的回调 onBeforeScrollMove: null, //在内容移动前的回调 onScrollMove: null, //内容移动的回调 onBeforeScrollEnd: null, 在滚动结束前的回调 onScrollEnd: null, //在滚动完成后的回调 onTouchEnd: null, //手离开屏幕后的回调 onDestroy: null, //销毁实例的回调 onZoomStart: null, onZoom: null, onZoomEnd: null
通过了解以上参数,你可以非常容易的配置自己的iscroll 应用:
你可以通过onScrollEnd 事件回调在结束滚动后执行一段你自己的代码
你也可以简单的新建一个可以通过双触放大的固定滚动区域。
你也可以什么都不做,只是简单的约定碰到边界是否反弹,等等。
var myscroll = new iScroll('wrapper', { hScroll: false, //是否水平滚动 vScroll: true, //是否垂直滚动 y: 10, //滚动垂直初始位置 bounce : false });
当然,在使用时,如果对创建的iscroll 实例保存引用会有很多好处:
你可以在内容改变时,DOM结构发生改变时调用 myscroll.refresh() 来重新计算固定滚动区域的内容高度,从而使得你的iscroll工作正常。
你也可以在你的应用结束时,用过这个引用调用destroy方法来,销毁这个iscroll 实例
等等....
当然,iscroll提供的Api也是非常丰富,所以我们可以通过使用iscroll来做很多webapp的应用,下一篇文章我将会主要介绍一下iscroll的公用调用方法,以及参数的控制。
转载请注明原文出处: http://qbaty.iteye.com/blog/1221061