IScroll 实践指南
之因此iscroll会诞生,主要是由于不管是在iphone、ipod、android 或是更早前的移动webkit都没有提供一种原生的方式来支持在一个固定高度的容器内滚动内容。
这个不幸的规则致使全部web-app要模拟成app的样子时,只能由一个绝对定位的header 或是footer再加上一个能够内容的滚动的中间区域组成。
幸运的是移动webkit提供了一种强大的硬件加速的CSS属性,这个属性能够用来模拟这个缺失的功能,Iscroll从这里开始了前进之路,可是没有不带刺的玫瑰。让内容滚动像原生方式通常比想象中要难
iscroll官网
iscroll例子
截至到笔者发布这篇文章时,经过样式:java
overflow:scroll; -webkit-overflow-scrolling:touch;
IOS5 已经可以支持区域滚动了。可是andriod4 仍是不行...
iScroll 使用起来很简单,首先你须要一个合理的DOM结构:android
<div id="wrapper"> <ul id="scroll"> <li></li> ... ... </ul> </div>
其次是推荐的样式:web
#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。
他的参数基本分为四个部分
浏览器
如下由笔者整理的iScroll参数以及其表明的意思:app
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 从新计算滚动区域,可是有时候只检测这个不是很准..webapp
// Scrollbar 的相关参数 hScrollbar: true, //是否显示水平滚动条 vScrollbar: true, //同上垂直滚动条 fixedScrollbar: isAndroid, //对andriod的fixed hideScrollbar: isIDevice, //是否隐藏滚动条 fadeScrollbar: isIDevice && has3d, //滚动条是否渐隐渐显 scrollbarClass: '', //字定义滚动条的样式名
经过scrollbar这些参数能够配置iscroll的滚动条,经过scrollbarClass能够本身定义一套滚动条的样式。iphone
// Zoom 放大相关的参数 zoom: false, //默认是否放大 zoomMin: 1, //放大的最小倍数 zoomMax: 4, //最大倍数 doubleTapZoom: 2, //双触放大几倍 wheelAction: 'scroll', //鼠标滚动行为(还能够是zoom)
这个Zoom我以为比较好用,对于一个固定显示图片区域的相似应用,能够很是简单的作到固定滚动,包括两指放大的应用。
wheelAction 这个参数是给PC的鼠标滚动定义的,能够定义为滚动鼠标滚轮放大。ide
// 自定义 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 事件回调在结束滚动后执行一段你本身的代码
你也能够简单的新建一个能够经过双触放大的固定滚动区域。
你也能够什么都不作,只是简单的约定碰到边界是否反弹,等等。3d
var myscroll = new iScroll('wrapper', { hScroll: false, //是否水平滚动 vScroll: true, //是否垂直滚动 y: 10, //滚动垂直初始位置 bounce : false });
固然,在使用时,若是对建立的iscroll 实例保存引用会有不少好处:
你能够在内容改变时,DOM结构发生改变时调用 myscroll.refresh() 来从新计算固定滚动区域的内容高度,从而使得你的iscroll工做正常。
你也能够在你的应用结束时,用过这个引用调用destroy方法来,销毁这个iscroll 实例
等等....
固然,iscroll提供的Api也是很是丰富,因此咱们能够经过使用iscroll来作不少webapp的应用。code