概述:

大家在日常工作中最常用的插件是什么,jQurey?Lazyload?但是这些都是在PC端,但是在移动端最常用的插件莫过于iScroll了,iScroll到底是什么东西,应该怎么用?iScroll是个很强大的插件,我也只是略懂皮毛,这里我们简单的介绍一下。

iScroll的产生:

iScroll的产生完全是因为移动版webkit浏览器,例如在iPhone,Android 的移动设备上。

iScroll的使用方法:

iScroll的原理是外层有一个溢出隐藏(overflow:hidden;)的DOM,然后这个区域内的第一个DOM结构会被实例化,其包裹的内容可以纵向或者横向的滚动,所以在使用iScroll的时候,滚动元素要尽量的简单,减少DOM个数,减少嵌套,因为DOM结构越是复杂iScroll运行起来就越是吃力,有可能会造成某些节点显示不正常的情况。 所以,推荐使用的DOM结构如下:

1
2
3
4
5
6
7
8
9
<div id="wrapper">//overflow:hidden;
    <ul>
    //只有第一个DOM结构(ul)被实例化,这个DOM可以纵向或者横向的滚动,
    //多出的内容会被wrapper的样式hidden。
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</div>
注意:再次重申,只有wrapper里的第一个子元素(ul)才可以被实例化滚动,并且要结合外层的DOM(wrapper)才能实现滚动。
如果 wrapper中有多个ul怎么办?很简单,记住那句话,只有wrapper里的第一个子元素(ul)才可以被实例化滚动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div id="wrapper">//overflow:hidden;
    <div id="first">
        //只有第一个DOM结构(ul)被实例化,这个DOM可以纵向或者横向的滚动,
        //多出的内容会被wrapper的样式hidden
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <ul>
            <li>4</li>
            <li>5</li>
            <li>6</li>
        </ul>
    </div>
</div>

看到了吧,只有first会被实例化。 注意:这里第一个DOM结构的ID(first)可以不写,我只是为了方便大家识别才写了个ID,但是最外层的ID(wrapper)一定要写,因为在JS实例化的时候需要填写这个ID:

1
var myScroll = new iScroll("wrapper");

iScroll应该如何实例化:

既然说道了实例化,我们应该在什么时候实例化?据说实例化的方法有很多,但是我没用过,我只说一种:
(1)在HTML(uw3c.html)页面底部(body之后html之前)加载iscroll.js与当前页面的uw3c.js,这样能确保HTML的DOM结构能加载出来。
(2)在JS插入页面DOM结构和数据之前实例化iScroll,也就是在JS的最开始实例化,因为之后可能会使用JS来插入DOM或者数据,这样以来能确保在插入数据之前iScroll已经实例化了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HTML://HTML结构
<html >
    <body>
     ...code...
    </body>
     //插入iscroll.js文件
   <script type="text/javascript" src="js/iscroll.js" > </script >
    //插入本页面JS文件
  <script type="text/javascript" src="js/uw3c.js" > </script >
</html>
 JS://JS文件内容
 var myscroll;
 function iscroll(data){
      //实例化iScroll
     myscroll=new iScroll("wrapper");
     pageData(data);
 }
 function pageData(obj){
     $("body").html(obj);
     myscroll.refresh();//当DOM结构发生变化的时候,需要刷新iScroll
 }
 iscroll("<div>pagedata</div>");

iScroll中的参数:

在实例化iScroll的时候,可以传入两个参数,第一个参数是实例化的外层的DOM的ID,第二个参数是iScroll执行方法的对象:

1
var myscroll=new iScroll("wrapper",{hScrollbar:false});

或者

1
2
3
4
5
6
var opts = {
                vScroll:false,//禁止垂直滚动
                snap:true,//执行传送带效果
                hScrollbar:false//隐藏水平方向上的滚动条
            };
