原生javascript實(shí)現(xiàn)無間縫滾動(dòng)示例
更新時(shí)間:2014年01月28日 16:12:54 作者:
原生javascript無間縫滾動(dòng)目前支持的是豎向與橫向滾動(dòng),下面有個(gè)不錯(cuò)的示例,大家可以參考下
目前支持的是豎向與橫向滾動(dòng)
http://lgyweb.com/marScroll/
現(xiàn)在分析下無間縫實(shí)現(xiàn)的基本思路(豎向例子):
HTML結(jié)構(gòu):
<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)首先需要判斷里面的內(nèi)容高度ul結(jié)構(gòu)是否高于外層div#marScrolll,則才進(jìn)行無間縫滾動(dòng):
// 寫在匿名函數(shù)里面,防止全局變量污染
(function(){
var target = document.getElementById('marScroll'),
oUl = target.getElementsByTagName('ul')[0];
// 內(nèi)容少,則直接退出此函數(shù)
if(oUl.offsetHeight<target.offsetHeight) return;
})();
(2)無間縫就是內(nèi)容的無限滾動(dòng)展示,那么先需要復(fù)制里面的內(nèi)容,然后通過外層的scrollTop++屬性,用setInterval 函數(shù)進(jìn)行循環(huán)執(zhí)行
target.innerHTML += target.innerHTML;
/* 判斷每次滾動(dòng)的距離等于第一個(gè)ul的高度時(shí),設(shè)置scrollTop為0,然后如此的循環(huán)操作就是無間滾動(dòng)了
---------------------------------------------------------------------------------------------*/
// 把功能函數(shù)抽離出來,方便調(diào)用
var fn = function(){
if(target.scrollTop == oUl_h){
target.scrollTop = 0;
}else{
target.scrollTop++;
}
}
// setInterval 循環(huán)
var timer = setInterval(function(){
fn();
},30);
(3)鼠標(biāo)經(jīng)過此內(nèi)容塊時(shí),就停止?jié)L動(dòng)
// hover
target.onmouseover = function(){
clearTimeout(timer);
}
target.onmouseout = function(){
timer = setInterval(function(){
fn();
},30);
}
例子JS總代碼:
// 寫在匿名函數(shù)里面,防止全局變量污染
(function(){
var target = document.getElementById('marScroll'),
oUl = target.getElementsByTagName('ul')[0],
oUl_h = oUl.offsetHeight;
// 內(nèi)容少,則直接退出此函數(shù)
if(oUl_h<target.offsetHeight) return;
target.innerHTML += target.innerHTML;
/* 判斷每次滾動(dòng)的距離等于第一個(gè)ul的高度時(shí),設(shè)置scrollTop為0,然后如此的循環(huán)操作就是無間滾動(dòng)了
---------------------------------------------------------------------------------------------*/
// 把功能函數(shù)抽離出來,方便調(diào)用
var fn = function(){
if(target.scrollTop == oUl_h){
target.scrollTop = 0;
}else{
target.scrollTop++;
}
}
// setInterval 循環(huán)
var timer = setInterval(function(){
fn();
},30);
// hover
target.onmouseover = function(){
clearTimeout(timer);
}
target.onmouseout = function(){
timer = setInterval(function(){
fn();
},30);
}
})();
已經(jīng)完成了個(gè)簡單的豎向無間縫,為了滿足更多的需求,建議封裝成可以,豎向,橫向,多次調(diào)用的函數(shù)。
以下是個(gè)人的封裝,線上例子:
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;
}
}
}
http://lgyweb.com/marScroll/
現(xiàn)在分析下無間縫實(shí)現(xiàn)的基本思路(豎向例子):
HTML結(jié)構(gòu):
復(fù)制代碼 代碼如下:
<div id="marScroll">
<ul>
<li>01</li>
<li>02</li>
<li>03</li>
<li>04</li>
<li>05</li>
</ul>
</div>
CSS:
復(fù)制代碼 代碼如下:
<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)首先需要判斷里面的內(nèi)容高度ul結(jié)構(gòu)是否高于外層div#marScrolll,則才進(jìn)行無間縫滾動(dòng):
復(fù)制代碼 代碼如下:
// 寫在匿名函數(shù)里面,防止全局變量污染
(function(){
var target = document.getElementById('marScroll'),
oUl = target.getElementsByTagName('ul')[0];
// 內(nèi)容少,則直接退出此函數(shù)
if(oUl.offsetHeight<target.offsetHeight) return;
})();
(2)無間縫就是內(nèi)容的無限滾動(dòng)展示,那么先需要復(fù)制里面的內(nèi)容,然后通過外層的scrollTop++屬性,用setInterval 函數(shù)進(jìn)行循環(huán)執(zhí)行
復(fù)制代碼 代碼如下:
target.innerHTML += target.innerHTML;
/* 判斷每次滾動(dòng)的距離等于第一個(gè)ul的高度時(shí),設(shè)置scrollTop為0,然后如此的循環(huán)操作就是無間滾動(dòng)了
---------------------------------------------------------------------------------------------*/
// 把功能函數(shù)抽離出來,方便調(diào)用
var fn = function(){
if(target.scrollTop == oUl_h){
target.scrollTop = 0;
}else{
target.scrollTop++;
}
}
// setInterval 循環(huán)
var timer = setInterval(function(){
fn();
},30);
(3)鼠標(biāo)經(jīng)過此內(nèi)容塊時(shí),就停止?jié)L動(dòng)
復(fù)制代碼 代碼如下:
// hover
target.onmouseover = function(){
clearTimeout(timer);
}
target.onmouseout = function(){
timer = setInterval(function(){
fn();
},30);
}
例子JS總代碼:
復(fù)制代碼 代碼如下:
// 寫在匿名函數(shù)里面,防止全局變量污染
(function(){
var target = document.getElementById('marScroll'),
oUl = target.getElementsByTagName('ul')[0],
oUl_h = oUl.offsetHeight;
// 內(nèi)容少,則直接退出此函數(shù)
if(oUl_h<target.offsetHeight) return;
target.innerHTML += target.innerHTML;
/* 判斷每次滾動(dòng)的距離等于第一個(gè)ul的高度時(shí),設(shè)置scrollTop為0,然后如此的循環(huán)操作就是無間滾動(dòng)了
---------------------------------------------------------------------------------------------*/
// 把功能函數(shù)抽離出來,方便調(diào)用
var fn = function(){
if(target.scrollTop == oUl_h){
target.scrollTop = 0;
}else{
target.scrollTop++;
}
}
// setInterval 循環(huán)
var timer = setInterval(function(){
fn();
},30);
// hover
target.onmouseover = function(){
clearTimeout(timer);
}
target.onmouseout = function(){
timer = setInterval(function(){
fn();
},30);
}
})();
已經(jīng)完成了個(gè)簡單的豎向無間縫,為了滿足更多的需求,建議封裝成可以,豎向,橫向,多次調(diào)用的函數(shù)。
以下是個(gè)人的封裝,線上例子:
http://lgyweb.com/marScroll/
復(fù)制代碼 代碼如下:
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+html5實(shí)現(xiàn)仿flash滾動(dòng)播放圖片的方法
- JavaScript控制網(wǎng)頁平滑滾動(dòng)到指定元素位置的方法
- 分享一則JavaScript滾動(dòng)條插件源碼
- 原生javascript實(shí)現(xiàn)圖片滾動(dòng)、延時(shí)加載功能
- javascript實(shí)現(xiàn)左右控制無縫滾動(dòng)
- Javascript 實(shí)現(xiàn)圖片無縫滾動(dòng)
- Javascript實(shí)現(xiàn)滾動(dòng)圖片新聞的實(shí)例代碼
- JavaScript實(shí)現(xiàn)滾動(dòng)欄效果的方法
相關(guān)文章
Egg.js 中 AJax 上傳文件獲取參數(shù)的方法
這篇文章主要介紹了Egg.js 中 AJax 上傳文件獲取參數(shù),需要的朋友可以參考下2018-10-10IE之動(dòng)態(tài)添加DOM節(jié)點(diǎn)觸發(fā)window.resize事件
因?yàn)轫撁婧芏郩I是絕對(duì)定位的,所以當(dāng)窗口大小改變的時(shí)候會(huì)使原先的布局混亂,只好在每次window.resize的時(shí)候重新布局...2010-07-07JS設(shè)置網(wǎng)頁圖片vspace和hspace屬性的方法
這篇文章主要介紹了JS設(shè)置網(wǎng)頁圖片vspace和hspace屬性的方法,具體分析了vspace和hspace屬性的功能及javascript修改技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04javascript 數(shù)據(jù)存儲(chǔ)的常用函數(shù)總結(jié)
這篇文章主要介紹了javascript 數(shù)據(jù)存儲(chǔ)的常用函數(shù)總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-06-06原生JavaScript實(shí)現(xiàn)五子棋游戲
這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11a標(biāo)簽click和href執(zhí)行順序探討
這篇文章主要介紹了a標(biāo)簽click和href執(zhí)行順序,需要的朋友可以參考下2014-06-06