scrollvertical.prototype.scrollarea=null; // 滚动的区域 scrollvertical.prototype.scrollmsg=null; // 要滚动的内容 scrollvertical.prototype.unitheight=0; // 单独一行滚动内容的高度(程序中通过过的要滚动行的一个节点的offsetheight获得) scrollvertical.prototype.msgheight=0; // 整个滚动内容的高度 scrollvertical.prototype.copymsg=null; // 复制滚动内容(程序中使用复制scrollmsg.innerhtml来获得的) scrollvertical.prototype.scrollvalue=0; // 滚动的值 scrollvertical.prototype.scrollheight=0; // 滚动高度 scrollvertical.prototype.isstop=true; // 停止滚动 scrollvertical.prototype.ispause=false; // 暂停滚动 scrollvertical.prototype.scrolltimer=null; // 滚动计时器 scrollvertical.prototype.speed=2000; // 滚动的时间间隔 /** * @method ismoz - 判断是否为mozilla系列浏览器 */ scrollvertical.prototype.ismoz = function(){ return navigator.useragent.tolowercase().indexof('gecko') > 0; }; /** * @method play - 滚动信息的处理方法(函数) * @param {object} o - 滚动类 */ scrollvertical.prototype.play = function(o){ var s_msg = o.scrollmsg; var c_msg = o.copymsg; var s_area = o.scrollarea; var msg_h = o.msgheight; var anim = function(){ // 如果已经开始计时(间隔时间执行向上滚动), // 就停止它(以免无限制执行,耗系统资源)。 if (o.scrolltimer) { cleartimeout(o.scrolltimer); } // 如果暂停了滚动(鼠标放到了滚动层上) // 开始以10毫秒的时间间隔运行滚动 if (o.ispause) { o.scrolltimer = settimeout(anim, 10); return; } // 当显示完所有信息后(这时滚动的距离就等于要滚动信息的高度msg_h) // 这时又重新开始滚动,将滚动距离清零 if (msg_h - o.scrollvalue <= 0) { o.scrollvalue = 0; } else { o.scrollvalue += 1; o.scrollheight += 1; } // 根据浏览器的不同,处理滚动 if (o.ismoz) { // mozilla引擎浏览器 s_area.scrolltop = o.scrollvalue; } else { // 其余的浏览器则使用控制css样式处理滚动 s_msg.style.top = -1 * o.scrollvalue + "px"; c_msg.style.top = (msg_h - o.scrollvalue) + "px"; } // 滚动高度等于显示滚动区域高度时(滚动完一行,一行内容全部显示) // 暂停4秒中,然后再开始执行下依次滚动。 if (o.scrollheight % s_area.offsetheight == 0) { o.scrolltimer = settimeout(anim, o.speed); } else { // 在两行内容之间过度滚动时,每10豪秒上升1px o.scrolltimer = settimeout(anim, 10); } }; // 执行滚动 anim(); }; /** * scrollvertical 垂直滚动的构造函数 * @param {object} disp - 必须 显示滚动区域的dom节点(或节点id) * @param {object} msg - 必须 被显示的信息的dom节点(或节点id) * @param {string} tg - 可选 以什么标记为一行的标签名称(tagname) */ function scrollvertical(disp, msg, tg){ // 给在之前定义的this.scrollarea付值 if (typeof(disp) == 'string') { // 如果disp给的是节点的id,通过document.getelementbyid获取该节点 // 然后付值给this.scrollarea this.scrollarea = document.getelementbyid(disp); } else { // 如果是dom节点,直接付给this.scrollarea this.scrollarea = disp; } // 以给this.scrollarea相同的方法给this.scrollmsg付值 if (typeof(msg) == 'string') { this.scrollmsg = document.getelementbyid(msg); } else { this.scrollmsg = msg; } // 为了开发方便, // 不用一直写this.scrollmsg这么常的名字, // 将两个对象付给局部变量 var s_msg = this.scrollmsg; var s_area = this.scrollarea; // 如果没有给定一行的识别标签, // 默认将li标签认为是一行的标签 // 所以上面介绍的,tag参数是可选的 if (!tg) { var tg = 'li'; } // 获取单行的高度 // 获取到第一(s_msg.getelementsbytagname(tg)[0])tg(一行的标签)的高度,作为单行的高度 this.unitheight = s_msg.getelementsbytagname(tg)[0].offsetheight; // 获取整个信息框的高度 // 公式为 单行高度(unitheight)*行数(s_msg.getelementsbytagname(tg).length,显示信息中包含多少个tg(行)标签) this.msgheight = this.unitheight * s_msg.getelementsbytagname(tg).length; /* * 复制要显示的信息: * 连续滚动的实现其实就是通过复制信息, * 并将复制的信添加到原始信息后 * 当原始信息滚动显示完成,就接着滚动显示复制的信息 * 但给人的错觉是,我们看到信息连续不断的显示 */ // 创建复制内容节点 var copydiv = document.createelement('div'); // 这个地方感觉有点嵌妥 // 直接使用element.id的方式,不过看上去,主流的浏览器都支持 // 标准的dom core方法: // copydiv.setattribute('id',s_area.id + "_copymsgid") copydiv.id = s_area.id + "_copymsgid"; // 复制原始的信息 // 将原始的信息s_msg中的内容,直接用innerhtml写到 copydiv.innerhtml = s_msg.innerhtml; // 设置复制信息节点的高度 copydiv.style.height = this.msgheight + "px"; // 将复制节点添加到原始接点(scrollmsg)后 // 其实实现的方法就是将复制信息节点(copydiv)添家到显示区域的节点(scrollarea)中 s_area.appendchild(copydiv); this.copymsg = copydiv; // 开始执行滚动方法 this.play(this); } /*执行滚动事件*/