现在大家应该都看到过焦点图轮播的效果,这个效果是什么样我就不截图了。昨天做练习,练习要求是使用iscroll实现焦点图的无限循环滚动,并且当手指触摸焦点图后,停止焦点图的循环滚动。第一次接触iscroll,仿照iscroll官方文档的demo,迅速做了一个焦点图自动滚动的例子,但……是……问题来了,iscroll的官方文档中没有说怎么实现无限循环,不会吧,应该有吧,我抱着怀疑的心态,找啊找,官方文章找了好几个版本,每个版本都看了1、2遍,没有……真的没有……啊,那怎么办……。看来只能自己想了,可是过好久都没头绪,连iscroll怎么用都不熟。等等,网上大神那么多,肯定有人做过的,借鉴借鉴,搜,度娘给了好多东西,真的好多东东,可………是……,点开了没一个是我需要的,博客园 csdn也找了,结果都没找到。

  沮丧,失望,还是靠自己吧,昨天鼓捣了2、3个钟,想到在焦点图的父类中循环插入节点的方法然后不断改变容器的宽度,试了下没有成功;后来又想到可以不断改变焦点图的margin结果也没成功。昨天还想起了其他办法,当然结果都一样,如果昨天成功了,就不会有今天这博客了(懒)。这个程序没有考虑兼容不同的屏幕尺寸,需要兼容你们自己调。

  1、首先说html结构,结构很简单。 wrapper里放的就是焦点图内容。重点是焦点图最后一则跟第一则使用的图片是一样的 jdt1.jpg,这点很重要,因为要保证焦点图平滑的始终向一个方向,两个图片必须相同,后面看到js你就会明白原因,我这里选择的是左方滚动。 看图片链接你们应该能猜到我是那个公司的人了吧,嘘!!!

    <div id="wrapper">
<div id="scroller">
<ul id="scrollUl">
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt1.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt2.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt3.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt4.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt5.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt1.jpg"></li>
</ul>
</div>
</div>
<div id="footer"></div>

  2、css样式,css是参考官网demo的样式里面有很多样式值得学习,尤其是带前缀的样式,我一直是做pc的,这些样式我还是第一次接触。值得说明的一点是,要使用iscroll的元素其position必须为absolute。在这个例子中#scroller的position必须为absolute。 另外一定需要说明的是我这边的图片大小是350x200,焦点图一共6则(最后一则是假的纯粹是为了做自动滚动效果加的),所以#scroller的宽度为2100px。 #scroller的宽度一旦设置之后,iscroll就会按照这个宽度去展示你的焦点图,即使你后边用程序修改#scroller的宽度,比如你又添加了一个li标签,并且修改了#scroller的宽度为2450px,但是iscroll依旧只显示2100px的宽度,超过的部分就会被弹回,除非你调用refersh()方法刷新iscroll

      *{
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
html{
-ms-touch-action:none;
}
body{
padding:0;
margin:0;
}
#header{
width:100%;
height:40px;
background:#cd235c;
text-align:center;
position:absolute;
top:0px;
left:0px;
z-index:2;
line-height:40px;
font-weight:bold;
color:#eee;
}
#wrapper{
position:absolute;
top:40px;
left:0px;
bottom:48px;
background:#ccc;
border-top:1px solid;
z-index:1;
width:100%; overflow:hidden;
}
#scroller{
position:absolute;
width:2100px;
height:100%;
top:0;
left:0;
-webkit-tap-hightlight-color:ragb(0,0,0,0);
-webkit-transform:translateZ(0);
-moz-transform:translateZ(0);
-ms-transform:translateZ(0);
-o-transform:translateZ(0);
transform:translateZ(0);
-webkit-touch-callout:none;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
-o-user-select:none;
user-select:none;
-webkit-text-size-adjust:none;
-moz-text-size-adjust:none;
-ms-text-size-adjust:none;
-o-text-size-adjust:none;
text-size-adjust:none; }
#wrapper ul{
list-style-type:none;
margin:0px;
padding:0px;
width:100%;
height:100%; }
#wrapper li{
width:350px;
height:100%;
float:left;
}
#footer{
width:100%;
height:48px;
background:#444;
position:absolute;
bottom:0px;
left:0px;
z-index:2;
}
img{
width:350px;
}

  3.重点来了,js代码,其实js代码很少,但是有些地方需要灵活运用,我使用的是原生js。  

  3.1 初始化iscroll,允许水平滚动,不允许垂直滚动,鼠标滚轮滚动的时候焦点图滑动

