不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了


Posted in Javascript onDecember 08, 2007

/*MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类) Ver 1.6*\ 

 制作时间:2006-08-29 (Ver 0.5) 
 发布时间:2006-08-31 (Ver 0.8) 
 更新时间:2007-01-31 (Ver 1.6) 
 更新说明: + 加入功能 * 修正、完善 
    1.6.070131 
        + 禁止鼠标控制暂停或继续 (将第9个参数设置为-1或者动态赋值将ScrollSetp设置为-1) 
        + 判断是否可以滚动 (若内容区域小于显示区域,则自动取消滚动) 
        + 跳过初始化错误 (避免引起其它滚动的停止) 
        + 默认值 (除容器ID必选外,其他参数均可根据情况进行选择设置) 
        + 参数动态赋值 (方向可用英文表示top|bottom|left|right,使其更直观、方便) 
        * 文字滚动不准确 (本次更新主要目的解决此Bug,感谢周?参与测试) 
    1.4.061211 
        + 鼠标悬停改变滚动方向 (鼠标悬停控制左右滚动) 
        * 由于文档下载过慢而导致获取的高度/宽度不准确 
        * 浏览器兼容问题 (IE、FF、Opera、NS、MYIE) 
    1.2.060922 
        + 指定范围间歇滚动 
        * 程序调整 
        * 连续间歇滚动停止的错误 
    1.0.060901 
        + 向下、向右滚动 
        + 开始等待时间 
        + 连续滚动 
        * 调整时间单位 
        * 滚动误差 
        * 随机死循环 
        * 加强性能 
        * 程序优化 
    0.8.060829 
          翻屏不间断向上、向左滚动 

 演示地址:http://www.popub.net/script/MSClass.html 
 下载地址:http://www.popub.net/script/MSClass.js 

 应用说明:页面包含<script type="text/javascript" src="MSClass.js"></script> 

    创建实例: 
        //参数直接赋值法 
        new Marquee("marquee") 
        new Marquee("marquee","top") 
        ...... 
        new Marquee("marquee",0,1,760,52) 
        new Marquee("marquee","top",1,760,52,50,5000) 
        ...... 
        new Marquee("marquee",0,1,760,104,50,5000,3000,52) 
        new Marquee("marquee",null,null,760,104,null,5000,null,-1) 

        //参数动态赋值法 
        var marquee1 = new Marquee("marquee")    *此参数必选 
        marquee1.Direction = "top";    或者    marquee1.Direction = 0; 
        marquee1.Step = 1; 
        marquee1.Width = 760; 
        marquee1.Height = 52; 
        marquee1.Timer = 50; 
        marquee1.DelayTime = 5000; 
        marquee1.WaitTime = 3000; 
        marquee1.ScrollStep = 52; 
        marquee1.Start(); 

    参数说明: 
        ID        "marquee"    容器ID        (必选) 
        Direction    (0)        滚动方向    (可选,默认为0向上滚动) 可设置的值包括:0,1,2,3,"top","bottom","left","right" (0向上 1向下 2向左 3向右) 
        Step        (1)        滚动的步长    (可选,默认值为2,数值越大,滚动越快) 
        Width        (760)        容器可视宽度    (可选,默认值为容器初始设置的宽度) 
        Height        (52)        容器可视高度    (可选,默认值为容器初始设置的高度) 
        Timer        (50)        定时器        (可选,默认值为30,数值越小,滚动的速度越快,1000=1秒,建议不小于20) 
        DelayTime    (5000)        间歇停顿延迟时间(可选,默认为0不停顿,1000=1秒) 
        WaitTime    (3000)        开始时的等待时间(可选,默认或0为不等待,1000=1秒) 
        ScrollStep    (52)        间歇滚动间距    (可选,默认为翻屏宽/高度,该数值与延迟均为0则为鼠标悬停控制,-1禁止鼠标控制) 
 使用建议: 
        1、建议直接赋予容器的显示区域的宽度和高度,如(<div id="marquee" style="width:760px;height:52px;">......</div>) 
        2、建议为容器添加样式overflow = auto,如(<div id="marquee" style="width:760px;height:52px;overflow:auto;">......</div>) 
        3、为了更准确的获取滚动区域的宽度和高度,请尽可能将各滚动单位直接赋予正确宽高度 
        4、对于TABLE标记的横向滚动,需要对TABLE添加样式display = inline,如(<div id="marquee" style="width:760px;height:52px;overflow:auto;"><table style="display:inline">......</table></div>) 
        5、对于翻屏滚动或间歇滚动,要注意各滚动单位间的间距,同时需要对容器的可视高度和可视宽度做好准确的设置,对于各滚动单位间的间距可以通过设置行间距或者单元格的高宽度来进行调整 
        6、对于LI自动换行的问题暂时没有更好的解决办法,建议将其转换成表格(TABLE)的形式来达到同等的效果 
        7、针对横向滚动的文字段落,如果最末端是以空格" "结束的,请将空格" "转换成" " 
        8、鼠标悬停滚动思想源自Flash,所以有一定的局限性(容器内仅允许用图片<img>或者带链接的图片<a><img></a>的形式,并需要禁止其自动换行) 

 感

谢: 
    周? zhoujun#yuchengtech.com (文字滚动跳行的bug) 2007/01/31 
    自本程序发布以来,收到不少朋友的邮件,提出了很多意见和建议,感谢大家的支持! 

\***程序制作/版权所有:崔永祥(333) E-Mail:zhadan007@21cn.com 网址:http://www.popub.net***/ 