var myscroll = new iScroll("wrapper",opts);
第二个参数内容如下,这个参数会控制iScroll的效果:
1
2
3
4
5
6
7
8
9
10
11
hScroll        false 禁止横向滚动 true横向滚动 默认为true
vScroll        false 禁止垂直滚动 true垂直滚动 默认为true
hScrollbar     false隐藏水平方向上的滚动条
vScrollbar     false 隐藏垂直方向上的滚动条
fadeScrollbar  false 指定在无渐隐效果时隐藏滚动条
hideScrollbar  在没有用户交互时隐藏滚动条 默认为true
bounce         启用或禁用边界的反弹,默认为true
momentum       启用或禁用惯性,默认为true
               此参数在你想要保存资源的时候非常有用
lockDirection  false取消拖动方向的锁定,
               true拖动只能在一个方向上(up/down 或者left/right)

iScroll中的方法:

当然在第二个参数中,也有一些方法可以执行:
(1)scrollTo(x, y, time, relative)方法:传入4个参数:X轴滚动距离,Y轴滚动距离,效果时间,是否相对当前位置。所以例如:
1
2
3
4
//在200毫秒的时间内,Y轴向上滚动100像素;
uw3c.scrollTo(0, -100, 200)
//在200毫秒的时间内,相对于当前位置,X轴向左滚动100像素;
uw3c.scrollTo(-100, 0, 200, true)
(2)refresh()方法:在DOM结构发生改变之后,需要刷新iScroll,否则滚动插件会实例化的不准确:
1
uw3c.refresh();//刷新iScroll
(3)onPosChange,有没有一个方法能返回位置的变化?你可以查询一下自己所用的iScroll中有没有onPosChange方法:
1
2
3
4
5
6
7
8
onPosChange:function(x,y){
    if(y < -200){
     //如果Y周向上滚动200像素,$("#uw3c")就显示,否则就隐藏。
        $("#uw3c").show();
    }else{
        $("#uw3c").hide();
    }
}
(4)onScrollEnd:滚动结束时执行的事件,如果想在滚动结束时出发摸个事件,这个方法就拍上用处了:
1
2
3
4
//滚动结束后,执行的方法,滚动后会出现提示框alert("uw3c.com")
onScrollEnd:function(){
    alert("uw3c.com");
}
(5)onRefresh:在DOM结构发生改变之后,需要刷新iScroll,否则滚动插件会实例化的不准确,onRefresh是刷新完iScroll会执行的方法。
(6)onBeforeScrollStart:开始滚动前的时间回调,默认是阻止浏览器默认行为 。
(7)onScrollStart:开始滚动的回调。
(8)onBeforeScrollMove:在内容移动前的回调。
(9)onScrollMove:内容移动的回调。
(10)onBeforeScrollEnd:在滚动结束前的回调。
(11)onTouchEnd:手离开屏幕后的回调。
(12)onDestroy:销毁实例的回调。

截至到笔者发布这篇文章时,通过样式:

  1. overflow:scroll;
  2. -webkit-overflow-scrolling:touch;

IOS5 已经能够支持区域滚动了。但是andriod4 还是不行...

iScroll 使用起来很简单,首先你需要一个合理的DOM结构:

  1. <div id="wrapper">
  2. <ul id="scroll">
  3. <li></li>
  4. ...
  5. ...
  6. </ul>
  7. </div>

其次是推荐的样式:

  1. #wrapper {
  2. position:relative;
  3. z-index:1;
  4. width:/* your desired width, auto and 100% are fine */;
  5. height:/* element height */;
  6. overflow:/* hidden|auto|scroll */;
  7. }

官方推荐这样的结构,因为iscroll只能滚动wrapper里的第一个子节点,或者说唯一一个子节点才能使得iscroll正确的生效。因为这个节点需要一个绝对定位的CSS属性,更重要的是这个节点里所包裹的内容有了一个统一的容器,我们只需要计算之后修改这个容器的属性值就可以达到我们滚动的效果。

iscroll 需要两个参数,第一个很简单就是外容器的id,第二个参数是一个参数对象。 
通过这个对象可以传入iscroll的各项参数来配置iscroll。 
他的参数基本分为四个部分

  • 基础
  • 滚动条
  • 放大缩小
  • 事件回调