var myScroll = new IScroll("#wrapper",{scrollX:true,scrollY:false,mouseWheel:true});

3.2 焦点图自动滚动的函数。

  在初始化的变量中curLeft 为焦点图向左滚动的时候的滚动偏移量。使用循环定时器调用iscroll的scrollTo方法每隔一秒移动一个焦点图,因为图片宽度为350,所以每一秒curLeft的增量是-350,当curLeft为-1750的时候,焦点图滚动到最后一则,重点来了,当焦点图到达最后一则时我们使用setTimeout来偷梁换柱,因为焦点图是每隔1000ms切换一张图片的,切换图片用时200ms 剩下的800ms,就给了我们可乘之机。利用200ms-1000ms这段时间,我这里选择的是500ms,我们重新初始化所有的东东,curLeft设置为0;销毁原来的iscroll对象(myScroll),重新生成一个iscroll对象;代码如下:

var curLeft=0,timeInterH,timeoutH;
timeInterH=setInterval(function(){
curLeft-=350;
if(curLeft==-1750){
timeoutH=setTimeout(function(){
curLeft=0;
myScroll.destroy();
myScroll=new IScroll("#wrapper",{scrollX:true,scrollY:false,mouseWheel:true});
},500)
}
myScroll.scrollTo(curLeft,0,200);
},1000)

  3.3 当手指触摸到焦点图的时候,清空定时器停止焦点图自动滚动,因为现在焦点图第一张图片跟最后一张图片是相同的,为了避免用户翻看焦点图的时候看到两张相同的图片。我们需要隐藏掉最后一张图片。这里是把#scroller的宽度设置成5张图片的宽度,1750px,这样网友就看不到最后一张图片了,重点是这里需要refresh一下iscroll,否则即使你改了宽度也不生效

  

var find=function(id){return document.getElementById(id)}
var sUl=find("scrollUl");
sUl.addEventListener("touchstart",function(){
find("scroller").style.width="1750px";
myScroll.refresh();
clearInterval(timeInterH);
clearTimeout(timeoutH);
},false)   

  完整的js代码如下:

var myScroll = new IScroll("#wrapper",{scrollX:true,scrollY:false,mouseWheel:true});
var curLeft=0,timeInterH,timeoutH;
timeInterH=setInterval(function(){
curLeft-=350;
if(curLeft==-1750){
timeoutH=setTimeout(function(){
curLeft=0;
myScroll.destroy();
myScroll=new IScroll("#wrapper",{scrollX:true,scrollY:false,mouseWheel:true});
},500)
}
myScroll.scrollTo(curLeft,0,200);
},1000)
var find=function(id){return document.getElementById(id)}
var sUl=find("scrollUl");
sUl.addEventListener("touchstart",function(){
find("scroller").style.width="1750px";
myScroll.refresh();
clearInterval(timeInterH);
clearTimeout(timeoutH);
},false)
//禁止touchmove事件,作用应该是避免在焦点图上手指移动的时候,造成不必要的bug
document.addEventListener("touchmove",function(e){e.preventDefault()},false);

  整个程序的完整代码如下:  

