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 相关文章推荐
onbeforeunload与onunload事件异同点总结
Jun 24 Javascript
javascript+html5实现仿flash滚动播放图片的方法
Apr 27 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
Jquery根据浏览器窗口改变调整大小的方法
Feb 07 Javascript
shiro授权的实现原理
Sep 21 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
JavaScript事件对象event用法分析
Jul 27 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
vue 项目地址去掉 #的方法
Oct 20 Javascript
小程序实现长按保存图片的方法
Dec 31 Javascript
搭建vscode+vue环境的详细教程
Aug 31 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
Nov 05 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
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
Python实现获取某天是某个月中的第几周
2015/02/11 Python
Python2.x与Python3.x的区别
2016/01/14 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
Python流程控制 while循环实现解析
2019/09/02 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
电子狗项圈:eDog Australia
2019/12/04 全球购物
运动会广播稿300字
2014/01/10 职场文书
先进集体获奖感言
2014/02/13 职场文书
开工仪式策划方案
2014/05/23 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
签证工作证明模板
2015/06/15 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书