以下由笔者整理的iScroll参数以及其代表的意思:

  1. hScroll: true, //是否水平滚动
  2. vScroll: true, //是否垂直滚动
  3. x: 0, //滚动水平初始位置
  4. y: 0, //滚动垂直初始位置
  5. bounce: true, //是否超过实际位置反弹
  6. bounceLock: false, //当内容少于滚动是否可以反弹,这个实际用处不大
  7. momentum: true, //动量效果,拖动惯性
  8. lockDirection: true,
  9. //当水平滚动和垂直滚动同时生效时,当拖动开始是否锁定另一边的拖动
  10. useTransform: true, //是否使用CSS形变
  11. useTransition: false, //是否使用CSS变换
  12. topOffset: 0, //已经滚动的基准值(一般情况用不到)
  13. checkDOMChanges: false, //是否自动检测内容变化

checkDOMChanges 这个不是十分靠得住,因为他目前是轮询检测offsetWidth、offsetHeight,然后才去调自身的refresh 重新计算滚动区域,但是有时候只检测这个不是很准..

  1. // Scrollbar 的相关参数
  2. hScrollbar: true, //是否显示水平滚动条
  3. vScrollbar: true, //同上垂直滚动条
  4. fixedScrollbar: isAndroid, //对andriod的fixed
  5. hideScrollbar: isIDevice,  //是否隐藏滚动条
  6. fadeScrollbar: isIDevice && has3d, //滚动条是否渐隐渐显
  7. scrollbarClass: '', //字定义滚动条的样式名

通过scrollbar这些参数可以配置iscroll的滚动条,通过scrollbarClass可以自己定义一套滚动条的样式。

  1. // Zoom 放大相关的参数
  2. zoom: false, //默认是否放大
  3. zoomMin: 1, //放大的最小倍数
  4. zoomMax: 4, //最大倍数
  5. doubleTapZoom: 2, //双触放大几倍
  6. wheelAction: 'scroll', //鼠标滚动行为(还可以是zoom)

这个Zoom我觉得比较好用,对于一个固定显示图片区域的类似应用,可以非常简单的做到固定滚动,包括两指放大的应用。 
wheelAction 这个参数是给PC的鼠标滚动定义的,可以定义为滚动鼠标滚轮放大。

  1. // 自定义 Events 的相关参数
  2. onRefresh: null, //refresh 的回调,关于自身何时调用refresh 后面会继续谈到
  3. onBeforeScrollStart: function (e) { e.preventDefault(); },
  4. //开始滚动前的时间回调,默认是阻止浏览器默认行为
  5. onScrollStart: null, //开始滚动的回调
  6. onBeforeScrollMove: null, //在内容移动前的回调
  7. onScrollMove: null, //内容移动的回调
  8. onBeforeScrollEnd: null, 在滚动结束前的回调
  9. onScrollEnd: null, //在滚动完成后的回调
  10. onTouchEnd: null, //手离开屏幕后的回调
  11. onDestroy: null, //销毁实例的回调
  12. onZoomStart: null,
  13. onZoom: null,
  14. onZoomEnd: null

通过了解以上参数,你可以非常容易的配置自己的iscroll 应用: 
你可以通过onScrollEnd 事件回调在结束滚动后执行一段你自己的代码 
你也可以简单的新建一个可以通过双触放大的固定滚动区域。 
你也可以什么都不做,只是简单的约定碰到边界是否反弹,等等。

  1. var myscroll = new iScroll('wrapper', {
  2. hScroll: false, //是否水平滚动
  3. vScroll: true, //是否垂直滚动
  4. y: 10, //滚动垂直初始位置
  5. bounce : false
  6. });

当然,在使用时,如果对创建的iscroll 实例保存引用会有很多好处: 
你可以在内容改变时,DOM结构发生改变时调用 myscroll.refresh() 来重新计算固定滚动区域的内容高度,从而使得你的iscroll工作正常。 
你也可以在你的应用结束时,用过这个引用调用destroy方法来,销毁这个iscroll 实例 
等等.... 
当然,iscroll提供的Api也是非常丰富,所以我们可以通过使用iscroll来做很多webapp的应用,下一篇文章我将会主要介绍一下iscroll的公用调用方法,以及参数的控制。

