For Loop неправильно применяет nth-child

Используя Sass, я перебираю элементы с классом animateMe и применяю задержку анимации, используя индекс в качестве множителя.

@for $i from 1 through 100 {
  .animateMe:nth-child(#{$i}) {
    animation-delay: .5s * $i;
  }
}

Используя Angular, я применяю класс animateMe к div, только когда выполняются условия с ngClass.

<div id = "neededfoodnames" *ngFor = "let list of lists; let i = index" [ngClass] = "{'animateMe':lists[i-1]?.category != list.category && animate == true}">
.....
</div>

Этот класс должен применяться только в том случае, если категория элемента отличается от категории последнего элемента, а для параметра animate установлено значение true, что и есть.

animate: boolean = true;

В результате получается 4 блока с классом animateMe. Однако задержка анимации не применяется правильно, так как первый и второй div имеют правильные задержки 0,5 с и 1 с соответственно, а третий div имеет неправильную задержку 3 с.

Третий div получает класс animateMe:nth-child(6), но должен быть animateMe:nth-child(3).

Как я могу это исправить? Я создал StackBlitz для этого выпуска.

Кажется, весь CSS в порядке (поскольку в цикле sass все ваши классы создаются правильно, поэтому: nth-child работает должным образом). Вы имеете в виду, что у #neededfoodnames:nth-child(4) нет контента? Или вы пытаетесь перезаписать свой CSS с помощью ng-animate

stwilz 01.08.2018 02:39

также PS у вас есть несколько экземпляров #neededfoodnames :)

stwilz 01.08.2018 02:40

@stwilz Я удалил #neededfoodnames. Класс animateMe следует применять только к 4 блокам div, поэтому animateMe:nth-child(6) не должен существовать, но он существует.

cfoster5 01.08.2018 02:44
lists[i-1]?.category Я вижу здесь опечатку. точка после вопросительного знака в тернарном операторе.
DragonKnight 01.08.2018 04:23
Поведение ключевого слова "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
4
488
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В вашем массиве lists есть объекты, которые не считаются элементом animateMe. Только некоторые элементы имеют класс animateMe. Смотрите этот снимок экрана:

Этот снимок экрана объясняет, почему селектор nth-child не работает должным образом. Я вижу для вас два решения.

Решение 1

Лучшее решение - убрать эти элементы. В идеале у вас должны быть только элементы animateMe в этом конкретном разделе, например:

<div class = "animateMe">...</div>
<div class = "animateMe">...</div>
<div class = "animateMe">...</div>
<div class = "animateMe">...</div>

Вы должны найти способ отображения того же пользовательского интерфейса, но с меньшим количеством элементов div (например, с использованием большего количества стилей или просто перемещением элементов в разделах animateMe). Если по какой-то причине это невозможно, вы можете рассмотреть решение №2.

Решение 2

Альтернативным (и не таким чистым) решением для вас является предварительная обработка этого массива и сохранение атрибута order, который может использоваться циклом. Например:

lists = [{}, {order:1}, {}, {}, {order:2}, {}, {order:3}, {}, {}];

Затем вы можете пройти через массив и добавить атрибут data-order, который мы можем сопоставить с CSS:

<div *ngFor = "let list of lists; let i = index" [ngClass] = "{'animateMe': list.order && animate}" [attr.data-order] = "animate ? list.order : null">
    ...
</div>

Если свойство order не определено в вашем объекте, атрибут data-order не будет напечатан. Вот пример вывода:

<div>...</div>
<div class = "animateMe" data-order = "1">...</div>
<div>...</div>
<div>...</div>
<div class = "animateMe" data-order = "2">...</div>
<div>...</div>
<div class = "animateMe" data-order = "3">...</div>
<div>...</div>
<div>...</div>

Последний шаг - изменить код SaSS, чтобы он соответствовал этим элементам:

@for $i from 1 through 100 {
    div[data-order = "#{$i}"].animateMe {
        animation-delay: .5s * $i;
    }
}

Плохая практика - нацеливать элементы в CSS по их типу тега элемента, вы можете удалить div из приведенного выше Sass, и он все равно будет работать, как ожидалось.

ESR 01.08.2018 07:53

@EdmundReed Не могли бы вы разместить ссылку на ссылку, подтверждающую, что это плохая практика? Учитывая, что браузеры обычно индексируют элементы по имени узла, div должен сделать селектор более эффективным, и это, по определению, является хорошей практикой.

HugoTeixeira 01.08.2018 15:01

Возможно, это микроскопически лучше с точки зрения производительности, но с точки зрения ремонтопригодности и масштабируемости это плохая практика. Эта статья, похоже, объясняет, почему frontstuff.io/you-need-to-stop-targeting-tags-in-css. При таких вещах ремонтопригодность и масштабируемость, как правило, предпочтительнее крошечного прироста производительности.

ESR 02.08.2018 01:42

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