原生javascript实现无间缝滚动示例


Posted in Javascript onJanuary 28, 2014

目前支持的是竖向与横向滚动

http://lgyweb.com/marScroll/

现在分析下无间缝实现的基本思路(竖向例子):

HTML结构:

<div id="marScroll"> 
<ul> 
<li>01</li> 
<li>02</li> 
<li>03</li> 
<li>04</li> 
<li>05</li> 
</ul> 
</div>

CSS:
<style type="text/css"> 
ul,li{padding: 0;margin: 0;} 
#marScroll{height: 60px;overflow: hidden;} 
#marScroll li{height: 20px;line-height: 20px;font-size: 14px;} 
</style>

(1)首先需要判断里面的内容高度ul结构是否高于外层div#marScrolll,则才进行无间缝滚动:
// 写在匿名函数里面,防止全局变量污染 
(function(){ 
var target = document.getElementById('marScroll'), 
oUl = target.getElementsByTagName('ul')[0]; 
// 内容少,则直接退出此函数 
if(oUl.offsetHeight<target.offsetHeight) return; 
})();

(2)无间缝就是内容的无限滚动展示,那么先需要复制里面的内容,然后通过外层的scrollTop++属性,用setInterval 函数进行循环执行
target.innerHTML += target.innerHTML; 
/* 判断每次滚动的距离等于第一个ul的高度时,设置scrollTop为0,然后如此的循环操作就是无间滚动了 
---------------------------------------------------------------------------------------------*/ 
// 把功能函数抽离出来,方便调用 
var fn = function(){ 
if(target.scrollTop == oUl_h){ 
target.scrollTop = 0; 
}else{ 
target.scrollTop++; 
} 
} 
// setInterval 循环 
var timer = setInterval(function(){ 
fn(); 
},30);

(3)鼠标经过此内容块时,就停止滚动
// hover 
target.onmouseover = function(){ 
clearTimeout(timer); 
} 
target.onmouseout = function(){ 
timer = setInterval(function(){ 
fn(); 
},30); 
}

例子JS总代码:
// 写在匿名函数里面,防止全局变量污染 
(function(){ 
var target = document.getElementById('marScroll'), 
oUl = target.getElementsByTagName('ul')[0], 
oUl_h = oUl.offsetHeight; 
// 内容少,则直接退出此函数 
if(oUl_h<target.offsetHeight) return; target.innerHTML += target.innerHTML; 
/* 判断每次滚动的距离等于第一个ul的高度时,设置scrollTop为0,然后如此的循环操作就是无间滚动了 
---------------------------------------------------------------------------------------------*/ 
// 把功能函数抽离出来,方便调用 
var fn = function(){ 
if(target.scrollTop == oUl_h){ 
target.scrollTop = 0; 
}else{ 
target.scrollTop++; 
} 
} 
// setInterval 循环 
var timer = setInterval(function(){ 
fn(); 
},30); 
// hover 
target.onmouseover = function(){ 
clearTimeout(timer); 
} 
target.onmouseout = function(){ 
timer = setInterval(function(){ 
fn(); 
},30); 
} 
})();

已经完成了个简单的竖向无间缝,为了满足更多的需求,建议封装成可以,竖向,横向,多次调用的函数。

以下是个人的封装,线上例子:

http://lgyweb.com/marScroll/

