原生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 autocomplete插件修改
Apr 17 Javascript
『jQuery』取指定url格式及分割函数应用
Apr 22 Javascript
Jquery树插件zTree用法入门教程
Feb 17 Javascript
JavaScript给url网址进行encode编码的方法
Mar 18 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
May 30 Javascript
AngularJS基础 ng-include 指令简单示例
Aug 01 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
Feb 15 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
May 22 Javascript
JavaScript设计模式之代理模式简单实例教程
Jul 03 Javascript
jquery实现搜索框功能实例详解
Jul 23 jQuery
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 Javascript
详解JavaScript作用域 闭包
Jul 29 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用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python3基础之输入和输出实例分析
2014/08/18 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
学习和使用python的13个理由
2019/07/30 Python
python 基于wx实现音乐播放
2020/11/24 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
教师党员个人整改措施
2014/10/27 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
英文慰问信范文
2015/03/24 职场文书
限期整改通知书
2015/04/22 职场文书
旅游项目合作意向书
2015/05/08 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
MySQL8.0的WITH查询详情
2021/08/30 MySQL
python基础之类方法和静态方法
2021/10/24 Python
python获取字符串中的email
2022/03/31 Python
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL