垂直无缝滚动图片(兼容性好)实例教程源码下载
作者:YAOHAIXIAO 来源:YAOHAIXIAO博客 发布时间:2010-04-06 12:16:00
我很久前在YAHOO上扣的代码,兼容性很好,在Windows下的主流浏览器中可以正常运行。
大家先不要急着下载代码,你随时都可以下,我们来分析下代码(代码中我已经写了很详细的注释),要之其所以然,在解读别人的代码中学习提高自己,然后可以灵活运用,这个才是我将这个效果贴出来的主要目的,代码如下:
scrollver.js[code]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; // (默认)滚动的时间间隔2秒/*** @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豪秒上升1pxo.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.scrollAreathis.scrollArea = document.getElementById(disp);}else {// 如果是DOM节点,直接付给this.scrollAreathis.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);}
我在脚本的注释中已经说了这个效果的实现原理,而实现一个效果的关键就是在于运用setTimeout方法和clearTimeout方法。


猜你喜欢
- 在html 5增加了新元素header、footer,测试过发现IE不能解析html 5新增的元素。代码如下:<!DOCTYPE ht
- 一直以来,ACCESS数据库中的申报数据在分公司与总公司之间传递,用EXCEL或DBASE、TXT甚至ACCESS等格式,我总觉得不太理想。
- 从某个页面表单中取出信息是ASP编程中常见的问题。但是,遍历通过表单传递的记录会花去多长时间呢?这取决于数据库的大小。简单的GUI界面都可能
- 代码如下:---1.平均销售等待时间 ---有一张Sales表,其中有销售日期与顾客两列,现在要求使用一条SQL语句实现计算 --每个顾客的
- 从我们论坛中收集了这段HTML制作页面需要最大化、最小化时可以借鉴参考。最大化效果:<OBJECT id="max
- 但是有时候,可以视看处进逻辑程度,可以把三者写成一个触发器,只是在其中稍作判断而已。 你可以根据从下面方法判断触发器是是处理了插入,删除还是
- 阅读上一篇:FrontPage XP设计教程3——网页的布局 FrontPage XP可以保证用户设计网页与不同的浏览器兼容,它所提供的样式
- 在ASP的实际操作中,总会发生这样的情况,如在银行,从我的帐户往费文华的帐户划款,我的帐户显示已经划出,但因银行的系统出现故障,导致费文华帐
- 触发器权限和所有权CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色成员以及 db_owner
- 如何在页面中对不同的数据进行相同的处理?selectId.asp' 列出所有客户的客户名称<html><
- 示例:mysql> DELIMITER //mysql> CREATE PROCEDURE `statis`()
- YSlow是yahoo美国开发的一个页面评分插件,非常的棒,从中我们可以看出我们页面上的很多不足,并且可以知道我们改怎么却改进和优化。仔细研
- 【eval()函数】JavaScript有许多小窍门来使编程更加容易。其中之一就是eval()函数,这个函数可以把一个字符串当作一个Java
- 这里列出了13种实现图片或网页内容 lightbox 效果的方法,大部分是链接到各种lightbox作者的英文页面,里面都有源代码下载。Th
- Introduction简介So what is POSH? No, it's not just some new clothing
- sql server的备份与恢复(查询分析器) 查询分析器: 命令: 1:备份数据库命令: backup database whdb1(要备
- 从MySQL 5.0.2开始,通过mysql_stmt_attr_set() C API函数实现了服务器端光标。服务器端光标允许在服务器端生
- 代码如下:< % '功能:显示数据库中表名、字段名、字段内容 '原创:wangsdong
- 在进行ASP网站开发时,有时需在客户端调用MSSQL数据库的数据进行打印,若调用数据量小,可以通过在客户端运用FileSystemObjec
- 问:SQL Server应该怎样访问Sybase数据库的表?答:具体方法如下:1: 安装Sybase客户端版本的要求:Sybase Clie