<!-- 
function Marquee() 
{ 
    this.ID = document.getElementById(arguments[0]); 
    if(!this.ID) 
    { 
        alert("您要设置的\"" + arguments[0] + "\"初始化错误\r\n请检查标签ID设置是否正确!"); 
        this.ID = -1; 
        return; 
    } 
    this.Direction = this.Width = this.Height = this.DelayTime = this.WaitTime = this.Correct = this.CTL = this.StartID = this.Stop = this.MouseOver = 0; 
    this.Step = 1; 
    this.Timer = 30; 
    this.DirectionArray = {"top":0 , "bottom":1 , "left":2 , "right":3}; 
    if(typeof arguments[1] == "number")this.Direction = arguments[1]; 
    if(typeof arguments[2] == "number")this.Step = arguments[2]; 
    if(typeof arguments[3] == "number")this.Width = arguments[3]; 
    if(typeof arguments[4] == "number")this.Height = arguments[4]; 
    if(typeof arguments[5] == "number")this.Timer = arguments[5]; 
    if(typeof arguments[6] == "number")this.DelayTime = arguments[6]; 
    if(typeof arguments[7] == "number")this.WaitTime = arguments[7]; 
    if(typeof arguments[8] == "number")this.ScrollStep = arguments[8] 
    this.ID.style.overflow = this.ID.style.overflowX = this.ID.style.overflowY = "hidden"; 
    this.ID.noWrap = true; 
    this.IsNotOpera = (navigator.userAgent.toLowerCase().indexOf("opera") == -1); 
    if(arguments.length >= 7)this.Start(); 
} 
Marquee.prototype.Start = function() 
{ 
    if(this.ID == -1)return; 
    if(this.WaitTime < 800)this.WaitTime = 800; 
    if(this.Timer < 20)this.Timer = 20; 
    if(this.Width == 0)this.Width = parseInt(this.ID.style.width); 
    if(this.Height == 0)this.Height = parseInt(this.ID.style.height); 
    if(typeof this.Direction == "string")this.Direction = this.DirectionArray[this.Direction.toString().toLowerCase()]; 
    this.HalfWidth = Math.round(this.Width / 2); 
    this.BakStep = this.Step; 
    this.ID.style.width = this.Width; 
    this.ID.style.height = this.Height; 
    if(typeof this.ScrollStep != "number")this.ScrollStep = this.Direction > 1 ? this.Width : this.Height; 
    //this.ID.innerHTML += this.ID.innerHTML; 
    var msobj = this; 
    var timer = this.Timer; 
    var delaytime = this.DelayTime; 
    var waittime = this.WaitTime; 
    msobj.StartID = function(){msobj.Scroll()} 
    msobj.Continue = function() 
                { 
                    if(msobj.MouseOver == 1) 
                    { 
                        setTimeout(msobj.Continue,delaytime); 
                    } 
                    else 
                    {    clearInterval(msobj.TimerID); 
                        msobj.CTL = msobj.Stop = 0; 
                        msobj.TimerID = setInterval(msobj.StartID,timer); 
                    } 
                } 
    msobj.Pause = function() 
            { 
                msobj.Stop = 1; 
                clearInterval(msobj.TimerID); 
                setTimeout(msobj.Continue,delaytime); 
            } 
    msobj.Begin = function() 
        { 
            msobj.ClientScroll = msobj.Direction > 1 ? msobj.ID.scrollWidth : msobj.ID.scrollHeight; 
            if((msobj.Direction <= 1 && msobj.ClientScroll <msobj.Height) || (msobj.Direction > 1 && msobj.ClientScroll <msobj.Width))return; 
            msobj.ID.innerHTML += msobj.ID.innerHTML; 
            msobj.TimerID = setInterval(msobj.StartID,timer); 
            if(msobj.ScrollStep < 0)return; 
            msobj.ID.onmousemove = function(event) 
                        { 
                            if(msobj.ScrollStep == 0 && msobj.Direction > 1) 
                            { 
                                var event = event || window.event; 
                                if(window.event) 
                                { 
                                    if(msobj.IsNotOpera) 
                                    { 
                                        msobj.EventLeft = event.srcElement.id == msobj.ID.id ? event.offsetX - msobj.ID.scrollLeft : event.srcElement.offsetLeft - msobj.ID.scrollLeft + event.offsetX; 
                                    } 
                                    else 
                                    { 
                                        msobj.ScrollStep = null; 
                                        return; 
                                    } 
                                } 
                                else 
                                { 
                                    msobj.EventLeft = event.layerX - msobj.ID.scrollLeft; 
                                } 
                                msobj.Direction = msobj.EventLeft > msobj.HalfWidth ? 3 : 2; 
                                msobj.AbsCenter = Math.abs(msobj.HalfWidth - msobj.EventLeft); 
                                msobj.Step = Math.round(msobj.AbsCenter * (msobj.BakStep*2) / msobj.HalfWidth); 
                            } 
                        } 
            msobj.ID.onmouseover = function() 
                        { 
                            if(msobj.ScrollStep == 0)return; 
                            msobj.MouseOver = 1; 
                            clearInterval(msobj.TimerID); 
                        } 
            msobj.ID.onmouseout = function() 
                        { 
                            if(msobj.ScrollStep == 0) 
                            { 
                                if(msobj.Step == 0)msobj.Step = 1; 
                                return; 
                            } 
                            msobj.MouseOver = 0; 
                            if(msobj.Stop == 0) 
                            { 
                                clearInterval(msobj.TimerID); 
                                msobj.TimerID = setInterval(msobj.StartID,timer); 
                            } 
                        } 
        } 
    setTimeout(msobj.Begin,waittime); 
} 
Marquee.prototype.Scroll = function() 
{ 
    switch(this.Direction) 
    { 
        case 0: 
            this.CTL += this.Step; 
            if(this.CTL >= this.ScrollStep && this.DelayTime > 0) 
            { 
                this.ID.scrollTop += this.ScrollStep + this.Step - this.CTL; 
                this.Pause(); 
                return; 
            } 
            else 
            { 
                if(this.ID.scrollTop >= this.ClientScroll) 
                { 
                    this.ID.scrollTop -= this.ClientScroll; 
                } 
                this.ID.scrollTop += this.Step; 
            } 
        break; 
        case 1: 
            this.CTL += this.Step; 
            if(this.CTL >= this.ScrollStep && this.DelayTime > 0) 
            { 
                this.ID.scrollTop -= this.ScrollStep + this.Step - this.CTL; 
                this.Pause(); 
                return; 
            } 
            else 
            { 
                if(this.ID.scrollTop <= 0) 
                { 
                    this.ID.scrollTop += this.ClientScroll; 
                } 
                this.ID.scrollTop -= this.Step; 
            } 
        break; 
        case 2: 
            this.CTL += this.Step; 
            if(this.CTL >= this.ScrollStep && this.DelayTime > 0) 
            { 
                this.ID.scrollLeft += this.ScrollStep + this.Step - this.CTL; 
                this.Pause(); 
                return; 
            } 
            else 
            { 
                if(this.ID.scrollLeft >= this.ClientScroll) 
                { 
                    this.ID.scrollLeft -= this.ClientScroll; 
                } 
                this.ID.scrollLeft += this.Step; 
            } 
        break; 
        case 3: 
            this.CTL += this.Step; 
            if(this.CTL >= this.ScrollStep && this.DelayTime > 0) 
            { 
                this.ID.scrollLeft -= this.ScrollStep + this.Step - this.CTL; 
                this.Pause(); 
                return; 
            } 
            else 
            { 
                if(this.ID.scrollLeft <= 0) 
                { 
                    this.ID.scrollLeft += this.ClientScroll; 
                } 
                this.ID.scrollLeft -= this.Step; 
            } 
        break; 
    } 
} 
//-->

