Не читайте это из DOM (это медленно), лучше держите в памяти модель, которой заведомо известно, какие элементы попадают в контейнер (модель знает о высоте контейнера и высоте элементов). Техника называется virtual list / virtual scroll, можно нагуглить кучу примеров (например, sergimansilla.com/blog/virtual-scrolling )
Если надо код попроще, делайте requestAnimationFrame + getBoundingClientRect, когда элементов мало будет работать норм. Если надо, чтобы быстро работало на больших списках - стройте модель, как советует napa3um