К сожалению, вы правы в том, что API Intersection Observer рассматривает пересечения целевого элемента только с его родительским элементом (root) или областью просмотра (viewport). Таким образом, если у вас есть два элемента, которые находятся на разных уровнях DOM и не являются дочерними друг друга, то вы не можете использовать Intersection Observer для отслеживания пересечения этих элементов напрямую.
Однако вы можете создать решение, которое будет работать, используя более сложную логику. Например, можно использовать события скролла для отслеживания видимости второго элемента относительно первого с помощью расчётов координат. Ниже приведён пример, как это можно реализовать:
```html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Intersection Observer Example</title>
<style>
body {
height: 200vh; /* Делаем страницу длинной */
}
#fixedElement {
position: fixed;
top: 20px;
left: 20px;
width: 100px;
height: 100px;
background-color: red;
}
#staticElement {
margin-top: 150vh; /* Располагаем второй элемент внизу страницы */
width: 100px;
height: 100px;
background-color: blue;
}
</style>
</head>
<body>
<div id="fixedElement">Fixed Element</div>
<div id="staticElement">Static Element</div>
<script>
const fixedElement = document.getElementById('fixedElement');
const staticElement = document.getElementById('staticElement');
window.addEventListener('scroll', () => {
const fixedRect = fixedElement.getBoundingClientRect();
const staticRect = staticElement.getBoundingClientRect();
// Проверяем, пересекаются ли области fixed и static элементов
if (
staticRect.top < fixedRect.bottom &&
staticRect.bottom > fixedRect.top
) {
staticElement.style.backgroundColor = 'green'; // Изменяем цвет, если пересекаются
} else {
staticElement.style.backgroundColor = 'blue'; // Сбрасываем цвет, если не пересекаются
}
});
</script>
</body>
</html>
```
В этом примере фиксированный элемент (красный) наблюдает за пересечением с статическим элементом (синий) с помощью событий прокрутки. Когда второй элемент входит в область видимости первого элемента, его цвет меняется на зелёный.
Обратите внимание, что это решение требует постоянного отслеживания события прокрутки, что может привести к ухудшению производительности, особенно на сложных страницах. Если вам нужно более эффективное решение, вы можете рассмотреть использование Debounce или Throttle для ограничения количества вызовов обработчика событий во время прокрутки.
Если у вас будут дополнительные вопросы, не стесняйтесь спрашивать!