Мобильное Safari, scrollIntoView не работает

1

У меня проблема с прокруткой к элементу на мобильном Safari в iframe (он работает с другими браузерами, включая Safari на Mac).

Я использую scrollIntoView. Я хочу прокручивать, когда все contnet было визуализировано. Вот мой код:

var readyStateCheckInterval = setInterval(function () {
    if (document.readyState === "complete") {
       clearInterval(readyStateCheckInterval);
        $browser.notifyWhenNoOutstandingRequests(function () {
            if (cinemaName != null && eventId == null) {
                scrollToCinema();
            } else {
                scrollToEvent();
            }
        });
     }
}, 10);


function scrollToEvent() {
    var id = eventId;
    var delay = 100;

    if (cinemaName != null) {
        id = cinemaName + "#" + eventId;
    }

    if ($rootScope.eventId != null) {
        id = $rootScope.cinemaId + "#" + $rootScope.eventId;
    }

    $timeout(function () {
        var el = document.getElementById(id);
        if (el != null)
        el.scrollIntoView(true);    
        $rootScope.eventId = null;
    }, delay);
}
Теги:
iframe
mobile-safari
safari

1 ответ

0

ScrollIntoView не работает (в настоящее время). Но вы можете вручную вычислить положение элемента и прокручивать его. Вот мое решение

const element = document.getElementById('myId')

Передайте элемент этой функции

/** Scrolls the element into view
 * Manually created since Safari does not support the native one inside an iframe
*/
export const scrollElementIntoView = (element: HTMLElement, behavior?: 'smooth' | 'instant' | 'auto') => {

  let scrollTop = window.pageYOffset || element.scrollTop

   // Furthermore, if you have for example a header outside the iframe 
   // you need to factor in its dimensions when calculating the position to scroll to
   const headerOutsideIframe = window.parent.document.getElementsByClassName('myHeader')[0].clientHeight

  const finalOffset = element.getBoundingClientRect().top + scrollTop + headerOutsideIframe

  window.parent.scrollTo({
    top: finalOffset,
    behavior: behavior || 'auto'
  })
}

Pitfalls: Smooth scroll также не работает для ios mobile, но вы можете дополнить этот код этим полифоном

Ещё вопросы

Сообщество Overcoder
Наверх
Меню