Подтвердить что ты не робот

Почему <marquee> устарел и что является лучшей альтернативой?

Дольше я интересуюсь тегом HTML <marquee>.

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

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

или W3C wiki:

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

Я искал несколько статей и нашел некоторое упоминание о соответствующей замене CSS. CSS-атрибуты:

marquee-play-count
marquee-direction
marquee-speed

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

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

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

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

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

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

4b9b3361

Ответ 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.

Edit

Ниже представлен снизу codepen.

Ответ 2

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

Ответ 3

Как указано выше: самая простая подстановка - это CSS-анимация

Для всех критиков шатра:

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

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

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

Ответ 4

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

Ответ 5

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

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

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

.resultMarquee {
    animation: scroll 7s linear 0s infinite;
    position: absolute
}

Ответ 6

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

Вот код:

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 ();
});

А вот и рабочий кодекс

Ответ 7

Я не думаю, что кто-то действительно ответил на вопрос о том, почему вы не должны использовать шатер и почему люди ненавидят это, лол.