<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
<script src="http://www1.pcauto.com.cn/test/test/pcauto150811/iscroll.js"></script>
<style>
*{
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
html{
-ms-touch-action:none;
}
body{
padding:0;
margin:0;
}
#header{
width:100%;
height:40px;
background:#cd235c;
text-align:center;
position:absolute;
top:0px;
left:0px;
z-index:2;
line-height:40px;
font-weight:bold;
color:#eee;
}
#wrapper{
position:absolute;
top:40px;
left:0px;
bottom:48px;
background:#ccc;
border-top:1px solid;
z-index:1;
width:100%; overflow:hidden;
}
#scroller{
position:absolute;
width:2100px;
height:100%;
top:0;
left:0;
-webkit-tap-hightlight-color:ragb(0,0,0,0);
-webkit-transform:translateZ(0);
-moz-transform:translateZ(0);
-ms-transform:translateZ(0);
-o-transform:translateZ(0);
transform:translateZ(0);
-webkit-touch-callout:none;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
-o-user-select:none;
user-select:none;
-webkit-text-size-adjust:none;
-moz-text-size-adjust:none;
-ms-text-size-adjust:none;
-o-text-size-adjust:none;
text-size-adjust:none; }
#wrapper ul{
list-style-type:none;
margin:0px;
padding:0px;
width:100%;
height:100%; }
#wrapper li{
width:350px;
height:100%;
float:left;
}
#footer{
width:100%;
height:48px;
background:#444;
position:absolute;
bottom:0px;
left:0px;
z-index:2;
}
img{
width:350px;
}
</style>
</head>
<body>
<div id="header">我是焦点图</div>
<div id="wrapper">
<div id="scroller">
<ul id="scrollUl">
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt1.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt2.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt3.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt4.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt5.jpg"></li>
<li><img src="http://www1.pcauto.com.cn/test/test/pcauto150813/jdt1.jpg"></li>
</ul>
</div>
</div>
<div id="footer"></div>
<script>
var myScroll = new IScroll("#wrapper",{scrollX:true,scrollY:false,mouseWheel:true});
var curLeft=0,timeInterH,timeoutH;
timeInterH=setInterval(function(){
curLeft-=350;
if(curLeft==-1750){
timeoutH=setTimeout(function(){
curLeft=0;
myScroll.destroy();
myScroll=new IScroll("#wrapper",{scrollX:true,scrollY:false,mouseWheel:true});
},500)
}
myScroll.scrollTo(curLeft,0,200);
},1000)
var find=function(id){return document.getElementById(id)}
var sUl=find("scrollUl");
sUl.addEventListener("touchstart",function(){
find("scroller").style.width="1750px";
myScroll.refresh();
clearInterval(timeInterH);
clearTimeout(timeoutH);
},false)
//禁止touchmove事件,避免在焦点图上手指移动的时候,造成不必要的bug
document.addEventListener("touchmove",function(e){e.preventDefault()},false);
</script>
</body>
</html>

  总结:其实这个如果焦点图轮播的功能,如果不用iscroll,直接用原生js应该更加简单,iscroll应该有更强的的用处吧,慢慢感受。现在越来越体会到算法在程序中的重要性,看完两本大作《JavaScript高级程序设计》和《JavaScript权威指南》JavaScript的基础知识点差不多就见过了,未来重要的就是灵活运用,利用各种各样的思想去组织自己粗糙的程序,路漫漫其修远兮,吾将上下而求索。多学习多努力吧,会有结果的。

  ps:上面我说的东东,也许大神们都已经做过而没有出来分享,或者大神们以为是雕虫小技而不屑于顾,但是对我这小虾米来说,每一点进步都很重要,哈哈。

原文http://www.cnblogs.com/gg1234/p/4726954.html

