兼容多浏览器的字幕特效Marquee的通用js类


Posted in Javascript onJuly 20, 2008

Marquee.js

参数说明:  
demo  字幕区域标签(div)的ID; 
demo1/demo2  显示内容标签(div或td)的ID   demo1为原始内容,demo2是它的拷贝;  
direction 字幕方向(up,down,left,right) ; 
delay 字幕播放的延迟时间(毫秒); 
step 字幕播放的步长(即pix,步长越小,如step=1,滚动越平滑)

function Marquee (demo, demo1, demo2, direction, delay, step)
{
 direction = direction.toLowerCase();

 if(((direction == "up" || direction == "down") && ($(demo1).offsetHeight > $(demo).offsetHeight)) || ((direction == "left" || direction == "right") && ($(demo1).offsetWidth > $(demo).offsetWidth)))
 {
  $(demo2).innerHTML = $(demo1).innerHTML;
  if(direction == "down")
   $(demo).scrollTop = 2 * $(demo1).offsetHeight - $(demo).offsetHeight;
  if(direction == "right")
   $(demo).scrollLeft = 2 * $(demo1).offsetWidth - $(demo).offsetWidth;
 }
 else
  return;

 var flag = true;
 var speed = delay == null? 1 : parseInt(delay);
 var amount = step == null? 1 : parseInt(step);

 var Marquee = function ()
 {
  switch(direction)
  {
   case "up":
    if($(demo2).offsetTop - $(demo).scrollTop <= 0)
     $(demo).scrollTop -= $(demo1).offsetHeight;
    else
     $(demo).scrollTop += amount;
    break;
   case "down":
    if($(demo1).offsetTop - $(demo).scrollTop >= 0)
     $(demo).scrollTop += $(demo2).offsetHeight;
    else
     $(demo).scrollTop -= amount;
    break;
   case "left":
    if($(demo2).offsetWidth - $(demo).scrollLeft <= 0)
     $(demo).scrollLeft -= $(demo1).offsetWidth;
    else
     $(demo).scrollLeft += amount;
    break;
   case "right":
    if($(demo).scrollLeft <= 0)
     $(demo).scrollLeft += $(demo2).offsetWidth;
    else
     $(demo).scrollLeft -= amount;
    break;
   default:break;
  }
 }

 var timer = setInterval(Marquee,speed);

 var play = function ()
 {
  if(flag)
  {
   clearInterval(timer);
   timer = setInterval(Marquee, speed);
  }
 }

 $(demo).onmouseover = function ()
 {
  if(flag)
   clearInterval(timer);
 }

 $(demo).onmouseout = function ()
 {
  if(flag)
   timer = setInterval(Marquee, speed);
 }

 this.delay = function (s)
 {
  speed = s == null? 50 : parseInt(s);
  play();
 }

 this.step = function (s)
 {
  amount = s == null? 1 : parseInt(s);
  play();
 }

 this.start = function ()
 {
  if(!flag)
  {
   flag = true;
   play();
  }
 }

 this.stop = function ()
 {
  if(flag)
  {
   flag = false;
   clearInterval(timer);
  }
 }

 this.direction = function (s)
 {
  s = s.toLowerCase();
  if( s == direction )
   return;
  if(s == "down" && direction == "up" )
   direction = s;
  if(s == "up" && direction == "down")
   direction = s;
  if(s == "right" && direction == "left")
   direction = s;
  if(s == "left" && direction == "right")
   direction = s;
  if (s == direction)
   play();
 }
}

 上面js里用到的$或$F,如果你用过prototype.js的话,把它添加进去就行了; 否则你需要先引用下面的js文件: Ruby.js  (从prototype.js里截过来的 呵呵)

function Ruby ()
{
}

if (!Array.prototype.push) { 
  Array.prototype.push = function() { 
      var startLength = this.length; 
      for (var i = 0; i < arguments.length; i++) 
      this[startLength + i] = arguments[i]; 
     return this.length; 
  } 
}

$ = function ()
{
  var elements = new Array(); 

  for (var i = 0; i < arguments.length; i++) { 
    var element = arguments[i]; 
    if (typeof element == ''string'') 
      element = document.getElementById(element); 

    if (arguments.length == 1) 
      return element; 

    elements.push(element); 
  } 

  return elements;
}

