由于工作需要,实现一个js的 滚动字幕,网上一搜,无非两种。
一个,使用标签元素<marquee> 如:
<marquee scrollAmount=2 width=300>我喜欢网页设计</marquee>
但之前做好的页面都换这个标签不太现实。
另一个,是js用定时器配合 元素的scrollLeft 以及srollWidth来实践,感觉这个比较现实,参考这个了。 关键点在于 如何连续的滚动,
普遍的办法就是拷贝2个一样的元素。 用了一个比较土的做法,把字符串拷贝成2份,中间加个空格(囧囧),然后滚动了一半马上回滚成最开始的样子。
代码如下: (使用时,目标元素一定得 有 ‘white-space : nowrap’ 属性, 要不然就scrollWitdh不够了。。。)
另外虽然 setRollTxtObj有3个参数,但一般用的时候,只必须设一个(js的自由- -!)。
如 rollTxtHnd.setRollTxtObj(destObj);
其实我也有个问题: 测试 clearInterval() 能够去掉 timeOut的定时,但有风险么?看有没有高手能解惑一下。
/**
* warnning: the tagObj must has the
* attribute 'white-space: nowrap'
* And only for txt or txt in <span>.
* tagObj must be raw js object
* 8/8/2013 17:46 created
* 8/8/2013 22:52 fixed the timer to timers.
*
* using:
* just
* rollTxtHnd.setRollTxtObj(yourDomObj);
* */
var rollTxtHnd = {
tagObj: null,
timers: [],
delayTime: 500,
speed: 40,
orgTxt: '',
setRollTxtObj: function(tagObj, speed, delayTime) {
this.stopRoll();
if (tagObj.scrollWidth <= tagObj.offsetWidth)
{
return false;
}
this.orgTxt = tagObj.innerHTML;
this.tagObj = tagObj;
tagObj.innerHTML = this.orgTxt + ' ' + this.orgTxt;
if (speed) // has set ?
{ this.speed = speed;}
if (delayTime) // has set?
{ this.delayTime = delayTime; }
this.startAutoRoll();
return true;
},
rollWay: function () {
// the edge between orgTxt and newTxt
if (this.tagObj.scrollLeft >= (this.tagObj.scrollWidth/2) )
{
this.tagObj.scrollLeft = 0;
}
else
{
this.tagObj.scrollLeft++;
}
},
startAutoRoll: function() {
var self = this;
var tmpTimer = setTimeout(function(){
var timer = setInterval('rollTxtHnd.rollWay()', self.speed);
self.timers.push(timer);
//console.log('create timer: ###');
}, this.delayTime);
this.timers.push(tmpTimer);
},
stopRoll: function() {
if (this.timers.length > 0) // has one?
{
this.resetAttrs();
}
},
resetAttrs: function() {
this.clearTimers(); // must first!!!!
this.tagObj.scrollLeft = 0;
this.tagObj.innerHTML = this.orgTxt;
this.orgTxt = '';
this.tagObj = null;
},
clearTimers: function() {
var timer;
while (this.timers.length > 0)
{
timer = this.timers.shift();// from the header
clearInterval(timer);
//console.log('clear timer: !!!');
}
},
};