javascript模拟marquee跑马灯效果

探讨HTML中marquee标签被废弃的原因,包括其由微软创造、功能不完善及不符合HTML规范等。介绍使用CSS定位、jQuery animate和scrollLeft方法实现类似效果的三种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着html中的标签marquee不在被W3C作为标准采纳,在可遇见的未来也会慢慢的被各大浏览器抛弃,直至废弃,为什么被废弃呢,经过小雨我不辞辛苦的总结有以下几种原因:

  • marquee这家伙是微软自己创造出来的,现在火狐都支持了,它自己不干了
  • marquee的效果,必须要前一次滚动完成之后,才会接着下一次,会留白很长一段时间,适合无限向上滚动,无限往左有点瑕疵,并且被部分浏览器废弃,会出现兼容性问题
  • 最重要的是不能暂停,不能暂停,不能暂停 — 功能不完善
  • 搜到了这个啊 —> 就是以后html的规范,只是语意标签,像原来具有样式或者特效功能的标签,比如
    <em> <i> <strong>等等都会慢慢废弃

理由够充分吧,是不是被抛弃就合理了,那怎么用js实现这个marquee效果呢,总结了一下,有三中方法:

  • css定位,无限向左 left++
  • 利用jquery的animate方法
  • 利用jquery的scrollLeft方法

3个实现原理是啥呢,其实很简单,只有结构不一样,但是实现方法基本都是一样的

咱们拿css3定位来说明这个例子,首先看html结构:

<div class="scroll_area"> <!--目标体-->
  <div class="content"> <!-- 显示容器 -->
    <div class="scrolltxt"> <!-- 滚动体 -->
      <span>秦时明月汉时关,万里长征人未还1</span>
      <span>秦时明月汉时关,万里长征人未还2</span>
    </div>
  </div>
</div>

Demo结构

var obj = $('.scroll_area');
var dw = obj.find(".content").width();
var cw = obj.find(".scrolltxt").width();
var cx = 0;

1.首先复制一遍移动体
什么是移动体,就是要滚动的整体,如果横向滚动,则必须用内联标签,咱们这里用span,然后span的父级div即类scrolltxt才是整个移动体

2.制造滚动
什么情况下才能滚动呢,当然是 — 当滚动体的宽度大于显示容器的宽度 — 这样我必须要滚起来,你才能看见全部啊
滚动体为scrolltxt, 显示容器为content,即(".content").width() < (".scrolltxt").width()时才能滚动,否则,不满一屏,当然不能滚动了

3.无限滚动
什么时候才能让滚动体无限滚动下去呢,其实无限滚动就是让目标滚动到最右边即滚动体本身的宽度时,在来一遍嘛,怎么再来一遍这就需要一个技巧了,怎么才能让滚动体滚动到超了滚动体宽度了,还能滚动
延长滚动体-----------> 最简单的就是制造假象,直接全盘复制一遍原滚动体的html,append到最后面,哇,简直太聪明了

看代码:

  obj.find(".scrolltxt").eq(0).append(obj.find(".scrolltxt").eq(0).html());

无限滚动开始
延长是延长了,但是仅仅是制造假象,仅仅是为了让滚动体超过了原滚动体宽度了还能滚,但是作用仅仅如此而已,滚动超过了,还是要原角登场
所以啊,当滚动超过scrolltxt的宽度时,或者是滚动体的宽度减去显示体的宽度,再加上容器宽度时,原滚动体复位,比较拗口吧,上个图吧:

在这里插入图片描述

