【问题标题】:Javascript Marquee to replace <marquee> tagsJavascript Marquee 替换 <marquee> 标签
【发布时间】:2021-11-06 19:42:25
【问题描述】:

我对 Javascript 毫无希望。这就是我所拥有的:

<script type="text/javascript">
    function beginrefresh(){

        //set the id of the target object
        var marquee = document.getElementById("marquee_text");

        if(marquee.scrollLeft >= marquee.scrollWidth - parseInt(marquee.style.width)) {
            marquee.scrollLeft = 0;
        }

        marquee.scrollLeft += 1;

        // set the delay (ms), bigger delay, slower movement
        setTimeout("beginrefresh()", 10);

    }
</script>

它向左滚动,但我需要它相对无缝地重复。此刻它只是跳回到开头。用我的方法可能不行,如果不行,有谁有更好的方法吗?

【问题讨论】:

    标签: javascript html marquee


    【解决方案1】:

    【讨论】:

    • 我在这些或任何其他方面都没有运气。他们等到最后一件事结束后才能再次清除屏幕,有什么想法吗?
    • 第一个链接失效了。
    【解决方案2】:

    简单的javascript解决方案:

    window.addEventListener('load', function () {
    	function go() {
    		i = i < width ? i + step : 1;
    		m.style.marginLeft = -i + 'px';
    	}
    	var i = 0,
    		step = 3,
    		space = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
    	var m = document.getElementById('marquee');
    	var t = m.innerHTML; //text
    	m.innerHTML = t + space;
    	m.style.position = 'absolute'; // http://stackoverflow.com/questions/2057682/determine-pixel-length-of-string-in-javascript-jquery/2057789#2057789
    	var width = (m.clientWidth + 1);
    	m.style.position = '';
    	m.innerHTML = t + space + t + space + t + space + t + space + t + space + t + space + t + space;
    	m.addEventListener('mouseenter', function () {
    		step = 0;
    	}, true);
    	m.addEventListener('mouseleave', function () {
    		step = 3;
    	}, true);
    	var x = setInterval(go, 50);
    }, true);
    #marquee {
       background:#eee;
       overflow:hidden;
       white-space: nowrap;
     }
    <div id="marquee">
    	1 Hello world! 2 Hello world! <a href="#">3 Hello world!</a>
    </div>

    JSFiddle

    【讨论】:

    • 这也适用于任何内容,而不仅仅是文本
    • 我知道这个答案已经有一年了,但我希望我还能得到回复。如何调整此解决方案以进行无缝垂直滚动而不是水平滚动?
    【解决方案3】:

    我最近使用 Cycle 2 Jquery 插件在 HTML 中实现了一个选取框: http://jquery.malsup.com/cycle2/demo/non-image.php

    <div class="cycle-slideshow"  data-cycle-fx="scrollHorz" data-cycle-speed="9000" data-cycle-timeout="1"  data-cycle-easing="linear" data-cycle-pause-on-hover="true" data-cycle-slides="> div" >
      <div>  Text 1  </div>
      <div>  Text 2  </div>
    </div>    
    

    【讨论】:

      【解决方案4】:

      HTML5 不支持该标签,但是许多浏览器仍会“正确”显示文本,但您的代码将无法验证。如果这对您来说不是问题,那可能是一种选择。

      CSS3 有能力,据说,有字幕文本,但是因为任何知道如何做到这一点的人都认为这对 CSS 来说是一个“坏主意”,所以我在网上找到的信息非常有限。即使是 W3 文档也没有为业余爱好者或自学者提供足够的细节来实现它。

      PHP 和 Perl 也可以复制效果。为此所需的脚本将非常复杂,并且比任何其他选项占用更多的资源。还有可能是脚本在某些浏览器上运行过快,导致效果完全否定。

      回到 JavaScript - 您的代码 (OP) 似乎是我发现的最干净、最简单、最有效的代码。我会试试这个。对于无缝的事情,我将寻找一种方法来限制结束和开始之间的空白,可能通过执行一个while循环(或类似的)并实际运行两个脚本,让一个休息而另一个正在处理。

      也可能有一种方法可以通过更改单个函数来消除空白。我是 JS 的新手,所以我不知道。 - 我知道这不是一个全面的答案,但有时想法可能会产生结果,即使只是对其他人而言。

      【讨论】:

      • 我很想知道您如何想象 PHP 可以“复制”客户端选框效果 - 考虑到 PHP 是一种服务器端语言...告诉?
      【解决方案5】:

      这个脚本用来替换marquee标签

      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
          <script type="text/javascript">
          $(document).ready(function() {
           
               $('.scrollingtext').bind('marquee', function() {
                   var ob = $(this);
                   var tw = ob.width();
                   var ww = ob.parent().width();
                   ob.css({ right: -tw });
                   ob.animate({ right: ww }, 20000, 'linear', function() {
                       ob.trigger('marquee');
                   });
               }).trigger('marquee');
           
           });
           </script>
      
      
      <div class="scroll">
          <div class="scrollingtext"> Flash message without marquee tag using javascript!  </div>
       </div>
      

      【讨论】:

      【解决方案6】:

      使用@Stano 代码和一些jQuery 我创建了一个脚本,它将用标准div 替换旧的marquee 标记。该代码还将解析marquee 属性,例如directionscrolldelayscrollamount

      代码如下:

      jQuery(function ($) {
      
          if ($('marquee').length == 0) {
              return;
          }
      
          $('marquee').each(function () {
      
              let direction = $(this).attr('direction');
              let scrollamount = $(this).attr('scrollamount');
              let scrolldelay = $(this).attr('scrolldelay');
      
              let newMarquee = $('<div class="new-marquee"></div>');
              $(newMarquee).html($(this).html());
              $(newMarquee).attr('direction',direction);
              $(newMarquee).attr('scrollamount',scrollamount);
              $(newMarquee).attr('scrolldelay',scrolldelay);
              $(newMarquee).css('white-space', 'nowrap');
      
              let wrapper = $('<div style="overflow:hidden"></div>').append(newMarquee);
              $(this).replaceWith(wrapper);
      
          });
      
          function start_marquee() {
      
              let marqueeElements = document.getElementsByClassName('new-marquee');
              let marqueLen = marqueeElements.length
              for (let k = 0; k < marqueLen; k++) {
      
      
                  let space = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
                  let marqueeEl = marqueeElements[k];
      
                  let direction = marqueeEl.getAttribute('direction');
                  let scrolldelay = marqueeEl.getAttribute('scrolldelay') * 100;
                  let scrollamount = marqueeEl.getAttribute('scrollamount');
      
                  let marqueeText = marqueeEl.innerHTML;
      
                  marqueeEl.innerHTML = marqueeText + space;
                  marqueeEl.style.position = 'absolute'; 
      
                  let width = (marqueeEl.clientWidth + 1);
                  let i = (direction == 'rigth') ? width : 0;
                  let step = (scrollamount !== undefined) ? parseInt(scrollamount) : 3;
      
                  marqueeEl.style.position = '';
                  marqueeEl.innerHTML = marqueeText + space + marqueeText + space;
      
      
      
                  let x = setInterval( function () {
      
                      if ( direction.toLowerCase() == 'left') {
      
                          i = i < width ? i + step : 1;
                          marqueeEl.style.marginLeft = -i + 'px';
      
                      } else {
      
                          i = i > -width ? i - step : width;
                          marqueeEl.style.marginLeft = -i + 'px';
      
                      }
      
                  }, scrolldelay);
      
              }
          }
      
          start_marquee ();
      });
      

      这是一个有效的codepen

      【讨论】:

        【解决方案7】:

        我最近在一个需要字幕的网站上工作,最初使用的是dynamic marquee,效果很好,但我无法让文本从屏幕上开始。环顾四周,但找不到像我想要的那样简单的东西,所以我自己做了:

        <div id="marquee">
        

        <script type="text/javascript">
        
          let marquee = $('#marquee p');
          const appendToMarquee = (content) => {
            marquee.append(content);
          }
          
          const fillMarquee = (itemsToAppend, content) => {
            for (let i = 0; i < itemsToAppend; i++) {
              appendToMarquee(content);
            }
          }
          
          const animateMarquee = (itemsToAppend, content, width) => {
            fillMarquee(itemsToAppend, content);
            marquee.animate({left: `-=${width}`,}, width*10, 'linear', function() {
              animateMarquee(itemsToAppend, content, width);
            })
          }
        
        
          const initMarquee = () => {
            let width = $(window).width(),
            marqueeContent = "YOUR TEXT",
            itemsToAppend = width / marqueeContent.split("").length / 2;
            animateMarquee(itemsToAppend, marqueeContent, width);
          }
        
          initMarquee();
        </script>
        

        还有 CSS:

        #marquee {
          overflow: hidden;
          margin: 0;
          padding: 0.5em 0;
          bottom: 0;
          left: 0;
          right: 0;
          background-color: #000;
          color: #fff;
        }
        
        #marquee p {
          white-space: nowrap;
          margin: 0;
          overflow: visible;
          position: relative;
          left: 0;
        }
        

        【讨论】:

        • 嘿,这会一直将选取框内容附加到 p 标签。我觉得这是个坏主意。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        相关资源
        最近更新 更多