iScroll.js 使用方法参考


Posted in Javascript onMay 16, 2016

概要

iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生完全是因为移动版webkit浏览器(诸如iPhone,iPad,Android 这些系统上广泛使用)
提供了一种本地化的方式来对一个限定了高度和宽度的元素的内容进行滑动。很不幸的是,这种情况下所有的web应用的页面就不能够包含具有position:absolute的头、页尾或者是一个内容可滚动的
中间区域。

然而,Android系统最新修订版已经可以支持这种功能了(尽管支持的力度还不是特别好),Apple公司似乎不太情愿将one-finger滑动事件运用到div元素上。
除了以前版本的iScroll的特性以外,iScroll 4还包括如下的特性:

     (1)缩放(Pinch/Zoom)
    (2)拉动刷新(Pull up/down to refresh)
    (3)速度和性能提升
    (4)精确捕捉元素
    (5)自定义滚动条
      友情提示:iScroll 4并不是iScroll 3的简易替代版本,API文档已经不一样了。同时考虑到此版本正处于测试期,一些API可能会有细微的变化。

使用指南

在此文档中你会发现很多例子来教会你如何快速上手iScroll脚本库。参看文中的demo小例子并仔细阅读此文档,可能有点小无聊,但是这篇文章中却是iScroll这个脚本库的精髓之所在哦。
iScroll需要对所要进行滚动的元素进行初始化,并且不限定一个页面中使用iScroll的元素的个数(这里不考虑您的硬件配置)。滚动元素中内容的类型和长度在一定程度上将会影响iScroll脚本库里
可以同时使用的元素的个数。
使用iScroll这个脚本库时,DOM树的结构要足够简单,移除不必要的标签,尽量避免过多的标签嵌套使用。
最优的使用iScroll的结构如下所示:

<div id="wrapper">
    <ul>
        <li></li>
        .....
    </ul>
</div>

在这个小例子中,ul标签将会被滚动。iScroll一定要与滚动内容外面的wrapper进行联系才会产生效果。
【注意事项】:
只有wrapper里的第一个子元素才可以滚动,如果你想要更多的元素可以滚动,那么你可以试试下面的这种写法:

<div id="wrapper">
    <div id="scroller">
        <ul>
          <li></li>
           ...
        </ul>
        <ul>
           <li></li>
           ...
        </ul>
    </div>
</div>

在这个例子中,scroller这个元素可以滚动,即便它包含两个ul元素

iScroll必须在调用之前实例化,你可以在下面几种情况下对iScroll进行实例化:

(1)使用onDOMContentLoaded事件实现滚动

适用于滚动内容只包含文字、图片,并且所有的图片都有固定的尺寸

<script src="iscroll.js"></script>
    <script>
        var myscroll;
        function loaded(){
              myscroll=new iScroll("wrapper");
         }
        window.addEventListener("DOMContentLoaded",loaded,false);
     </script>

注意:myscroll这个变量是全局的,因此你可以在任何地方调用它

(2)使用onLoad事件实现滚动

因为DOMContentLoaded事件是载入DOM结构后就会被调用,所以在图片等元素未载入前可能无法确定滚动区域的长宽,此时可以使用onLoad事件来实现。

<script src="iscroll.js"><script>
    <script>
          var myscroll;
          function loaded(){
          setTimeout(function(){
              myscroll=new iScroll("wrapper");
           },100 );
        }
        window.addEventListener("load",loaded,false);
     </script>

这种情况下iScroll会在页面资源(包括图片)加载完毕100ms之后得到初始化,这应该是一种比较安全的调用iScroll的方式。

(3)inline初始化

这种情况会在页面加载到js的时候就进行调用,此方法不推荐使用,但是很多javascript的大牛都在用这种方式,我又有什么理由不赞成呢?

<script src="iscroll.js"></script>
          <div id="wrapper">
              <ul>
                <li></li>
                 ...
             </ul>
         </div>
    <script>
          var myscroll=new iScroll("wrapper");
    </script>