function GyMarquee(opt){ 
this.opt = opt; 
if(!document.getElementById(this.opt.targetID)) return; 
this.target = document.getElementById(this.opt.targetID); 
this.dir = this.opt.dir == 'crosswise'?'crosswise':'vertical'; 
this.effect = this.opt.effect == 'scroll'?'scroll':'marque'; 
this.scrollHeight = this.opt.scrollHeight; 
this.init(); 
} 
GyMarquee.prototype = { 
marquee:function(){ 
var _that = this, 
direction = 'scrollTop', 
judge = this.target.scrollHeight, 
timer = null; 
if(this.dir == 'crosswise'){ 
direction = 'scrollLeft'; 
judge = this.itemLen*this.opt.itemWidth; 
this.targetChild.style.width = this.itemLen*this.opt.itemWidth*2 + 'px'; 
} 
var doFn = function(){ 
if(_that.target[direction] == judge){ 
_that.target[direction] = 0; 
} 
_that.target[direction]++; 
} 
timer = setInterval(function(){ 
doFn(); 
},38); 
this.target.onmouseover = function(){ 
if(timer) clearTimeout(timer); 
} 
this.target.onmouseout = function(){ 
timer = setInterval(function(){ 
doFn(); 
},38); 
} 
}, 
scrollDo:function(){ 
var can = true, 
_that = this; 
this.target.onmouseover=function(){can=false}; 
this.target.onmouseout=function(){can=true}; 
new function (){ 
var stop=_that.target.scrollTop%_that.scrollHeight==0&&!can; 
if(!stop)_that.target.scrollTop==parseInt(_that.target.scrollHeight/2)?_that.target.scrollTop=0:_that.target.scrollTop++; 
setTimeout(arguments.callee,_that.target.scrollTop%_that.scrollHeight?20:2500); 
}; 
}, 
getByClassName:function(className,parent){ 
var elem = [], 
node = parent != undefined&&parent.nodeType==1?parent.getElementsByTagName('*'):document.getElementsByTagName('*'), 
p = new RegExp("(^|\\s)"+className+"(\\s|$)"); 
for(var n=0,i=node.length;n<i;n++){ 
if(p.test(node[n].className)){ 
elem.push(node[n]); 
} 
} 
return elem; 
}, 
init:function(){ 
var val = 0; 
if(this.dir =='crosswise'&&this.effect=='marque'&&this.opt.itemName!=''){ 
this.itemLen = this.target.getElementsByTagName(this.opt.itemName).length; 
val = this.itemLen*this.opt.itemWidth; 
}else{ 
val = this.target.scrollHeight; 
} 
var holderHTML = this.target.innerHTML; 
this.target.innerHTML = '<div class="J_scrollInner">'+holderHTML+'</div>'; 
this.targetChild = this.getByClassName('J_scrollInner',this.target)[0]; 
var attr = this.dir == 'vertical'?'offsetHeight':'offsetWidth'; 
if(val>this.target[attr]){ 
if(this.effect == 'scroll'){ 
this.scrollDo(); 
}else{ 
this.marquee(); 
} 
this.targetChild.innerHTML += this.targetChild.innerHTML; 
} 
} 
}
Javascript 相关文章推荐
jQuery Dialog 弹出层对话框插件
Aug 09 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
Aug 27 Javascript
使用javascript做的一个随机点名程序
Feb 13 Javascript
js简单实现交换Li的值
May 22 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
Mar 02 Javascript
Js的Array数组对象详解
Feb 22 Javascript
javascript中使用未定义变量或值的情况分析
Jul 19 Javascript
微信小程序的动画效果详解
Jan 18 Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 Javascript
ES6基础之默认参数值
Feb 21 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
Oct 24 Javascript
Vue防止白屏添加首屏动画的实例
Oct 31 Javascript
IE、FF浏览器下修改标签透明度
Jan 28 #Javascript
纯css+js写的一个简单的tab标签页带样式
Jan 28 #Javascript
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 #Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 #Javascript
js关于精确计算和数值格式化以及直接引js文件
Jan 28 #Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
Jan 28 #Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 #Javascript
You might like
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
第六节--访问属性和方法
2006/11/16 PHP
php 调用远程url的六种方法小结
2009/11/02 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
python监控键盘输入实例代码
2018/02/09 Python
查看Django和flask版本的方法
2018/05/14 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
python代码中怎么换行
2020/06/17 Python
python实现KNN近邻算法
2020/12/30 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
教育技术职业规划范文
2014/03/04 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
工程合作意向书范本
2015/05/09 职场文书
话题作文之自信作文
2019/11/15 职场文书