【问题标题】:Why is <marquee> deprecated and what is the best alternative?为什么 <marquee> 不推荐使用,最好的选择是什么?
【发布时间】:2015-08-11 20:23:35
【问题描述】:

我对 HTML 标签 &lt;marquee&gt; 的好奇已经很久了。

您可以在MDN specification:

中找到

已过时 此功能已过时。尽管它在某些浏览器中可能仍然有效,但不鼓励使用它,因为它可能随时被删除。尽量避免使用它。

W3C wiki

不,真的。不要使用它。

我搜索了几篇文章,发现一些关于 CSS 相关替换的内容。 CSS 属性如:

marquee-play-count
marquee-direction
marquee-speed

但看起来,它们不起作用。它们在 2008 年是规范的一部分,但在 2014 年被排除在外

W3 Consortium 提出的一种方法是使用 CSS3 animations,但对我来说,这似乎比易于维护的 &lt;marquee&gt; 复杂得多。

还有很多JS alternatives,有很多源代码,您可以将它们添加到您的项目中并使它们变得更大。

我一直在阅读以下内容:“永远不要使用选取框”、“已过时”。我不明白为什么。

那么,谁能向我解释一下,为什么不推荐使用选框,为什么使用它如此“危险”以及最简单的替代方法是什么

我找到了example,看起来不错。当您使用良好的浏览器支持所需的所有前缀时,您有大约 20-25 行 CSS,其中 2 个值是硬编码的(开始和停止缩进),具体取决于文本长度。这个解决方案不是很灵活,你不能用它来创建从下到上的效果。

【问题讨论】:

  • 最简单的替代方法是不移动您希望用户阅读的文本 :)
  • 好吧,使用 marquee 不会杀死用户,但如果浏览器供应商决定在下一个版本中删除它,用户将无法再看到内容。
  • @areim 也许这首歌是一个不好的例子,因为在播放歌曲时没有真正阅读滚动标题。您看到的这些选框也存在于日常生活中,但对于网络,它可能不适用。就我个人而言,当我看到字幕时,我通常会完全忽略它,因为我不想等待和阅读。使用 css3 动画,设置选取框并不复杂
  • 是的,我也不喜欢它,并且忽略了网络上所有烦人的移动事物,但是为什么不推荐使用它呢?这很清楚也很容易。它有什么真正的问题吗?不能只是“大多数人不喜欢它”。今天有视差,滑块的音调:-D

标签: javascript html css marquee


【解决方案1】:

我认为您不应该移动内容,但这并不能回答您的问题...看看 CSS:

.marquee {
    width: 450px;
    line-height: 50px;
    background-color: red;
    color: white;
    white-space: nowrap;
    overflow: hidden;
    box-sizing: border-box;
}
.marquee p {
    display: inline-block;
    padding-left: 100%;
    animation: marquee 15s linear infinite;
}
@keyframes marquee {
    0%   { transform: translate(0, 0); }
    100% { transform: translate(-100%, 0); }
}

这里是codepen

编辑

这里是自下而上codepen

【讨论】:

  • 真的很好,但是如果滚动内容中有多个 div 或多个 P 则不起作用:(
  • 要回答是否有人因为过时而摔倒的问题,其实很简单:)。把整个东西放在一个 div 中,然后把元素放在 span codepen.io/scwall/pen/mdemeER
  • @PascaldeSélys 如何让它在最后一个跨度和重复的第一个跨度之间没有任何空格重复(最后一个跨度后没有空格?)
  • 如果你想在没有空格的情况下重复,你需要通过 JavaScript 克隆 p 节点并将其附加到第一个节点之后。然后您可以从transform: translate(0, 0)transform: translate(-50%, 0) 进行动画处理,并在没有任何可见中断的情况下重复(前提是两个p 节点的宽度大于容器的宽度)。
【解决方案2】:

&lt;marquee&gt; 从来都不是任何 HTML 规范的一部分,并且您链接到的是 CSS 规范,因此很难弃用从未包含的内容。 HTML 是关于文档的结构,而不是它的呈现。因此,将自动画元素作为 HTML 的一部分并不符合这些目标。动画在 CSS 中。

【讨论】:

【解决方案3】:

