兼容多浏览器的字幕特效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 相关文章推荐
JavaScript 基础问答三
Dec 03 Javascript
JQuery 学习笔记 选择器之一
Jul 23 Javascript
基于jQuery的实现简单的分页控件
Oct 10 Javascript
js 实现日期灵活格式化的小例子
Jul 14 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
Feb 10 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
Jun 15 Javascript
JavaScript设计模式之策略模式实例
Oct 10 Javascript
jQuery中:eq()选择器用法实例
Dec 29 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
express 项目分层实践详解
Dec 10 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 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
mysql 全文搜索 技巧
2007/04/27 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
教师敬业奉献模范事迹材料
2014/05/18 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js