不过建议你使用一些框架的ready方法来安全调用iScroll(比如jquery里的ready())。

iScroll里传递的参数

iScroll里的第二个参数允许你自定义一些内容,比如下面的这段代码:

<script>
var myscroll=new iScroll("wrapper",{hScrollbar:false, vScrollbar:false});
</script>

第二个参数通常都是一个对象,像上面的这个例子里就设定了不显示滚动条。常用的参数如下:

               hScroll                 false 禁止横向滚动 true横向滚动 默认为true
               vScroll                 false 精致垂直滚动 true垂直滚动 默认为true
               hScrollbar            false隐藏水平方向上的滚动条
               vScrollbar            false 隐藏垂直方向上的滚动条
               fixedScrollbar      在iOS系统上,当元素拖动超出了scroller的边界时,滚动条会收缩,设置为true可以禁止滚动条超出
                                        scroller的可见区域。默认在Android上为true, iOS上为false
               fadeScrollbar     false 指定在无渐隐效果时隐藏滚动条
               hideScrollbar     在没有用户交互时隐藏滚动条 默认为true
               bounce             启用或禁用边界的反弹,默认为true
               momentum       启用或禁用惯性,默认为true,此参数在你想要保存资源的时候非常有用
               lockDirection       false取消拖动方向的锁定, true拖动只能在一个方向上(up/down 或者left/right)

各种效果的实现

滚动刷新

'Pull to refresh' demo

        自从Twitter和一些Apple的本地化应用出现了这个效果之后,这个效果就变得非常流行。你可以看看这儿先一睹为快。
       最新版中,作者把把"pull to refresh"这个部分单分出来作为iScroll的一个额外插件。你可以点击这儿看看pull to refresh是如何工作滴。你只需要做的就是自定义pullDownAction()这个方法。你可能需要一个ajax来加载新的内容,不过一旦DOM树发生了变化要记得调用refresh这个方法来。需要记住的是在例子中我们加了1秒的延迟来模拟网络的延迟效果。当然,如果你不想使用这个延迟,那就把setTimeout方法去掉就行了。

缩放(pinch / zoom)

'Pull to refresh' demo

        我们不得不面对一个事实,那就是光有滚动其实没什么新意的。这就是为什么在iScroll 4这个版本里我们允许你可以放
        大和缩小。想要这个功能,只需要设置放大的参数zoom 为true即可实现利用手势来放大和缩小。你可以看看这儿。
        双击放大和缩小的功能在iScroll 4里也是得到支持的。要使用缩放功能,你至少需要如下配置:              

 var myScroll =new iScroll("wrapper",{zoom:true});
       如果你想对缩放功能进行深度的自定义的话可以使用下面的一些选项:
               zoomMax   指定允许放大的最大倍数,默认为4
      【注意事项】:如果想要图片缩放的效果很好的话要把他们放到硬件的合成层中。通俗点说,就是在所有需要缩放的img元素上使用-webkit-transform:translate3d(0,0,0)来实现,而且尤为重要的是,硬件的加速会占用大量资源,要谨慎使用,否则你的应用可能就此崩溃。

捕捉元素(snap and snap to element)

'Carousel' demo

SNAP功能是判断元素是否滑动到指定位置。通过这个效果可以制作花哨的跑马灯效果。

插件会自动分析滚动区域内相同标签或相同大小的元素做为捕捉对象,也可以通过参数指定捕捉的对象    

var myscroll=new iScroll("wrapper",{
            snap:true,
            momentum:false,
            hScrollbar:false,
            vScrollbar: false
         });

可以通过设置snap参数为指定标签来设定捕捉对象。比如捕捉li标签。

var myscroll=new iScroll("wrapper",{
           snap:"li",
           momentum:false,
           hScrollbar:false,
           vScrollbar:false
        });

在这个例子中scroller可以捕捉到滚动区域中最左上角的li元素

