Почему ‹marquee› устарел и какова лучшая альтернатива?

Мне давно интересно узнать о HTML-теге <marquee>.

Вы можете найти в спецификации MDN:

Устарело. Эта функция устарела. Хотя он все еще может работать в некоторых браузерах, его использование не рекомендуется, поскольку оно может быть удалено в любое время. Старайтесь не использовать его.

или на вики W3C:

Нет, правда. не используйте это.

Я просмотрел несколько статей и нашел упоминания о замене CSS. Атрибуты CSS, такие как:

marquee-play-count
marquee-direction
marquee-speed

но вроде не работают. Они были частью спецификации в году 2008, но они были исключены в году 2014

Один из способов, предложенный консорциумом W3, - это использование анимации CSS3, но мне кажется намного сложнее, чем простой в обслуживании <marquee>.

Также существует множество альтернатив JS с большим количеством исходного кода, который вы можете добавить в свои проекты и сделать их больше.

Я всегда читаю такие вещи, как: «никогда не используйте рамку», «устарело». И я не понимаю почему.

Итак, может ли кто-нибудь объяснить мне, почему не рекомендуется использовать marquee, почему его использование так "опасно" и какова самая простая замена?

Я нашел пример, выглядит неплохо. Когда вы используете все префиксы, необходимые для хорошей поддержки браузером, у вас есть около 20-25 строк CSS с двумя жестко запрограммированными значениями (начальный и конечный отступ), в зависимости от длины текста. Это решение не такое гибкое, и с его помощью вы не сможете создать эффект снизу вверх.


person areim    schedule 11.08.2015    source источник
comment
Самая простая замена - не перемещать текст, который должен прочитать пользователь :)   -  person doldt    schedule 11.08.2015
comment
Что ж, использование marquee не убьет пользователей, но если поставщик браузера решит удалить его в следующей версии, пользователи больше не смогут видеть контент.   -  person Teemu    schedule 11.08.2015
comment
@doldt, да, я согласен, но у вас он есть везде, представьте, например, плейлист с песнями, и когда у них более длинные имена, они перемещаются в большинстве приложений - это настоящая проблема, которую трудно решить с JS / CSS   -  person areim    schedule 11.08.2015
comment
@areim, вам стоит подумать о переходе на лучший музыкальный проигрыватель :-)   -  person Lucas Trzesniewski    schedule 11.08.2015
comment
@areim, возможно, песня - плохой пример, потому что на самом деле нет возможности прочитать прокручиваемый заголовок, когда песня играет. Кроме того, эти рамки, которые вы видите, используются в повседневном мире, но для Интернета они могут не применяться. Лично для меня, когда я вижу шатер, я обычно просто игнорирую его, потому что не хочу ждать и читать. С анимацией css3 настроить выделение не так уж и сложно.   -  person Huangism    schedule 11.08.2015
comment
Да, мне это тоже не нравится, и я игнорирую все раздражающие движущиеся объекты в сети, но почему это устарело? Это было ясно и легко. Есть ли с этим какие-то реальные проблемы? Не может быть, просто многим это не нравится. Сегодня есть тона паралаксов, ползунков :-D   -  person areim    schedule 11.08.2015
comment
stackoverflow.com/questions/21233033/css3-marquee-effect   -  person VXp    schedule 19.09.2018


Ответы (6)


Я не думаю, что вам следует перемещать контент, но это не отвечает на ваш вопрос ... Взгляните на 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 снизу вверх.

person Thomas Bormans    schedule 11.08.2015
comment
Действительно хорошо, но это не работает, если у вас есть несколько div или несколько P в прокручиваемом контенте :( - person Radon8472; 20.02.2018
comment
Ответить на вопрос, упадёт ли кто-нибудь на него из-за морального износа, на самом деле довольно просто :). поместите все это в div, а затем поместите элементы в диапазон codepen.io/scwall/pen/mdemeER < / а> - person Pascal de Sélys; 26.04.2020
comment
@ PascaldeSélys, как мне заставить его повторяться без пробелов между последним интервалом и повторяющимся первым интервалом (без пробелов после последнего интервала?) - person josh; 11.09.2020

