@Adoratus

Из-за чего координаты элемента все время разные?

Доброго времени суток!
Хочу реализовать плавный скрол до элемента через ссылки с якорями. Но когда высчитываю при клике координаты ссылки с якорем, то возвращаются разные результаты. Если функция начинает расчет когда я нахожусь в самом верху документа, то результаты возвращаются верные и скролиться все хорошо, но если я нахожусь не в самом верху, то координаты получаются совсем другие и они зависят от того где сейчас находиться мой вьювпорт. Если я нахожусь непосредственно на элементе с якорем, то при клике на ссылку, функция видает координаты 0 и скролит просто к началу документа.
Вот первый способ расчета -
function smooth_scroll() {
$('a.item_link').click(function(){
    $('html, body').animate({
        scrollTop: $( $(this).attr('href') ).offset().top
    }, 500);
    return false;
});
}

Вот второй -
function getOffsetRect(elem) {
    var box = elem.getBoundingClientRect()
    var body = document.body
    var docElem = document.documentElement
    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft
    var clientTop = docElem.clientTop || body.clientTop || 0
    var clientLeft = docElem.clientLeft || body.clientLeft || 0
    var top  = box.top +  scrollTop - clientTop
    var left = box.left + scrollLeft - clientLeft   
    return { top: Math.round(top), left: Math.round(left) }
}
Оба способа возвращают одинаковые результаты
Может кто стыкался с подобным и знает в чем проблема? Fixed стоит на родителе ссылки, а все якоря находятся в reletive родителях. Хотя я уже пробовал убирать все позиционирования.
  • Вопрос задан
  • 385 просмотров
Решения вопроса 2
Bowen
@Bowen
Японский бог
Попробуйте так.
function smooth_scroll() {
    $('a.item_link').click(function() {
        var href = $(this).attr('href'),
              top = $(href).offset().top;
        $('html, body').animate({
            scrollTop: top
        }, 500);
        return false;
    });
}

P.S. Могу ошибаться, точно не помню
Ответ написан
DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?
Похоже, это баг jQuery 3.1
offset() возвращает отступ не от родительского элемента, а от верхней границы вьюпорта.

Либо перейти на jQuery 2.x, либо добавлять body.scrollTop.
https://jsfiddle.net/dn5t2mwm/6/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы