Определить ID элемента, который в поле зрения (JS, jQuery)

есть ли решение на JS или jQuery, которое определяет id элементов в поле зрения в обратно прокручиваемом блоке?

К примеру

<div class="group-container">
    <div id ="cell-1" class="group">Cell 1</div>
    <div id ="cell-2" class="group">Cell 2</div>
    <div id ="cell-3" class="group">Cell 3</div>
    <div id ="cell-4" class="group">Cell 4</div>
    <div id ="cell-5" class="group">Cell 5</div>
    <div id ="cell-6" class="group">Cell 6</div>
    <div id ="cell-7" class="group">Cell 7</div>
    <div id ="cell-8" class="group">Cell 8</div>
    <div id ="cell-9" class="group">Cell 9</div>
    <div id ="cell-10" class="group">Cell 10</div>
</div>

<style>
.group-container {
    overflow-y: scroll;
    height: 200px;
    width: 300px;
    transform: scaleY(-1);
}
.group {
    width: 100%;
    height: 50px;
    transform: scaleY(-1);
}
</style>

Необходимо определить id элемента, который находится в верхней части или же id всех элементов, который видны


Ответы (1 шт):

Автор решения: Leonid

Видны, в данном случае, - полностью видны. Если достаточно, чтобы виден был кусочек, то условие в filter можно поменять соответствующим образом.

const container = document.querySelector('.group-container');
const cells = [...container.querySelectorAll('.group')];
const text = document.getElementById('text');

const box = container.getBoundingClientRect();

container.addEventListener('scroll', isVisible);
window.addEventListener('resize', isVisible);
window.addEventListener('scroll', isVisible);
isVisible();

function isVisible(){
    let visibleCellIds = cells.filter(cell => {
        const cbox = cell.getBoundingClientRect();
        return cbox.top >= box.top && cbox.bottom <= box.bottom && cbox.top >= 0 && cbox.bottom <= window.innerHeight;
    }).map(c => c.getAttribute('id'));
    
    text.innerHTML = `Видны: ${visibleCellIds.join(',')}.<br> Верхний: ${visibleCellIds[visibleCellIds.length-1]}`;
}
<div class="group-container">
    <div id ="cell-1" class="group">Cell 1</div>
    <div id ="cell-2" class="group">Cell 2</div>
    <div id ="cell-3" class="group">Cell 3</div>
    <div id ="cell-4" class="group">Cell 4</div>
    <div id ="cell-5" class="group">Cell 5</div>
    <div id ="cell-6" class="group">Cell 6</div>
    <div id ="cell-7" class="group">Cell 7</div>
    <div id ="cell-8" class="group">Cell 8</div>
    <div id ="cell-9" class="group">Cell 9</div>
    <div id ="cell-10" class="group">Cell 10</div>
</div>

<div id="text" style="position: fixed; right:0; top:0"></div>

<style>
.group-container {
    overflow-y: scroll;
    height: 200px;
    width: 300px;
    transform: scaleY(-1);
}
.group {
    width: 100%;
    height: 50px;
    transform: scaleY(-1);
    border: solid 1px red;
    box-sizing: border-box;
}
</style>

→ Ссылка