スクロールしたらそのとき何が表示されているかを反映させればいいわけです。
elementFromPoint() で指定の位置に何があるかわかるので、たとえば
jQuery
1$(window).on('scroll', function(event) {
2 var id = $(document.elementFromPoint(200, 127)).closest('section[id]').prop('id');
3 if (id) {
4 $('nav li a[href="#' + id + '"]').closest('li').addClass('selected').siblings().removeClass('selected');
5 }
6});
https://www.w3.org/TR/cssom-view-1/#dom-document-elementfrompoint
IntersectionObserver の例
jQuery
1const observer = new IntersectionObserver((entries, observer) => {
2 const entry = entries.find(a => a.isIntersecting);
3 if (entry) {
4 const id = entry.target.id;
5 $('nav li a[href="#' + id + '"]').closest('li').addClass('selected').siblings().removeClass('selected');
6 }
7}, { rootMargin: '-50%' });
8$('section[id]').each((index, element) => observer.observe(element));
https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API