参考:
http://www.uw3c.com/jsviews/js02.html
http://cshbbrain.iteye.com/blog/1825976

iscroll手册的更多相关文章

  1. 学习 | iscroll之上拉加载下拉刷新

    引入文件顺序 1.zepto 2.iscroll.js 3.scroll-probe.js 链接 完整代码:https://github.com/dirkhe1051931999/writeBlog/ ...

  2. FREERTOS 手册阅读笔记

    郑重声明,版权所有! 转载需说明. FREERTOS堆栈大小的单位是word,不是byte. 根据处理器架构优化系统的任务优先级不能超过32,If the architecture optimized ...

  3. JS魔法堂:不完全国际化&本地化手册 之 理論篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  4. 转职成为TypeScript程序员的参考手册

    写在前面 作者并没有任何可以作为背书的履历来证明自己写作这份手册的分量. 其内容大都来自于TypeScript官方资料或者搜索引擎获得,期间掺杂少量作者的私见,并会标明. 大部分内容来自于http:/ ...

  5. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  6. JS魔法堂:不完全国际化&本地化手册 之 实战篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  7. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  8. linux命令在线手册

    下面几个网址有一些 Linux命令的在线手册,而且还是中文的,还可以搜索.非常方便 Linux命令手册 Linux命令大全 Linux中文man在线手册 每日一linux命令

  9. 【IScroll深入学习】解决IScroll疑难杂症

    前言 在去年,我们对IScroll的源码进行了学习,并且分离出了一段代码自己使用,在使用学习过程中发现几个致命问题: ① 光标移位 ② 文本框找不到(先让文本框获取焦点,再滑动一下,输入文字便可重现) ...

随机推荐

  1. 高性能mysql:创建高性能的索引

    本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表 ...

  2. SQL注入点的类型

    1.数字型注入点 形如“http://****?ID=55”,这类注入的参数是“数字”,因此称为“数字型注入点”. 此类注入点提交的SQL语句,其原形大致为:Select * from 表名 wher ...

  3. 关于端口冲突的解决方式Error: listen EACCES 0.0.0.80

    笔者昨天下午临走前安装了vs 2017想要运行一下项目的NET后端来让本机的前端直接对接后端,但是没注意到运行vs后IIS直接占用了本机的80端口.第二天跑nodeJS的时候直接Error: list ...

  4. #leetcode刷题之路10-正则表达式匹配

    匹配应该覆盖整个字符串 (s) ,而不是部分字符串.说明:s 可能为空,且只包含从 a-z 的小写字母.p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *. 示例 1:输入:s = & ...

  5. 利用tornado使请求实现异步非阻塞

    基本IO模型 网上搜了很多关于同步异步,阻塞非阻塞的说法,理解还是不能很透彻,有必要买书看下. 参考:使用异步 I/O 大大提高应用程序的性能 怎样理解阻塞非阻塞与同步异步的区别? 同步和异步:主要关 ...

  6. Vue中异步组件(结合webpack,转载)

    转载,原文出处:https://www.jianshu.com/p/40a364b5e964 1.什么是异步组件? 异步组件就是定义的时候什么都不做,只在组件需要渲染(组件第一次显示)的时候进行加载渲 ...

  7. Flask之蓝图的使用

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...

  8. php http_build_query stream_context_create post请求

    <?php function send_post($url, $post_data) { $postdata = http_build_query($post_data); $options = ...

  9. opencv3 学习三 - 图像输入输出显示等

    程序如下 #include "opencv2/opencv.hpp" using namespace cv; int main() { Mat file1 = imread(&qu ...

  10. python学习笔记:第5天 基本数据类型之字典

    目录 字典的介绍 补充 字典的介绍 字典(dict)是python中唯一的一个映射的数据类型,它是以一对一对的键值对的形式组成的一个容器,在python中字典也是可变的,我们也可以在字典中存放各种类型 ...