自定义滚动条(custom scrollbars)
在iScroll 4这个版本中,可以利用一系列的css来自定义滚动条的呈现。可以给滚动条添加一个class参数,如下:

var myscroll=new iScroll("wrapper",{
scrollbarClass: "myScrollbar"
});

需要提醒的是,滚动条是由两个元素组合而成的:容器和显示器。容器同wrapper的高度相同,而显示器则代表的是滚动条本身。
滚动条的HTML结构如下:

<div class="myScrollbarV"><div></div></div>
.myscrollbarV{
position:absolute;z-index:100;width:8px;bottom:7px;top:2px;right:1px;
 }
.myScrollbarV > div {
position:absolute;
z-index:100;
width:100%;
 /* The following is probably what you want to customize */
background:-webkit-gradient(linear, 0 0, 100% 0, from(#f00), to(#900));
border:1px solid #800;
-webkit-background-clip:padding-box;
-webkit-box-sizing:border-box;
-webkit-border-radius:4px;
-webkit-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
 }

通用方法:

(1)refresh                          在DOM树发生变化时,应该调用此方法
eg: setTimeout(function () { myScroll.refresh(); }, 0);

(2)iScroll还提供了scrollTo, scrollToElement和scrollToPage三个方法让你能够通过javascript来控制滚动效果。

scrollTo(x, y, time, relative):在指定的time时间内让内容滚动条x/y的位置。如myScroll.scrollTo(0, -100, 200) 在200毫秒内Y轴向下滚动100像素。 myScroll.scrollTo(0, 10, 200, true)可以实现相对当前位置在200毫秒内Y轴向上滚动10像素的效果。

scrollToElement(element, time):在指定的时间内滚动到指定的元素。如myScroll.scrollToElement('li:nth-child(10)', 100) 在100毫秒内滚动到第10个li元素的位置。第1个参数可以用CSS3中的选择器来筛选元素。

snapToPage(pageX, pageY, time):在200毫秒内从第1页滚动到第2页(0代表第1页,1代表第2页)。这个使用SNAP功能的时候可以调用这个函数。

(3)detroy()                       完全消除myscroll及其占用的内存空间
 eg: myscroll.destroy();
 myScroll = null;

iScroll的发展方向

表单域的支持
缩放的优化
更好的桌面浏览器的兼容性
onScrol事件的优化
加个哈希值的变化
DOM改变后自动刷新

Javascript 相关文章推荐
Js 获取当前日期时间及其它操作实现代码
Mar 04 Javascript
将string解析为json的几种方式小结
Nov 11 Javascript
关于Mozilla浏览器不支持innerText的解决办法
Jan 01 Javascript
jquery 查找select ,并触发事件的实现代码
Mar 30 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
Jun 20 Javascript
提高JavaScript执行效率的23个实用技巧
Mar 01 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
vue中使用codemirror的实例详解
Nov 01 Javascript
微信小程序云开发 搭建一个管理小程序
May 17 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
Nov 11 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 Javascript
JS创建自定义对象的六种方法总结
Dec 15 Javascript
BootStrap的JS插件之轮播效果案例详解
May 16 #Javascript
老司机带你解读jQuery插件开发流程
May 16 #Javascript
jQuery 获取多选框的值及多选框中文的函数
May 16 #Javascript
jQuery插件制作的实例教程
May 16 #Javascript
总结jQuery插件开发中的一些要点
May 16 #Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
May 16 #Javascript
动态的9*9乘法表效果的实现代码
May 16 #Javascript
You might like
PHP自动更新新闻DIY
2006/10/09 PHP
关于svn冲突的解决方法
2013/06/21 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
javascript之AJAX框架使用说明
2010/04/24 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
js断点调试心得分享(必看篇)
2017/12/08 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
利用Python开发实现简单的记事本
2016/11/15 Python
Python实现简易Web爬虫详解
2018/01/03 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
python如何删除文件中重复的字段
2019/07/16 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
食品安全宣传标语
2014/06/07 职场文书
自查自纠工作总结
2014/10/15 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书