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

66

Я использовал функцию 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;*/
}
  • 1
    jsbin.com/erade/2 отлично работает на Chrome
  • 0
    @jAndy, мне было интересно, почему scrollTop , который не является допустимым свойством css, работает в вашей демоверсии? ... Вы можете поделиться какой-нибудь информацией или ссылкой на нее?
Показать ещё 3 комментария
Теги:
jquery-selectors

15 ответов

85
Лучший ответ

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

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

  • 0
    Да. Спасибо. Простой и экономящий время.
  • 0
    У меня была точно такая же проблема, хотя я также анимировал scrollTop. Интересно то, что $ ("html") работает в FF, а $ ("body") работает в Chrome / Safari, но только $ ("html, body") работает для меня в обоих.
Показать ещё 9 комментариев
50

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

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

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

body { 
    overflow-x: hidden;
    overflow-y: hidden;
}
  • 3
    Это было мое решение, спасибо
  • 4
    это может быть более 4 лет, но это все еще было решением моей проблемы
Показать ещё 6 комментариев
13

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

$(document).scrollTop();

... вместо "html" или "body". Другой способ он не будет работать одновременно в обоих браузерах.

  • 0
    Это работает, но не при использовании animate()
  • 0
    Документ работал для меня, когда «html» и «body» не работали. Спасибо :)
Показать ещё 1 комментарий
5

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

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

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

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

2

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

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

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

var pos = 500;
$("html,body").animate({ scrollTop: pos }, "slow");
  • 0
    Вот это да. Это полностью исправило мою проблему! Я не мог заставить scrollTop работать вообще, но как только я удалил высоту: 100% от тела и HTML-элемента, он работал отлично. Спасибо Спасибо спасибо.
  • 0
    @ agon024, я тоже счастлив;). На самом деле я нашел это решение после нескольких часов тестирования и попытался написать здесь для кого-то вроде вас.
2

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

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, потому что используется только одна анимация, а не две. Таким образом, срабатывает только один обратный вызов, а не два.

  • 0
    Хорошая работа! Мне очень помогли!
1

Я использую:

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

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

1

может быть, вы имеете в виду 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;
});
  • 0
    Тем не менее анимация не работает. Нашел простое решение. Мне пришлось использовать «body, html» или «html, body» вместо просто «html».
0
 $("html, body").animate({ scrollTop: 0 }, "slow");

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

 html, body {
         overflow-x: hidden;        
    }
0

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

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

0

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

/***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="/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>

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

0

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

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

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

0

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

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");).

0
// 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);
  • 0
    Этот лучший подход позволяет обойти проблему с overflow-x: hidden; на html в хром. Однако он не сглаживает прокрутку, как .animate() .
0

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

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

  • 2
    scrollTop () является действительным jQuery: api.jquery.com/scrolltop
  • 0
    @Bayard - LOL! это метод, а не свойство css ...
Показать ещё 5 комментариев

Ещё вопросы

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