#javascript #html #css
Есть бегущая строка body { margin: 0; padding: 0; } #quotes-container { width: 100%; height: 51px; background-color: rgba(0, 0, 0, 0.8); overflow: hidden; white-space: nowrap; } #quotes { display: inline-block; font-family: "Tahoma"; padding: 1em 1em 1em 100%; margin: 0; animation: scroll 30s infinite linear; } #quotes li { display: inline-block; margin-right: 40px; font-weight: bold; list-style: none; color: #fff; width: 210px; } #quotes li span { margin: 0 10px; font-weight: normal; color: #aab9d1; } #quotes li span:nth-child(odd) { position: relative; } #quotes li span:nth-child(odd):after { position: absolute; top: 0; right: -14px; content: "|"; } #quotes li.up span:nth-child(odd) { position: relative; margin-left: 20px; } #quotes li.up span { color: #00ca51; } #quotes li.up span:nth-child(odd):before { position: absolute; left: -14px; top: 6px; content: ' '; border-width: 0 5px 9px 5px; border-style: solid; border-color: #00ca51 transparent; } #quotes li.down span:nth-child(odd) { position: relative; margin-left: 20px; } #quotes li.down span { color: #f12424; } #quotes li.down span:nth-child(odd):before { position: absolute; left: -14px; top: 6px; content: ' '; border-width: 9px 5px 0 5px; border-style: solid; border-color: #f12424 transparent; } #quotes li.round span:nth-child(odd) { position: relative; margin-left: 20px; } #quotes li.round span:nth-child(odd):before { position: absolute; left: -14px; top: 7px; width: 8px; height: 8px; border-radius: 8px; background-color: #aab9d1; content: ' '; } -webkit-keyframes scroll 0% { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0) } -webkit-keyframes scroll 100% { -webkit-transform: translate(-100%, 0); -ms-transform: translate(-100%, 0); transform: translate(-100%, 0) } @-webkit-keyframes scroll { 0% { -webkit-transform: translate(0, 0); transform: translate(0, 0) } 100% { -webkit-transform: translate(-100%, 0); transform: translate(-100%, 0) } } @keyframes scroll { 0% { -webkit-transform: translate(0, 0); transform: translate(0, 0) } 100% { -webkit-transform: translate(-100%, 0); transform: translate(-100%, 0) } }Никак не могу понять, как сделать так, чтобы не было такого большого промежутка между заходом за пределы экрана и выходом, т.е. сделать так, чтобы строка еще до конца не ушла за пределы экрана слева, а справа уже появляется. И еще: бывает, что анимация начинает притормаживать через некоторое время. Как быть с этим? Спасибо!
- Ripple0.62970.6314
- Litecoin159.06161.25
- Ethereum518.4522.21
- USDCHF0.94670.9468
- USDJPY104.903104.911
- EURCAD1.591991.592
- Dash407.87410.39
- AUDUSD0.772410.77249
- Bitcoin84368456.1
- NZDUSD0.727070.72717
- EURUSD1.237421.23762
- AUDCAD0.99370.9942
- GBPUSD1.416511.41656
Ответы
Ответ 1
С подходом — "каждому элементу свой ID" — я не согласен и хотел бы пояснить. ID — это уникальный идентификатор для конкретного элемента. Ключевое слово здесь — "уникальный" и оно подразумевает, что такой ID будет только один на странице. При использовании данного атрибута, теряется "гибкость" в манипуляциях с элементами (к примеру, клонирование или создание элемента с таким же значением ID). Появление элементов с одинаковым идентификатором может привести к непредсказуемым результатам — где-то может обрабатываться только первый элемент, а где-то код может оказаться полностью неработоспособным. Поэтому, применение ID должно быть там, где это действительно оправданно и/или необходимо. В большинстве случаев, можно и нужно использовать другие способы доступа к элементам: по пользовательским атрибутам (data-attr); по именам классов и другим CSS-селекторам, с помощью querySelector; по дочерним элементам, используя children[]. В коде из вопроса, значения ID вложенных элементов отличаются от родительского идентификатора, только префиксами (bid и ask) и более никакой полезной нагрузки не несут. При этом, структура всех пунктов одинакова. В этом случае, меняем атрибут id на пользовательский атрибут data-curr, а далее, обращаемся к потомкам с помощью children[n], т.к. эти элементы всегда стоят в одном и том же порядке. Таким образом, можно будет клонировать и создавать элементы, не боясь дублирования ID. Я уже описывал здесь алгоритм и самую распространённую ошибку "бегущей строки" с помощью animation, т.ч. повторяться не буду. Добавлю только, что для правильной работы данного подхода, есть обязательное условие - ширина (высота, для вертикальной строки) скроллируемого элемента должна быть вдвое больше максимальной ширины (высоты) контейнера, в котором элемент прокручивается. window.onload = function() { var oQuotes = document.querySelector('#quotes-container ul.quotes'); /* Функция дублирования пунктов */ function fDoublingQuotes() { let nElem = oQuotes.children.length; for (let i = 0; i < nElem; i++) { oQuotes.appendChild(oQuotes.children[i].cloneNode(true)); } oQuotes.style.animationDuration = '1s,' + (nElem * 2) + 's'; } /* Функция для изменения значений пунктов */ function fSetQuote(sId, sClass, sBid, sAsk) { let aQuotes = oQuotes.querySelectorAll('li[data-curr="' + sId + '"]'); aQuotes.forEach(function(item) { item.className = sClass || item.className; item.children[0].innerText = sBid || item.children[0].innerText; item.children[1].innerText = sAsk || item.children[1].innerText; }); } document.querySelector('button').addEventListener('click', function() { fSetQuote('Ripple', '', '0', '1'); }); fDoublingQuotes(); } body { margin: 0; padding: 0; } #quotes-container { position: relative; height: 51px; width: 100%; overflow: hidden; white-space: nowrap; background-color: rgba(0, 0, 0, 0.8); } #quotes-container:before, #quotes-container:after { content: ''; position: absolute; height: 51px; width: 25px; top: 0; z-index: 1; background: linear-gradient(90deg, rgba(0, 0, 0, 1.0), rgba(0, 0, 0, 0.0)); } #quotes-container:after { right: 0; transform: scaleX(-1); } .quotes { display: inline-block; margin: 0; padding: 0; font-size: 0; /* Важно! */ animation: begin 1s ease forwards, scroll 30s linear 1s infinite; } .quotes li { display: inline-block; margin: 1em 40px 1em 0; font: bold 16px 'Tahoma'; list-style: none; color: #fff; } .quotes li span { margin: 0 10px; font-weight: normal; color: #aab9d1; } .quotes li span:nth-child(odd) { position: relative; } .quotes li span:nth-child(odd):after { content: '|'; position: absolute; right: -14px; top: -1; } .quotes li.up span:nth-child(odd), .quotes li.down span:nth-child(odd), .quotes li.round span:nth-child(odd) { margin-left: 20px; } .quotes li.round span:nth-child(odd):before { content: '⚫'; position: absolute; left: -16px; top: 0px; } .quotes li.up span { color: #00ca51; } .quotes li.up span:nth-child(odd):before { content: '▲'; position: absolute; left: -18px; top: 1px; } .quotes li.down span { color: #f12424; } .quotes li.down span:nth-child(odd):before { content: '▼'; position: absolute; left: -18px; top: 1px; } @keyframes scroll { 0% { transform: translateX(0%); } 100% { transform: translateX(-50%); } } @keyframes begin { 0% { transform: scaleY(0); } 100% { transform: scaleY(1); } }Если что-то будет непонятно по коду и логике, то спрашиваем в комментариях - отвечу или дополню ответ.
- Ripple0.62970.6314
- Litecoin159.06161.25
- Ethereum518.4522.21
- USDCHF0.94670.9468
- USDJPY104.903104.911
- EURCAD1.591991.592
- Dash407.87410.39
- AUDUSD0.772410.77249
- Bitcoin84368456.1
- NZDUSD0.727070.72717
- EURUSD1.237421.23762
- AUDCAD0.99370.9942
- GBPUSD1.416511.41656
Ответ 2
Как вариант ... * { list-style: none; } .wrapper { width: 100%; overflow: hidden } ul { display: flex; justify-content: space-around; position: relative; width: 200%; animation: scroll 10s infinite linear; } li { text-align:center; background:#fbfbfb; } @keyframes scroll { 0% { left: 0%; } 100% { left: -110%; } }либо такой вариант : https://codepen.io/topicstarter/pen/OvxxXP?editors=1100
- item1
- item2
- item3
- item4
- item5
- item6
- item7
- item8
- item9
- item10
Комментариев нет:
Отправить комментарий