$F = function ()
{
 if(arguments.length == 1)
  return document.getElementById(arguments[0]).value;
 else
 {
  var elements = new Array();
  for(var i = 0;i< arguments.length; i++)
  {
   elements.push(document.getElementById(arguments[i]).value);
  }
  return elements;
 }
}

 到这里,js文件已经搞定了,开始写HTML代码:

(1)先添加css样式,如果你不想滚动字幕里的内容被无故撑大的话(有时候)
<style>
.wrap{word-break:break-all;overflow:hidden}
</style>

(2)添加js文件  -->用了prototype.js的更好,替换掉Ruby.js   :)
<script src="Ruby.js"></script>
<script src="Marquee.js"></script>

(3)添加字幕区域内容
1. 向上或向下滚动    

<div id="d1" style="overflow:hidden;height:200px;width:90px">
   <div id="d11" width="100%" class="wrap">
    =顶部=<br>动感地带资费攻略1 动感地带资费攻略2<br>=底部=
   </div>
   <div id="d12" width="100%" class="wrap"></div>
  </div>
  <script>var obj1 = new Marquee("d1","d11","d12","up");</script>
由于字幕d1的height=200,而d11的内容高度不足200,故字幕默认不会滚动,要实现滚动的话,只需d11的height>200就行了,故只需在d11的里面再放个空div就行了,让它的height=200; 如果d11的内容高度大于了200px,则字幕区域d1将无间断滚动

2. 向左或向右滚动

<div id="d2" style="overflow:hidden;width:500">
  <table>
   <tr>
    <td id="d21">
     <nobr>
      [开始]动感地带资费攻略1 动感地带资费攻略2 动感地带资费攻略3 动感地带资费攻略4 动感地带资费攻略5 动感地带资费攻略6 动感地带资费攻略7 动感地带资费攻略8 动感地带资费攻略9 动感地带资费攻略10 动感地带资费攻略11 动感地带资费攻略12 动感地带资费攻略13 动感地带资费攻略14 动感地带资费攻略15 动感地带资费攻略16 动感地带资费攻略17 动感地带资费攻略18 动感地带资费攻略19 动感地带资费攻略20[结束] 
     </nobr>
    </td>
    <td id="d22"></td>
   </tr>
  </table>
 </div>
 <script>var obj2 = new Marquee("d2","d21","d22","left");</script>

实现原理同上,至于为什么这里要用table而不用div,是因为div在默认情况只能判断height,而不能判断width,而table却恰恰相反,上面用到的nobr标签也是必需的,防止字幕自动换行!

附:  更改延迟播放速度 obj2.delay(50); 或 obj2.delay("50");

更改播放步长

obj2.step(50); 或 obj2.step("50");

停止播放 obj2.stop();  继续播放 obj2.start();

更改播放方向(同类型方向)

obj2.direction("right");

Javascript 相关文章推荐
ajax 同步请求和异步请求的差异分析
Jul 04 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
Aug 02 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
表单元素值获取方式js及java方式的简单实例
Oct 15 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
js实现简单数字变动效果
Nov 06 Javascript
Vue2.0用户权限控制解决方案的示例
Feb 10 Javascript
vue cli2.0单页面title修改方法
Jun 07 Javascript
vue.js购物车添加商品组件的方法
Sep 17 Javascript
vue实现div单选多选功能
Jul 16 Javascript
js停止输出代码
Jul 20 #Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
Jul 19 #Javascript
javascript 获取网页参数系统
Jul 19 #Javascript
javascript import css实例代码
Jul 18 #Javascript
番茄的表单验证类代码修改版
Jul 18 #Javascript
神奇的代码 通杀各种网站-可随意修改复制页面内容
Jul 17 #Javascript
js 新浪的一个图片播放图片轮换效果代码
Jul 15 #Javascript
You might like
PHP5 面向对象(学习记录)
2009/12/02 PHP
PHP 验证码的实现代码
2011/07/17 PHP
php限制ip地址范围的方法
2015/03/31 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
JavaScript 字符编码规则
2009/05/04 Javascript
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
js使用心得分享
2015/01/13 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
python3调用windows dos命令的例子
2019/08/14 Python
基于python实现学生信息管理系统
2019/11/22 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
老师的检讨书
2014/02/23 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
2014年预算员工作总结
2014/12/05 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android
Golang 并发下的问题定位及解决方案
2022/03/16 Golang