Та же старая проблема, .scrollTop(0) не работает в Chrome и Safari

Во-первых, позвольте мне указать, я гуглил и даже смотрел на ответы здесь вот так, и это, однако, я все еще должен найти рабочее решение для моего случая.

Я разработал страницу, которая имеет несколько фиксированных элементов, покрывающих страницу, и использует html5/css3, чтобы создать чистую "маску" для основного документа, позволяя тем самым полосе прокрутки тела по-прежнему прокручивать основное содержимое.

В Firefox и ie (bleh) scrollTop(0) работает идеально. Впрочем, как гласит вопрос, не так уж и много в моих любимых браузерах.

Что-то, на что я обратил внимание, это вызов следующего как до события scrollTo, так и после

$("body,html,document").each(function(){ console.log($(this).scrollTop()); });

Результаты не были приятными, это говорит мне, что scrolltop уже равен 0 и, таким образом, даже не пытается scrollTop, или, по крайней мере, это то, что я "думаю" до сих пор.

И прежде чем вы спросите, я сделал этот консольный вызов для каждого из этих 3 элементов, так как скролттоп документа должен быть покрыт одним из этих элементов (я бы подумал, что тело, но, как в, то есть вы должны также вызвать html)

Есть любители идей?

К вашему сведению, это может быть странностью CSS (хотя, как это работает в IE, а не в Chrome, я действительно не могу понять), но я уже пробовал следующее с отрицательными результатами:

$(window).scrollTop(0);
$(document).scrollTop(0);
$("html").scrollTop(0);
$("body").scrollTop(0);
window.scroll(0,0);
$("body,html,document").scrollTop(0);
$("body,html").scrollTop(0);

Что, я полагаю, расширяет мой вопрос, это проблема CSS? У меня нет внешней ссылки, и код слишком длинный (сделан с использованием CI view Partials), чтобы публиковать все это, но чтобы уточнить, что я сделал:

  • Исправлены верхний и нижний колонтитулы и боковая панель, позволяющая прокручивать содержимое с помощью полосы прокрутки документа
  • к настоящему моменту реализовано очень мало javascript или jquery, почти 0 пользовательских css вне фиксированной позиции предопределенных элементов
  • "content" используется в ajax с использованием функции.QQQuery, основанной на элементах списка, которые нажимаются в навигаторе боковой панели.

временная скрипка больше не поднимается

13 ответов

Решение

Проблема с CSS. В частности, правила, которые я включил ниже.

html, body {
    overflow-x: hidden;
    overflow-y: auto;
}

Хотя эти правила, очевидно, связаны с полосами прокрутки, я не уверен, почему они вызывают поведение, которое вы наблюдаете. Но если вы удалите их, это должно решить вашу проблему.

Смотрите: http://jsfiddle.net/jNWUm/23/.

У меня такая же проблема. Если я поставлю

$(window).scrollTop(0);

в обработчике готовых документов это не сработало; но если я протестирую его на панели консоли javascript инструментария разработчика Chrome, это сработает! Единственная разница заключалась в времени выполнения скрипта. Так я попробовал

window.setTimeout(function() {
    $(window).scrollTop(0); 
}, 0);

и это сработало. Установка задержки больше 0 необязательна, хотя это тоже сработало. Это не вина JQuery, потому что это то же самое с

window.scrollTo(0, 0);  window.scroll(0, 0);

Таким образом, причина может заключаться в том, что браузер заполняет свойство window.pageYOffset после рендеринга страницы и выполнения js.

Для людей, которым нужны настройки переполнения, обходной путь должен использовать такую ​​анимацию.

    $('#element_id').stop().animate({ scrollTop: 0 }, 500);

Кажется, это ведет себя лучше, чем .scrollTop(0),

Я только что проверил следующее в IE8 и Chrome, и оба работают:

$(window).scrollTop(0)

У меня была такая же проблема с прокруткой в chrome, Причина была height:100% стиль в body а также html, Смотрите этот ответ

К вашему сведению, если не в верхнем теле, то есть в iframe, просто попробуйте window.top.scrollTo(0,0);

Также проверьте этот ответ: scrolltop не работает на Android - кажется, лучше всего работает, когда переполнение установлено на видимое и положение на относительное - но ymmv. Вы можете найти это полезным...

function repeatMeOnMouseDown() // for smooth scrolling
{
    var $newTop = $('#element_id').position().top + ($goingUp ? -20 : 20);
    $('#element_id').animate({top: $newTop}, 20, repeatMeOnMouseDown); 
}

// these should work
$('#element_id').animate({top: -200}, 200); // scroll down
$('#element_id').animate({top: 0}, 200); // scroll back up

// DON'T DO THIS - Offsets don't work with top like they do with scrollTop 
$('#element_id').animate({top: ("-= " + 200)}, 200);

// and when you get tired of fighting to do smooth animation 
// on different browsers (some buggy!), just use css and move on
function singleClick($goingUp)
{
   var $newTop = $('#element_id').position().top + ($goingUp ? -200 : 200);
    $('#element_id').css({top: $newTop}, 20); 
}

Это нормальное поведение, когда в вашем CSS вы объявляете overflow: hidden за html или же body элементы dom, как вы можете прочитать в документации по jQuery API:

Положение вертикальной прокрутки совпадает с количеством пикселей, которые скрыты от просмотра над областью прокрутки. Если полоса прокрутки находится в самом верху или элемент не прокручивается, это число будет равно 0.

С overflow: hidden полоса прокрутки не видна, поэтому элемент не прокручивается, поэтому число будет равно 0 в каждом (интересно) браузере, который вы будете использовать.

У меня была эта проблема на MacOS. Я пытался поставить:

$(window).scrollTop(0);
document.body.scrollTop = document.documentElement.scrollTop = 0;

в $(window).load и это все еще не работало.

Тогда я попытался использовать какой-то трюк:

$('body')
  .css('position', 'fixed')
  .delay(200)
  .promise()
  .done(function() {
    $('body').css('position', 'relative');
  });

и все работало нормально! Положение фиксированного рода отрывает <body> от <html> который эффективно устанавливает позицию прокрутки окна в ноль. Затем с задержкой в ​​200 миллисекунд (просто чтобы быть на более безопасной стороне), я положил position: relative назад.

Надеюсь, это поможет. Благодарю.

В Chrome теперь можно использовать оба element.scroll(0,0)а также window.scroll(0,0)для прокручиваемого элемента (с содержимым, превышающим его размер, и некоторыми element {overflow: auto}в CSS) или для всей страницы, как показано в этом jsfiddle здесь.

Чтобы улучшить общий UX, рекомендуется также использовать element {scroll-behavior: smooth;}тоже - этот вариант является альтернативой использованию анимации - как упоминалось в предыдущем ответе (или непосредственно в html {scroll-behavior: smooth;}вместо).

$('#element-id').prop('scrollTop', 0); также должен сделать свое дело.

$('вашЭлемент').animate({scrollTop: 0})

Этот код был протестирован в Chrome. http://jsfiddle.net/wmo3o5m8/1/

(function () {
    var down = false, downX, downY;
    document.onmousedown = function (e) {
        downX = e.pageX;
        downY = e.pageY;
        down = true;
    };
    document.onmouseup = function () { down = false; };
    document.onmousemove = function (e) {
        if (down) {
            window.scrollTo(
                window.scrollX + downX - e.pageX,
                window.scrollY + downY - e.pageY
            );
        }
    };
})();
Другие вопросы по тегам