Ответ 1
Кросс-браузер, чистое решение для JavaScript:
document.body.scrollTop = document.documentElement.scrollTop = 0;
Есть ли способ управлять прокруткой браузера с помощью JavaScript/jQuery?
Когда я прокручиваю страницу наполовину вниз, а затем запускаю перезагрузку, я хочу, чтобы страница переходила в пакет вверх, но вместо этого пытается найти последнюю позицию прокрутки. Поэтому я сделал это:
$('document').ready(function() {
$(window).scrollTop(0);
});
Но не повезло.
ИЗМЕНИТЬ
Итак, оба ваши ответы работали, когда я вызываю их после загрузки страницы. Спасибо. Однако, если я просто обновляю страницу, выглядит так, как браузер вычисляет и прокручивает ее до старой позиции прокрутки ПОСЛЕ события .ready
(я тоже тестировал функцию onload()).
Итак, продолжение: есть ли способ ПРЕДОТВРАТИТЬ браузер, прокручивающийся до его прошлой позиции, или перепроверить вверх, ПОСЛЕ того, как он делает свою работу?
Кросс-браузер, чистое решение для JavaScript:
document.body.scrollTop = document.documentElement.scrollTop = 0;
Вы получили почти - вам нужно установить scrollTop
на body
, а не window
:
$(function() {
$('body').scrollTop(0);
});
EDIT:
Возможно, вы можете добавить пустой якорь в начало страницы:
$(function() {
$('<a name="top"/>').insertBefore($('body').children().eq(0));
window.location.hash = 'top';
});
Есть ли способ ПРЕДОТВРАТИТЬ браузер прокрутки до своего прошлого положения или перемотка назад вверх вещь?
Для меня работает следующее jquery-решение:
$(window).unload(function() {
$('body').scrollTop(0);
});
Здесь представлена чистая версия анимированного JavaScript для без-jQuery'ers: D
var stepTime = 20;
var docBody = document.body;
var focElem = document.documentElement;
var scrollAnimationStep = function (initPos, stepAmount) {
var newPos = initPos - stepAmount > 0 ? initPos - stepAmount : 0;
docBody.scrollTop = focElem.scrollTop = newPos;
newPos && setTimeout(function () {
scrollAnimationStep(newPos, stepAmount);
}, stepTime);
}
var scrollTopAnimated = function (speed) {
var topOffset = docBody.scrollTop || focElem.scrollTop;
var stepAmount = topOffset;
speed && (stepAmount = (topOffset * stepTime)/speed);
scrollAnimationStep(topOffset, stepAmount);
};
И затем:
<button onclick="scrollTopAnimated(1000)">Scroll Top</button>
UPDATE
Перейти к началу страницы с эффектом прокрутки теперь немного проще в javascript с помощью:
https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll
window.scroll({
top: 0,
left: 0,
behavior: 'smooth'
});
ВНИМАНИЕ
Мы использовали это в наших более свежих проектах, но я только что проверил документацию Mozilla прямо сейчас, обновляя свой ответ, и я считаю, что он был обновлен. Прямо сейчас метод является window.scroll(x-coord, y-coord)
и не упоминает и не показывает примеры, которые используют параметр object
, где вы можете установить behavior
в smooth
. Я только что попробовал код, и он все еще работает в Chrome и Firefox, а параметр объекта все еще находится в спецификации.
Так что используйте это с осторожностью, или вы можете использовать этот Polyfill. Помимо прокрутки вверх, этот полифилл также обрабатывает другие методы: window.scrollBy
, element.scrollIntoView
и т.д.
СТАРЫЙ ОТВЕТ
Это наша ванильная реализация javascript
. Он имеет простой эффект смягчения, так что пользователь не будет шокирован после нажатия кнопки Наверх.
Он очень маленький и становится еще меньше при уменьшении. Разработчики, ищущие альтернативу методу jquery, но желающие получить те же результаты, могут попробовать это.
JS
document.querySelector("#to-top").addEventListener("click", function(){
var toTopInterval = setInterval(function(){
var supportedScrollTop = document.body.scrollTop > 0 ? document.body : document.documentElement;
if (supportedScrollTop.scrollTop > 0) {
supportedScrollTop.scrollTop = supportedScrollTop.scrollTop - 50;
}
if (supportedScrollTop.scrollTop < 1) {
clearInterval(toTopInterval);
}
}, 10);
},false);
HTML
<button id="to-top">To Top</button>
Ура!
Это работает для меня:
window.onload = function() {
// short timeout
setTimeout(function() {
$(document.body).scrollTop(0);
}, 15);
};
Использует короткий setTimeout
внутри onload
, чтобы дать браузеру возможность прокрутки.
Вы можете использовать с jQuery
jQuery(window).load(function(){
jQuery("html,body").animate({scrollTop: 100}, 1000);
});
Используйте следующую функцию
window.scrollTo(xpos, ypos)
Здесь требуется xpos. Координата для прокрутки по оси х (по горизонтали) в пикселях
ypos также требуется. Координата для прокрутки по оси Y (по вертикали) в пикселях
$(function() {
// the element inside of which we want to scroll
var $elem = $('#content');
// show the buttons
$('#nav_up').fadeIn('slow');
$('#nav_down').fadeIn('slow');
// whenever we scroll fade out both buttons
$(window).bind('scrollstart', function(){
$('#nav_up,#nav_down').stop().animate({'opacity':'0.2'});
});
// ... and whenever we stop scrolling fade in both buttons
$(window).bind('scrollstop', function(){
$('#nav_up,#nav_down').stop().animate({'opacity':'1'});
});
// clicking the "down" button will make the page scroll to the $elem height
$('#nav_down').click(
function (e) {
$('html, body').animate({scrollTop: $elem.height()}, 800);
}
);
// clicking the "up" button will make the page scroll to the top of the page
$('#nav_up').click(
function (e) {
$('html, body').animate({scrollTop: '0px'}, 800);
}
);
});
Используйте это
Следующий код работает в Firefox, Chrome и Safari, но я не смог проверить это в Internet Explorer. Может кто-нибудь проверить его, а затем отредактировать мой ответ или прокомментировать его?
$(document).scrollTop(0);
Мое чистое (анимированное) решение Javascript:
function gototop() {
if (window.scrollY>0) {
window.scrollTo(0,window.scrollY-20)
setTimeout("gototop()",10)
}
}
Объяснение:
window.scrollY
- это переменная, поддерживаемая браузером от количества пикселей от вершины, над которой прокручивалось окно.
window.scrollTo(x,y)
- это функция, которая прокручивает окно определенное количество пикселей по оси x и по оси y.
Таким образом, window.scrollTo(0,window.scrollY-20)
перемещает страницу 20 пикселей вверх.
setTimeout
снова вызывает функцию за 10 миллисекунд, чтобы мы могли перенести ее еще на 20 пикселей (анимированный), а оператор if
проверяет, нужно ли еще прокручивать.
Почему бы вам просто не использовать некоторый ссылочный элемент в самом начале вашего html файла, например
<div id="top"></div>
а затем, когда страница загружается, просто выполните
$(document).ready(function(){
top.location.href = '#top';
});
Если браузер прокручивается после срабатывания этой функции, вы просто выполняете
$(window).load(function(){
top.location.href = '#top';
});
В моем случае тело не сработало:
$('body').scrollTop(0);
Но HTML работал:
$('html').scrollTop(0);
Перекрестный браузер переместится вверх:
if($('body').scrollTop()>0){
$('body').scrollTop(0); //Chrome,Safari
}else{
if($('html').scrollTop()>0){ //IE, FF
$('html').scrollTop(0);
}
}
Кросс-браузер прокручивает элемент с id = div_id:
if($('body').scrollTop()>$('#div_id').offset().top){
$('body').scrollTop($('#div_id').offset().top); //Chrome,Safari
}else{
if($('html').scrollTop()>$('#div_id').offset().top){ //IE, FF
$('html').scrollTop($('#div_id').offset().top);
}
}
Чтобы ответить на ваш отредактированный вопрос, вы можете зарегистрировать обработчик onscroll
следующим образом:
document.documentElement.onscroll = document.body.onscroll = function() {
this.scrollTop = 0;
this.onscroll = null;
}
Это сделает так, что первая попытка прокрутки (которая, скорее всего, автоматическая, выполняемая браузером) будет эффективно отменена.
Если вы находитесь в режиме quircks (спасибо @Niet the Dark Absol):
document.body.scrollTop = document.documentElement.scrollTop = 0;
Если вы находитесь в строгом режиме:
document.documentElement.scrollTop = 0;
Здесь нет необходимости в jQuery.
Это работает:
jQuery(document).ready(function() {
jQuery("html").animate({ scrollTop: 0 }, "fast");
});
Сочетание этих двух помогло мне. Ни один из других ответов не помог мне, так как у меня был sidenav, который не прокручивался.
setTimeout(function () {
window.scroll({
top: 0,
left: 0,
behavior: 'smooth'
});
document.body.scrollTop = document.documentElement.scrollTop = 0;
}, 15);
var totop = $('#totop');
totop.click(function(){
$('html, body').stop(true,true).animate({scrollTop:0}, 1000);
return false;
});
$(window).scroll(function(){
if ($(this).scrollTop() > 100){
totop.fadeIn();
}else{
totop.fadeOut();
}
});
<img id="totop" src="img/arrow_up.png" title="Click to go Up" style="display:none;position:fixed;bottom:10px;right:10px;cursor:pointer;cursor:hand;"/>
без анимации, просто scroll(0, 0)
(vanilla JS)
Если кто-то использует angular и материальный дизайн с помощью sidenav. Это приведет вас к началу страницы:
let ele = document.getElementsByClassName('md-sidenav-content');
let eleArray = <Element[]>Array.prototype.slice.call(ele);
eleArray.map( val => {
val.scrollTop = document.documentElement.scrollTop = 0;
});
Визуализация хэша должна выполнять эту работу. Если у вас есть заголовок, вы можете использовать
window.location.href = "#headerid";
иначе, только один # будет работать
window.location.href = "#";
И поскольку он будет записан в URL-адрес, он будет оставаться, если вы обновите.
На самом деле, для этого вам не нужен JavaScript для событий, если вы хотите сделать это в событии onclick, вы должны просто поместить ссылку arround на ваш элемент и дать ему # как href.
Сначала добавьте пустой тег привязки туда, куда вы хотите пойти
<a href="#topAnchor"></a>
Теперь добавьте функцию в заголовок
function GoToTop() {
var urllocation = location.href;
if (urllocation.indexOf("#topAnchor") > -1) {
window.location.hash = "topAnchor";
} else {
return false;
}
}
наконец, добавьте событие onload в тег body
<body onload="GoToTop()">
Общая версия, которая работает для любых значений X и Y, и такая же, как и window.scrollTo api, только с добавлением scrollDuration.
* Общая версия, соответствующая браузеру window.scrollTo api **
function smoothScrollTo(x, y, scrollDuration) {
x = Math.abs(x || 0);
y = Math.abs(y || 0);
scrollDuration = scrollDuration || 1500;
var currentScrollY = window.scrollY,
currentScrollX = window.scrollX,
dirY = y > currentScrollY ? 1 : -1,
dirX = x > currentScrollX ? 1 : -1,
tick = 16.6667, // 1000 / 60
scrollStep = Math.PI / ( scrollDuration / tick ),
cosParameterY = currentScrollY / 2,
cosParameterX = currentScrollX / 2,
scrollCount = 0,
scrollMargin;
function step() {
scrollCount = scrollCount + 1;
if ( window.scrollX !== x ) {
scrollMargin = cosParameterX + dirX * cosParameterX * Math.cos( scrollCount * scrollStep );
window.scrollTo( 0, ( currentScrollX - scrollMargin ) );
}
if ( window.scrollY !== y ) {
scrollMargin = cosParameterY + dirY * cosParameterY * Math.cos( scrollCount * scrollStep );
window.scrollTo( 0, ( currentScrollY - scrollMargin ) );
}
if (window.scrollX !== x || window.scrollY !== y) {
requestAnimationFrame(step);
}
}
step();
}
<script>
sessionStorage.scrollDirection = 1;//create a session variable
var pageScroll = function() {
window.scrollBy ({
top: sessionStorage.scrollDirection,
left: 0,
behavior: 'smooth'
});
if($(window).scrollTop() + $(window).height() > $(document).height() - 1)
{
sessionStorage.scrollDirection= Number(sessionStorage.scrollDirection )-300;
setTimeout(pageScroll,50);//
}
else{
sessionStorage.scrollDirection=Number(sessionStorage.scrollDirection )+1
setTimeout(pageScroll,300);
}
};
pageScroll();
</script>