Вам просто нужно один раз определить класс и прикрепленную анимацию цикла в 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>

person Artanis    schedule 11.08.2015

<marquee> никогда не был частью какой-либо спецификации HTML, и то, на что вы ссылаетесь, является спецификацией CSS, поэтому трудно отказаться от того, что никогда не было включено. HTML - это структура документа, а не его представление. Таким образом, наличие самоанимируемого элемента как части HTML не соответствует этим целям. Анимация в CSS.

person Rob    schedule 11.08.2015
comment
@ user7892745 ваш аргумент НЕ делает тег устаревшим - person honk31; 30.05.2017
comment
@BarryCap Устаревшие функции - выделение Поскольку элемент никогда не был частью какой-либо спецификации HTML, но его использование было слишком распространенным, необходимо было создать запись в этой спецификации, чтобы пометить ее как устаревшую. - person Rob; 13.07.2021

Как было сказано ранее: самая простая замена - это CSS-анимация.

Всем критикам шатра:

Это очень полезный инструмент для пользовательского интерфейса, я использую его только при наведении курсора, чтобы отображать больше информации в ограниченном пространстве.

Пример для mp3-плеера отличный, даже моя автомагнитола использует эффект, чтобы показать текущую песню.

Так что ничего плохого в этом нет, мое мнение ...

person Wolfgang Blessen    schedule 11.08.2015
comment
Но с их точки зрения HTML - это язык разметки гипертекста. Анимация - это не проблема структуры документа (эрго-разметки). Это проблема презентации. Вот почему теперь для реализации он передан CSS и / или Javascript. - person Tim Goyer; 12.08.2016
comment
Ден, почему у нас крутые входы? Хм? - person ; 08.05.2017
comment
@TimGoyer Я просто размышляю об использовании эффекта Marquee в целом, как ответ людям, говорящим: не перемещайте текст! Реализация его с помощью CSS вместо HTML ‹marquee› лучше и разумнее IMO - person Wolfgang Blessen; 08.05.2017
comment
@ user7892745 - наличие входных данных в форме для ввода данных является проблемой структуры документа. Сделать их крутыми - это задача стилизации / написания сценариев, в зависимости от вашего определения крутизны. Вольфганг: Я согласен, что анимацию лучше всего реализовать как эффект CSS / скрипта. Я просто указывал, что HTML касается структуры документа, и именно поэтому ‹marquee› было объявлено устаревшим. Он не предлагает преимуществ, основанных на структуре, помимо того, что уже предлагает тег ‹div›. Он просто прикрепляет анимацию, которую нужно обрабатывать с помощью скриптов или стилизации. - person Tim Goyer; 21.06.2017

Я создал сценарий jQuery, который заменит старый тег marquee на стандартный div. Код также проанализирует атрибуты marquee, такие как direction, scrolldelay и scrollamount. На самом деле код может пропускать часть jQuery, но я чувствовал себя слишком ленивым для этого, а часть vanilla JS на самом деле является решением, которое я модифицировал из @Stano answere из здесь

Вот код:

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

person Ale    schedule 16.10.2018

Я знаю, что на этот вопрос был дан ответ пару лет назад, но я обнаружил это при просмотре этого. Когда я осмотрел, я нашел это.

@keyframes scroll {
    from {
        transform: translate(0,0)
    }

    to {
       transform: translate(-300px,0)
    }
}

.resultMarquee {
    animation: scroll 7s linear 0s infinite;
    position: absolute
}
person Bryan Zeng    schedule 22.10.2017
comment
Добро пожаловать, несколько месяцев спустя ... вся первая страница результатов вашего связанного Google теперь представляет собой список веб-ресурсов, которые объясняют, что marquee устарела, без указания решения. При поиске замены выделения HTML первым результатом является эта страница stackoverflow, поэтому нет необходимости перенаправлять обратно в Google. - person grek40; 16.04.2018
comment
@ grek40b Думаю, да, но как насчет поиска его с помощью какой-либо другой поисковой системы или поиска его с помощью переполнения стека в целом? - person Bryan Zeng; 21.04.2018