您只需在 CSS 中定义一次类和附加循环动画,然后在您需要的任何地方使用它。但是,正如许多人所说的那样 - 这是一个有点烦人的做法,而且有理由说明为什么这个标签已经过时了。

.example1 {
  height: 50px;	
  overflow: hidden;
  position: relative;
}
.example1 h3 {
    position: absolute;
    width: 100%;
    height: 100%;
    margin: 0;
    line-height: 50px;
    text-align: center;

    /* Starting position */
       -moz-transform:translateX(100%);
       -webkit-transform:translateX(100%);	
       transform:translateX(100%);

 /* Apply animation to this element */	
       -moz-animation: example1 15s linear infinite;
       -webkit-animation: example1 15s linear infinite;
       animation: example1 15s linear infinite;
}

/* Move it (define the animation) */
      @-moz-keyframes example1 {
       0%   { -moz-transform: translateX(100%); }
       100% { -moz-transform: translateX(-100%); }
      }
      @-webkit-keyframes example1 {
       0%   { -webkit-transform: translateX(100%); }
       100% { -webkit-transform: translateX(-100%); }
      }
      @keyframes example1 {
       0%   { 
       -moz-transform: translateX(100%); /* Firefox bug fix */
       -webkit-transform: translateX(100%); /* Firefox bug fix */
       transform: translateX(100%); 		
       }
       100% { 
       -moz-transform: translateX(-100%); /* Firefox bug fix */
       -webkit-transform: translateX(-100%); /* Firefox bug fix */
       transform: translateX(-100%); 
       }
      }
    
<div class="example1">
   <h3>Scrolling text... </h3>
</div>

【讨论】:

    【解决方案4】:

    如前所述:最简单的替换是 CSS 动画

    致所有对选框的批评:

    它是一个非常有用的 UI 工具, 我只是在悬停时使用它, 在有限的空间内显示更多信息。

    mp3 播放器的示例非常好, 甚至我的车载收音机也在使用该效果来显示当前歌曲。

    所以我认为这没什么错......

    【讨论】:

    • 但就他们而言,HTML 是“超文本标记语言”。动画不是文档结构(ergo 标记)问题。这是一个演示问题。这就是为什么它现在被降级为 CSS 和/或 Javascript 来实现。
    • Den 为什么有很棒的输入?嗯?
    • @TimGoyer 我只是在思考一般使用选取框效果,就像对人们说:“不要移动文本!”的回答。用 CSS 而不是 HTML 来实现它是更好和合理的 IMO
    • @user7892745 - 在表单上输入数据输入是一个文档结构问题。使它们“很棒”是一个样式/脚本问题,这取决于您对“很棒”的定义。 Wolfgang - 我同意最好将动画实现为 CSS/脚本效果。我只是指出 HTML 是关于文档结构的,这就是不推荐使用 的原因。除了
      标签已经提供的之外,它没有提供基于结构的好处。它只是附加了一个应该通过脚本或样式处理的动画。
    【解决方案5】:

    我知道这是几年前回答的,但我在检查时发现了这个 this。当我检查时,我发现了这个。

    @keyframes scroll {
        from {
            transform: translate(0,0)
        }
    
        to {
           transform: translate(-300px,0)
        }
    }
    
    .resultMarquee {
        animation: scroll 7s linear 0s infinite;
        position: absolute
    }
    

    【讨论】:

    • 欢迎几个月后...您链接的 google 的整个第一个结果页面现在是一个网络资源列表,解释了 marquee 已被弃用,但没有指定解决方案。搜索“HTML marquee replacement”时,第一个结果就是这个stackoverflow页面,所以不需要重定向回google。
    • @grek40b 我猜是这样,但是用其他搜索引擎搜索它或者一般用堆栈溢出搜索它呢?
    【解决方案6】:

    我创建了一个 jQuery 脚本,它将用标准的 div 替换旧的 marquee 标签。该代码还将解析marquee 属性,例如directionscrolldelayscrollamount。实际上代码可以跳过 jQuery 部分但我懒得这样做,而 vanilla JS 部分实际上是我从@Stano answere from here修改的解决方案

    代码如下:

    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

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 2012-05-04
      • 2016-02-23
      • 2017-11-04
      • 2011-10-22
      • 2011-04-11
      • 2021-10-12
      • 2012-12-07
      • 2012-05-16
      相关资源
      最近更新 更多