if (cw > dw) { //宽度超出当前content宽度才滚动
  var scrollval = null;//滚动事件变量
  obj.find(".scrolltxt").eq(0).append(obj.find(".scrolltxt").eq(0).html());
  scrollval = setInterval(function () {
    obj.find(".scrolltxt").eq(0).css({
      "left": "-" + cx + "px"
    })
    if (cx > (cw - dw) + dw)
      cx = 0;
    cx ++;
  }, 30);

但是细心的人还是能看的出来,对第一屏滚动完时的跳动不能容忍,那就完整的模拟一个marquee,无限循环:

function marquee() {
       var dw = $('#rotateWinners').width();
       var cw = $('#scrollArea').width();
       var cx = 0;
       var initX = Math.floor(dw);
       if(cw > dw) {
           setInterval(function () {
               $('#scrollArea').css({
                   'left': cx + 'px'
               });
               if(cx < 0) {
                   if (-cx >= (cw - dw) + dw) {
                       cx = initX;
                   }
               }
               console.log('cx:', cx);
               cx --;
           }, 50)
       }
    }

好啦,到这里就完美模拟出跑马灯效果了,给大家也附上无限向上滚动,以及animate的实现方法,供大家参考
跑马灯无限往左-animate
跑马灯无限往上
跑马灯无限向左-left

<table style="BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; BORDER-LEFT: #666666 1px solid; BORDER-BOTTOM: #666666 1px solid" cellSpacing=0 cellPadding=0 width=750 align=center border=0> <tr> <td width="30"> <a href="#" onClick="clickdiv()" id="aa">向左 </a> </td> <td> <DIV id=demo style="OVERFLOW: hidden; WIDTH: 750px; COLOR: #ffffff"> <table cellSpacing=0 cellPadding=0 align=left border=0 cellspace="0"> <tr> <td id=demo1 vAlign=top> <table width="1710" height="116" border="0" cellpadding="0" cellspacing="0"> <tr> <td width="171" background="pic_bg.jpg"> <div align="center">内容一 </div> </td> <td width="171" background="pic_bg.jpg"> <div align="center">内容二 </div> </td> <td width="171" background="pic_bg.jpg"> <div align="center">内容三 </div> </td> <td width="171" background="pic_bg.jpg"> <div align="center">内容四 </div> </td> <td width="171" background="pic_bg.jpg"> <div align="center">内容五 </div> </td> <td width="171" background="pic_bg.jpg"> <div align="center">内容六 </div> </td> </tr> </table> </td> <td id=demo2 vAlign=top> </td> </tr> </table> </DIV> </td> <td width="30"> <a href="#" onClick="Rclickdiv()" id="mcc">向右 </a> </td> </tr> </table> <SCRIPT> var speed3=25//速度数值越大速度越慢 var t=false; var id="aa"; document.getElementById("demo2").innerHTML=document.getElementById("demo1").innerHTML function Marquee(){ if(document.getElementById("demo2").offsetWidth-document.getElementById("demo").scrollLeft <=0) document.getElementById("demo").scrollLeft-=document.getElementById("demo1").offsetWidth else{ document.getElementById("demo").scrollLeft++ } t=false; } function RMarquee(){ if(document.getElementById("demo").scrollLeft <=0) document.getElementById("demo").scrollLeft+=document.getElementById("demo2").offsetWidth else{ document.getElementById("demo").scrollLeft-- } t=true; } function clickdiv(){ clearInterval(MyMar) Marquee(); } function Rclickdiv(){ clearInterval(MyMar) RMarquee(); } var MyMar=setInterval(Marquee,speed3) document.getElementById("demo").onmouseover=function() {clearInterval(MyMar)} document.getElementById("demo").onmouseout=function() {if(t){MyMar=setInterval(RMarquee,speed3)}else{MyMar=setInterval(Marquee,speed3)}} document.getElementById('mcc').onmouseout=function(){clearInterval(MyMar);MyMar=setInterval(RMarquee,speed3);} document.getElementById('aa').onmouseout=function(){clearInterval(MyMar);MyMar=setInterval(Marquee,speed3);} </SCRIPT> 一个简单的向左或向右移动的案例: <base href=" <a href="http://www.it365cn.com" target="_blank">http://www.it365cn.com </a>"> <div id=demo style=overflow:hidden;height:120;width:500;background:#214984;color:#ffffff> <table align=left cellpadding=0 cellspace=0 border=0> <tr> <td id=demo1 valign=top> <a href='images/logo_1.gif'> <img src="images/logo_1.gif"> </a> <!--后面的链接自己加上--> <img src="images/logo/flashempire.gif"> <img src="images/logo.gif"> <img src="images/logo/5dmedia.gif"> <img src="images/logo/macromedia.gif"> <img src="images/logo/sucaiw.gif"> <img src="images/logo/blueieda.gif"> <img src="images/logo/htmlcn.gif"> <img src="images/logo/fwcn.gif"> </td> <td id=demo2 valign=top> </td> </tr> </table> </div> <script> //向左滚动的效果 var speed=30 demo2.innerHTML=demo1.innerHTML function Marquee(){ if(demo2.offsetWidth-demo.scrollLeft <=0) demo.scrollLeft-=demo1.offsetWidth else{ demo.scrollLeft++ } } var MyMar=setInterval(Marquee,speed) demo.onmouseover=function() {clearInterval(MyMar)} demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)} </script> <script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值