Надежный способ добавить новый элемент

В моем приложении я создаю новый элемент каждую секунду. Они должны быть затемнены по мере их создания. Вот как я это сделал:

window.setInterval(() => {
    const element = document.createElement('div');
    element.classList.add('dot', 'hidden');
    document.getElementById('content').appendChild(element);
    element.classList.remove('hidden');
}, 1000);
.dot {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, .7);
    margin: 0 5px 5px 0;
    transition: opacity 1s;
}

.hidden {
    opacity: 0;
}

Я думал, что это заставит переход работать, но это не так. Я также попытался удалить класс hidden после задержки, например:

setTimeout(() => element.classList.remove('hidden'), 100);

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

Есть ли лучший, простой и надежный способ заставить его работать, не догадываясь о задержке setTimeout()?

возможный дубликат stackoverflow.com/questions/13733912/…

abhinav pratap 22.06.2019 22:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
560
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать CSS-анимации и избегать использования JavaScript, если вам нужно простое постепенное появление. Это будет работать только тогда, когда узел DOM отображается на экране. Если вам нужен более продвинутый контроль над анимацией, вы можете использовать JS.

@keyframes fadein {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

.dot {
   display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, .7);
    margin: 0 5px 5px 0;
    animation: 1s linear fadein;
 }

Да, я думаю, что анимация CSS лучше, чем переходы, когда мы хотим запустить их мгновенно. Ты согласен?

Robo Robok 22.06.2019 22:22

@RoboRobok да, я думаю, что анимация — это то, что нужно. Затем вы можете просто вставить элемент, и анимация запустится. Вы все еще можете сделать это с помощью переходов (проверьте мой ответ), но для этого требуется много JS, который в целом менее предпочтителен, чем чистое решение CSS.

Chirag Ravindra 22.06.2019 22:47

Ваша первоначальная проблема имеет смысл, потому что вы добавляете скрытый класс и удаляете его внутри одной и той же функции в своем блоке setTimeout. Помните, что браузер получает возможность повторного рендеринга только после завершения выполнения вашей функции. Это означает, что в строке, где вы добавляете свой класс hidden, он вообще бесполезен, потому что он сразу же удаляется позже в функции (до того, как браузер сможет выполнить рендеринг).

Я бы рекомендовал вставить ваш элемент DOM и сбросить его с помощью setTimeout или requestAnimationFrame. Кроме того, поскольку синхронизация setInterval и setTimeout не является полностью надежной, может иметь смысл использовать событие transitionend одного элемента для запуска добавления следующего.

(function() {
  const container = document.getElementById('container');
  let count = 0;

  function addElement() {
    const div = document.createElement('div');
    div.innerHTML = 'item ' + ++count
    container.append(div);
    div.classList.add('item')
    div.addEventListener('transitionend', addElement)
    setTimeout(function() {
      div.classList.add('show')
    }, 0)
  }

  addElement()

})()
div {}

div.item {
  opacity: 0;
  transition: opacity 1s;
}

div.item.show {
  opacity: 1;
}
<hr>

<div id = "container">

</div>

Css transition лучше всего работает, когда вы что-то прячете.

Итак, вот решение, использующее только javascript.

window.setInterval(() => {
    const element = document.createElement('div');
    element.classList.add('dot');
    document.getElementById('content').appendChild(element);
    fade(element,0.1);
}, 1000);

// This will inc opacity by 0.1 each 100ms 
function fade(item, i){
i += 0.1;
item.style.opacity = i;
if (i< 1)
setTimeout(()=> fade(item,i), 100);
}
.dot {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, .7);
    margin: 0 5px 0px 5px;
}



#content {
background:black;
}
<div id = "content"></div>

Раньше я делал это на JS еще во времена jQuery, но в наши дни это не самый удобный и эффективный способ, не так ли?

Robo Robok 22.06.2019 22:50

Ну, это зависит от того, для меня использование js вместо css всегда лучше, поэтому я не забочусь о веб-браузере и т. д. А использование библиотеки, такой как Jq, еще лучше.

Alen.Toma 22.06.2019 22:52

У меня наоборот, я всегда предпочитаю использовать CSS, когда это возможно.

Robo Robok 22.06.2019 22:54

Другие вопросы по теме