#javascript #dom
#javascript #dom
Вопрос:
У меня есть следующий код…
<div id="wrapper">
<div id="test1"
class="scroll-item">Simple Test 1</div>
<div id="test2"
class="scroll-item">Simple Test 2</div>
<div id="test3"
class="scroll-item">Simple Test 3</div>
</div>
...
const onChange = function(changes) {
changes.forEach(change => {
change.intersectionRatio <= 0 ?
change.target.classList.remove("selected"):
change.target.classList.add("selected");
});
}
const intersectionObservers = [];
const body = document.querySelector("#wrapper");
const scrollItems = body
.querySelectorAll(".scroll-item");
scrollItems.forEach(item=>{
const intersectionObserver = new IntersectionObserver(onChange, {
root: body
});
intersectionObserver.observe(item);
intersectionObservers.push(item);
});
Но когда я запускаю это, я не могу выбрать средний div. Я попытался добавить корневое поле…
const intersectionObserver = new IntersectionObserver(onChange, {
root: body,
rootMargin: "-20px"
});
Это работает несколько, но имеет странное поведение. Иногда выбираются два элемента, и тест 2, похоже, все еще не выбран правильно. Также, если я удалю тест 3, test2 никогда не будет работать. Чего мне не хватает?
Пример, который я использую, доступен здесь
Комментарии:
1. Можете ли вы уточнить, чего вы пытаетесь достичь? Насколько я вижу,
onChange
обработчик добавляет или удаляетselected
класс CSS из.scroll-items
, но в CSS нетselected
класса в ссылке github, которой вы поделились.2. То, что делается с выбранным классом, не имеет значения в рамках вопроса, просто он добавляется. Не могли бы вы немного лучше объяснить, какую информацию вы ищете. Цель состоит в том, чтобы добавить выбранный класс к элементу, который находится в окне просмотра, а затем удалить, когда другой достигнет вершины
3. Если я правильно вас понял, вы хотите, чтобы один
scroll-item
оставался выбранным до тех пор, пока другой не достигнет вершины?4. Правильно, но я также не хочу, чтобы он оставался включенным после выхода из области просмотра. Я не уверен, что они будут следовать один за другим организованно, как в демонстрации. Таким образом, он не может просто добавить выбранный, когда он попадает в верхнюю часть, ему также необходимо удалить класс, когда нижняя часть исчезает из поля зрения.
5. Также я могу сделать это с помощью ограничивающего прямоугольника, но у этого возникают проблемы, когда у меня есть заголовки или элемент находится в абсолютном положении. Итак, этот вопрос специфичен для IntersectionObserver