垂直无缝滚动图片(兼容性好)实例教程源码下载
作者: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方法。


猜你喜欢
- 类和实例python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句”物以类聚
- Django 作为后端Web开发框架,有时候我们需要用到定时任务来或者固定频次的任务来执行某段代码,这时我们就要用到Celery了。Djan
- 地图现在太常见了,几乎每天在地铁上都能看到卖地图的小贩,”09年新版北京旅游交通图,1块钱一份”,买的人多半是外地来旅游的,这些人需要地图来
- cookielib是一个自动处理cookies的模块,如果我们在使用爬虫等技术的时候需要保存cookie,那么cookielib会让你事半功
- 先来看一个例子:>>> def foo(*args, **kwargs): print
- 1、chr(i)chr()函数返回ASCII码对应的字符串。>>> print chr(65)A>>>
- SQL2008清空删除日志:方法一:USE [master]GOALTER DATABASE AFMS SET RECOVERY SIMPL
- 前言前端小伙伴们平常在开发过程中文件上传是经常遇到的一个问题,也许你能够实现相关的功能,但是做完后回想代码实现上是不是有点"力不从
- 前言Django的模型(Model)的本质是类,并不是一个具体的对象(Object)。当你设计好模型后,你就可以对Model进行实例化从而创
- 导语hello everyone! I'm kimiko!Miss me???嘿!中秋结束了,开始正式营业给大家继续送福
- 一、继承的格式类的继承格式如下,括号中的为父类名。class 类名(父类名): 代码二、单继承下面我们让Man继承自Master类,并调用继
- 一.基本的查询语句,特殊符号||。制定列的别名AS,唯一标示distinct1.字符连接符“||”与“+”符oracle:select &n
- 前言最近天气好像有了点小脾气,总是在万分晴朗得时候耍点小性子~阴会天,下上一会的雨~提醒我们时刻记得带伞哦,不然会被雨淋或者被太阳公公晒到
- 简单使用csv.DictReader()方法示例代码1:import csvf = open('sample','r
- 这次主要介绍字符串常用操作方法及例子1.python字符串在python中声明一个字符串,通常有三种方法:在它的两边加上单引号、双引号或者三
- 最近闲来无事, 于是就简单学习了下Go语言的基本的用法。由于实践才是最快的学习方法,所以这里就以下载网络图片或文件入手来学习Go语言文件下载
- 1.直方图的概念图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜
- 方式一:直接通过数据库厂商提供的相关驱动步骤导入相关驱动(Build Path)创建Driver类的实例化对象获取要连接数据库的URL创建P
- JetBrains针对学生推出了免费使用资格,但是很多同学却不知道或者说不知道怎样获得免费资格,只能千辛万苦的去寻找破解密钥,但现在JetB
- 1.random.random():会随机生成0-1之间的小数例如:2.random.uniform(min,max):会随机生成 min