使用 iscroll 实现焦点图无限循环的更多相关文章

  1. [android] 轮播图-无限循环

    实现无限循环 在getCount()方法中,返回一个很大的值,Integer.MAX_VALUE 在instantiateItem()方法中,获取当前View的索引时,进行取于操作,传递进来的int ...

  2. jquery的焦点图片无限循环关键思维

    在循环的时候,关键的是按(下一页按钮)到最后一页的时候和按(上一页按钮)到到第一页的时候如何转换: 首先必须知道3个js方法,prepend().append()和clone(); prepend() ...

  3. SuperIndicator 专做轮播图库,没有之一,支持轮播图无限循环

    github地址:https://github.com/hejunlin2013/SuperIndicator SuperIndicator a superindicatorlibray for vi ...

  4. 自定义完美的ViewPager 真正无限循环的轮播图

    网上80%的思路关于Android轮播图无限循环都是不正确的,不是真正意义上的无限循环, 其思路大多是将ViewPager的getCount方法返回值设置为Integer.MAX_VALUE, 然后呢 ...

  5. swiper轮播图(逆向自动切换类似于无限循环)

    swiper插件轮播图,默认的轮播循序是会从右向左,第一张,第二张,第三张,然后肉眼可见是的从第三张从左到右倒回第一张,这样就会有些视觉体验不高, ,不过还是能够用swiper本身的特性更改成无限循环 ...

  6. JS实现焦点图轮播效果

    大家平时逛淘宝网的时候,在首页就能看到焦点图轮播的效果,就是这个样子的: PS:想起每每打开淘宝,总会被这个玩意先夺眼球,偶尔还去点进去溜溜,幸好我定力好,总能控制住自己的购买欲望,为自己不用剁手感到 ...

  7. JavaScript基础 -- 焦点图轮播(转载)

    首先将HTML结构搭建好: <div id="container"> <div id="list" style="left: -60 ...

  8. 一行代码引入 ViewPager 无限循环 + 页码显示

    (出处:http://www.cnblogs.com/linguanh) 前序: 网上的这类 ViewPager 很多,但是很多都不够好,体现在 bug多.对少页面不支持,例如1~2张图片.功能整合不 ...

  9. iOS开发系列--无限循环的图片浏览器

    --UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件 ...

随机推荐

  1. 快速开发框架CRL3.0发布,附带最新的项目示例CRLShoppingDemo

    继上次使用CRL实现大数据分库分表方案升级到2.4,时隔不久又升级到了大版本号3.0,主要是因为结构发生了一些更改 ORM和业务封装Package分开了,增加了实例项目演示代码CRLShoppingD ...

  2. 父页面操作iframe子页面的安全漏洞及跨域限制问题

    一.父子交互的跨域限制 同域情况下,父页面和子页面可以通过iframe.contentDocument或者parent.document来交互(彼此做DOM操作等,如父页面往子页面注入css). 跨域 ...

  3. Linux A机器免密码SSH登录B机器

    一.问题 如上,A机器经常需远程操作B机器,传输文件到B机器,每次输入帐号密码过于繁琐,下文通过ssh公钥能解免密码操作问题. 二.解决 1.方案 SSH认证采用公钥与私钥认证方式. 2.步骤 1) ...

  4. vertical-align浅析

    一直以来都搞不懂vertical-align,它适用于什么元素,它的对齐规则是什么样的.索性查了下w3c相关规范,发现行高和基线对齐的规范说明里有如下内容: This section is being ...

  5. arcengine中自定义工具和自带工具条(ICommand)点击后和其他工具使用的冲突

    自己系统中本身对于放大缩小等功能直接是单独重写的,但是如果在加一个工具条具有相同功能的话两者之间会有一些冲突,为解决该冲突可以重写工具条的OnItemClick事件 该工具条命名为axTool 我本身 ...

  6. php N 维数组的读取、设置、删除

    <?php // 例子 $rowList = array(); $rowList[] = array('A'=>'A_1','B'=>'A_1_1','C'=>'A_1_1_1 ...

  7. 随便记录下系列 - node->express

    随便记录下系列 - node->express 文章用啥写?VsCode. 代码用啥写?VsCode. 编辑器下载:VsCode 一.windows下安装node.js环境: 下载地址 相比以前 ...

  8. LinqToXml (一) Create Xml file By Dom /Linq

    目前,在xml 应用编程领域比较流行的开发模型是W3C 提供的DOM(文档对象模型),在.net Framework 通过命名空间 System.Xml 对该技术提供了支持.随着Linq to XMl ...

  9. 4.5 .net core下直接执行SQL语句并生成DataTable

    .net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs& ...

  10. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...