在线演示
Javascript 相关文章推荐
Javascript字符串浏览器兼容问题分析
Dec 01 Javascript
js Calender控件使用详解
Jan 05 Javascript
深入探究使JavaScript动画流畅的一些方法
Jun 30 Javascript
javascript实现检验的各种规则
Jul 31 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
JavaScript判断变量是否为数组的方法(Array)
Feb 24 Javascript
jQuery动态添加
Apr 07 Javascript
实例讲解jQuery中对事件的命名空间的运用
May 24 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
详解Vue中添加过渡效果
Mar 20 Javascript
详解JS中的attribute属性
Apr 25 Javascript
详解如何在vue项目中引入elementUI组件
Feb 11 Javascript
项目实践之javascript技巧
Dec 06 #Javascript
[原创]后缀就扩展名为js的文件是什么文件
Dec 06 #Javascript
JavaScript 节点操作 以及DOMDocument属性和方法
Dec 06 #Javascript
javascript 常用关键字列表集合
Dec 04 #Javascript
firefox浏览器下javascript 拖动层效果与原理分析代码
Dec 04 #Javascript
超棒的javascript页面顶部卷动广告效果
Dec 01 #Javascript
js同时按下两个方向键
Dec 01 #Javascript
You might like
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
vue实现评价星星功能
2020/06/30 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
教你用Python创建微信聊天机器人
2020/03/31 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
高校生生产实习自我鉴定
2013/09/21 职场文书
新兵入伍心得体会
2014/09/04 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
中学教师教学工作总结
2015/08/13 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android