Как предотвратить анимацию только для последнего ребенка

У меня есть растущий список div. Пользователь может нажать кнопку, чтобы добавить новый div внизу.

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

Когда добавляется новая строка, я бы не хотел иметь анимацию постепенного появления.

Я пытался использовать:

div:last-child {
  animation: none;
}

Это работает только при первом добавлении нового div. При всех последующих добавлениях анимация применяется независимо.

Пожалуйста, проверьте эту демонстрацию ниже, чтобы понять, что я имею в виду:

function addRow(text) {
  var d = document.createElement('div');
  d.innerHTML = text;
  var root = document.querySelector('main');
  root.appendChild(d);
}
body {
  background: #222;
}

main > div {
  background: #444;
  border: 1px solid green;
  animation: fade-in 1s;
}

div:last-child {
  background: #999;
  animation: none;
}

@keyframes fade-in {
  from { opacity: 0 }
  to { opacity: 1 }
}
<main>
  <div>1</div>
  <div>2</div>
  <div>3</div>
</main>
<button type = "button" onclick = "addRow('hello')">Add row</button>

Как сделать так, чтобы анимация запускалась для всего списка в первый раз, но предотвращала ее при последующих добавлениях?

«Как я могу гарантировать, что анимация запускается для всего списка в первый раз, но предотвратить ее при последующих добавлениях?» Какие браузеры/минимальные версии необходимо поддерживать?
Raymond Nijland 27.06.2019 18:18

В идеале мне нужно поддерживать до IE11, мне не нужно поддерживать мобильные браузеры

Simone 27.06.2019 18:28
«В идеале мне нужно поддерживать до IE11» как в IE6 до IE11? я надеюсь, что нет, я предполагаю, что вы имеете в виду IE9-IE11.
Raymond Nijland 27.06.2019 18:37

Слава богу, нет :) Я имею в виду, что IE11 будет самым старым

Simone 27.06.2019 18:38

Тогда я почти уверен, что ответ @AlvaroMontoro — это то, что вы ищете, поскольку это не ставит под угрозу поддержку браузера.

Raymond Nijland 27.06.2019 18:39
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
6
5
182
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Один вариант, немного меняющий JS и CSS:

  1. Добавить класс к вновь добавленным элементам в список

    d.className = "added";
    
  2. Примените анимацию только к div, у которых нет этого класса

    main > div:not(.added) {
      animation: fade-in 1s;
    }
    

Начальные div не имеют этого класса, поэтому они будут анимированы при загрузке страницы, но div, добавленные позже (с указанным вами именем класса), не имеют анимации.

Вот демонстрация того, как это будет основано на вашем коде:

function addRow(text) {
  var d = document.createElement('div');
  d.className = "added";
  d.innerHTML = text;
  var root = document.querySelector('main');
  root.appendChild(d);
}
body {
  background: #222;
}

main > div {
  background: #444;
  border: 1px solid green;  
}

main > div:not(.added) {
  animation: fade-in 1s;
}

div.added:last-child {
  background: #999;
}

@keyframes fade-in {
  from { opacity: 0 }
  to { opacity: 1 }
}
<main>
  <div>1</div>
  <div>2</div>
  <div>3</div>
</main>
<button type = "button" onclick = "addRow('hello')">Add row</button>

Хорошее решение, так как :not() не понадобятся другие версии браузера, тогда :last-child (при условии, что списки совместимости браузеров в Интернете верны), поэтому это не поставит под угрозу поддержку браузера, поэтому +1 за это.

Raymond Nijland 27.06.2019 18:25

How do I ensure the animation runs on the whole list the first time

Просто примените его ко всему списку

function addRow(text) {
  var d = document.createElement('div');
  d.innerHTML = text;
  var root = document.querySelector('main');
  root.appendChild(d);
}
body {
  background: #222;
}

main > div {
  background: #444;
  border: 1px solid green;
}
main {
  animation: fade-in 1s;
}

@keyframes fade-in {
  from { opacity: 0 }
  to { opacity: 1 }
}
<main>
  <div>1</div>
  <div>2</div>
  <div>3</div>
</main>
<button type = "button" onclick = "addRow('hello')">Add row</button>

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