jQuery scrollTop не работает в Chrome, но работает в Firefox

Я использовал scrollTop функция в jQuery для навигации вверх, но странно, "плавная анимированная прокрутка" перестала работать в Safari и Chrome (прокрутка без плавной анимации) после того, как я внес некоторые изменения.

Но это все еще работает гладко в Firefox. Что может быть не так?

Вот функция jQuery, которую я использовал,

JQuery:

$('a#gotop').click(function() {
    $("html").animate({ scrollTop: 0 }, "slow");
    //alert('Animation complete.');
    //return false;
});

HTML

<a id="gotop" href="#">Go Top </a>

CSS

#gotop {
      cursor: pointer;
      position: relative;
      float: right;
      right: 20px;
      /*top:0px;*/
}

16 ответов

Решение

Попробуйте использовать $("html,body").animate({ scrollTop: 0 }, "slow");

Это работает для меня в Chrome.

Если ваш CSS html элемент имеет следующее overflow разметка, scrollTop не будет функционировать.

html {
    overflow-x: hidden;
    overflow-y: hidden;
}

Позволять scrollTop чтобы прокрутить, измените разметку удалить overflow разметка от html элемент и добавить к body элемент.

body { 
    overflow-x: hidden;
    overflow-y: hidden;
}

Он работает в обоих браузерах, если вы используете scrollTop() с 'document':

$(document).scrollTop();

... вместо "HTML" или "тело". В противном случае он не будет работать одновременно в обоих браузерах.

Я успешно использовал это в Chrome, Firefox и Safari. Еще не смог протестировать его в IE.

if($(document).scrollTop() !=0){
    $('html, body').animate({ scrollTop: 0 }, 'fast');
}

Причиной утверждения "если" является проверка того, готов ли пользователь наверху сайта. Если так, не делайте анимацию. Таким образом, нам не нужно сильно беспокоиться о разрешении экрана.

Причина я использую $(document).scrollTop вместо т.е. $('html,body') Это причина, почему Chrome всегда возвращает 0 по какой-то причине.

У меня была такая же проблема с прокруткой в ​​хроме. Так что я удалил эти строки кодов из моего файла стиля.

html{height:100%;}
body{height:100%;}

Теперь я могу играть с прокруткой, и это работает:

var pos = 500;
$("html,body").animate({ scrollTop: pos }, "slow");

Прокрутите тело и проверьте, работает ли оно:

function getScrollableRoot() {
    var body = document.body;
    var prev = body.scrollTop;
    body.scrollTop++;
    if (body.scrollTop === prev) {
        return document.documentElement;
    } else {
        body.scrollTop--;
        return body;
    }
}


$(getScrollableRoot()).animate({ scrollTop: 0 }, "slow");

Это более эффективно, чем $("html, body").animate потому что используется только одна анимация, а не две. Таким образом, срабатывает только один обратный вызов, а не два.

Может ты имеешь ввиду top: 0

$('a#gotop').click(function() {
  $("html").animate({ top: 0 }, "slow", function() { 
                                           alert('Animation complete.'); });
  //return false;
});

из одушевленных документов

.animate(свойства, [длительность], [ослабление], [обратный вызов])
Свойства Карта свойств CSS, к которой будет двигаться анимация.
...

или же $(window).scrollTop()?

$('a#gotop').click(function() {
  $("html").animate({ top: $(window).scrollTop() }, "slow", function() { 
                                                              alert('Animation complete.'); });
  //return false;
});
// if we are not already in top then see if browser needs html or body as selector
var obj = $('html').scrollTop() !== 0 ? 'html' : 'body';

// then proper delegate using on, with following line:
$(obj).animate({ scrollTop: 0 }, "slow");

НО, лучший подход - прокрутить идентификатор в вашем окне просмотра, используя только нативный API (так как вы в любом случае прокручиваете вверх, это может быть только ваш внешний div):

document.getElementById('wrapperIDhere').scrollIntoView(true);

Я использую:

var $scrollEl = $.browser.mozilla ? $('html') : $('body');

потому что читать jQuery scrollTop не работает в Chrome, но работает в Firefox

Так что у меня тоже была эта проблема, и я написал эту функцию:

/***Working function for ajax loading Start*****************/
function fuweco_loadMoreContent(elmId/*element ID without #*/,ajaxLink/*php file path*/,postParameterObject/*post parameters list as JS object with properties (new Object())*/,tillElementEnd/*point of scroll when must be started loading from AJAX*/){
 var 
  contener = $("#"+elmId),
  contenerJS = document.getElementById(elmId);
 if(contener.length !== 0){
  var 
   elmFullHeight = 
    contener.height()+
    parseInt(contener.css("padding-top").slice(0,-2))+
    parseInt(contener.css("padding-bottom").slice(0,-2)),
   SC_scrollTop = contenerJS.scrollTop,
   SC_max_scrollHeight = contenerJS.scrollHeight-elmFullHeight;
  if(SC_scrollTop >= SC_max_scrollHeight - tillElementEnd){
   $("#"+elmId).unbind("scroll");
   $.post(ajaxLink,postParameterObject)
    .done(function(data){
     if(data.length != 0){
     $("#"+elmId).append(data);
     $("#"+elmId).scroll(function (){
      fuweco_reloaderMore(elmId,ajaxLink,postParameterObject);
     });
    }
    });
  }
 }
}
/***Working function for ajax loading End*******************/
/***Sample function Start***********************************/
function reloaderMore(elementId) {
 var
  contener = $("#"+elementId),
  contenerJS = document.getElementById(elementId)
 ;

    if(contener.length !== 0){
     var
   elmFullHeight = contener.height()+(parseInt(contener.css("padding-top").slice(0,-2))+parseInt(contener.css("padding-bottom").slice(0,-2))),
   SC_scrollTop = contenerJS.scrollTop,
   SC_max_scrollHeight = contenerJS.scrollHeight-elmFullHeight
  ;
  if(SC_scrollTop >= SC_max_scrollHeight - 200){
   $("#"+elementId).unbind("scroll");
   $("#"+elementId).append('<div id="elm1" style="margin-bottom:15px;"><h1>Was loaded</h1><p>Some text for content. Some text for content. Some text for content. Some text for content. Some text for content. Some text for content. Some text for content. Some text for content. Some text for content. Some text for content. Some text for content. Some text for content.</p></div>');
   $("#"+elementId).delay(300).scroll(function (){reloaderMore(elementId);});
  }
    }
}
/***Sample function End*************************************/
/***Sample function Use Start*******************************/
$(document).ready(function(){
 $("#t1").scrollTop(0).scroll(function (){
  reloaderMore("t1");
    });
});
/***Sample function Use End*********************************/
.reloader {
    border: solid 1px red;
    overflow: auto;
    overflow-x: hidden;
    min-height: 400px;
    max-height: 400px;
    min-width: 400px;
    max-width: 400px;
    height: 400px;
    width: 400px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
 <div class="reloader" id="t1">
  <div id="elm1" style="margin-bottom:15px;">
   <h1>Some text for header.</h1>
   <p>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
   </p>
  </div>
  <div id="elm2" style="margin-bottom:15px;">
   <h1>Some text for header.</h1>
   <p>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
   </p>
  </div>
  <div id="elm3" style="margin-bottom:15px;">
   <h1>Some text for header.</h1>
   <p>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
    Some text for content.<br>
   </p>
  </div>  
 </div>

Я надеюсь, что это будет полезно для других программистов.

Если для Mozilla все работает нормально, с html, селектором тела, то есть большая вероятность, что проблема связана с переполнением, если переполнение в html или body установлено на auto, то это приведет к тому, что chrome не будет работать хорошо, потому что когда установлено значение auto, свойство scrollTop для animate не будет работать, я точно не знаю, почему! но решение состоит в том, чтобы исключить переполнение, не устанавливайте его! это решило это для меня! если вы устанавливаете его на авто, снимите его!

если вы устанавливаете его скрытым, то делайте так, как описано в ответе "user2971963" (ctrl+f, чтобы найти его). надеюсь, что это полезно!

Тестирование на Chrome, Firefox и Edge, единственное решение, которое мне помогло, - это использование setTimeout с решением Aaron следующим образом:

setTimeout( function () {
    $('body, html').stop().animate({ scrollTop: 0 }, 100);
}, 500);

Ни одно из других решений не сбрасывало предыдущую scrollTop, когда я перезагружал страницу, в Chrome и Edge для меня. К сожалению, в Edge все еще есть небольшой "щелчок".

 $("html, body").animate({ scrollTop: 0 }, "slow");

Этот CSS конфликт с прокруткой вверх, так что позаботьтесь об этом

 html, body {
         overflow-x: hidden;        
    }

Лучший способ решить эту проблему - использовать такую ​​функцию:

function scrollToTop(callback, q) {

    if ($('html').scrollTop()) {
        $('html').animate({ scrollTop: 0 }, function() {
            console.log('html scroll');
            callback(q)
        });
        return;
    }

    if ($('body').scrollTop()) {
        $('body').animate({ scrollTop: 0 }, function() {
            console.log('body scroll');
            callback(q)
        });
        return;
    }

    callback(q);
}

Это будет работать во всех браузерах и предотвращает прокрутку FireFox дважды (что происходит, если вы используете принятый ответ - $("html,body").animate({ scrollTop: 0 }, "slow");).

Я обнаружил, что проблема в моем CSS. Я удалил это из своей таблицы стилей, и все заработало.

      *{scroll-behavior: smooth;}

Я не думаю, что scrollTop является допустимым свойством. Если вы хотите анимировать прокрутку, попробуйте плагин scrollTo для jquery

http://plugins.jquery.com/project/ScrollTo

Другие вопросы по тегам