Прокрутить до верхней части страницы с помощью JavaScript?

1594

Как прокрутить до верхней части страницы, используя JavaScript? Желательно, даже если полоса прокрутки мгновенно прыгает наверх. Я не ищу плавной прокрутки.

KingNestor
источник
2019, чтобы избежать «Этот сайт использует эффект позиционирования, связанный с прокруткой. Это может не сработать при асинхронном панорамировании », используйте мой скрипт stackoverflow.com/a/57641938/5781320
Константин

Ответы:

2174

Если вам не нужно менять анимацию, вам не нужно использовать какие-либо специальные плагины - я бы просто использовал собственный метод JavaScript window.scrollTo - при вводе 0,0 мгновенно прокручивается страница в верхнем левом углу ,

window.scrollTo(x-coord, y-coord);

параметры

  • X-координата - это пиксель вдоль горизонтальной оси.
  • у-координата - это пиксель вдоль вертикальной оси.
daniellmb
источник
176
Это была моя точка зрения, если вам не нужно анимировать плавную прокрутку, вам не нужно использовать jQuery.
daniellmb
23
Забавно, но комментарии Джеффа, честно говоря, предназначены для людей, которые просто хотят, чтобы все работало независимо от браузера. 95% времени следует просто использовать jQuery. Это исходит от того, кто сейчас должен написать много чистого javascript, потому что мы не можем позволить себе накладные расходы, связанные с замедлением рекламного кода библиотекой :(
Будет
11
Этот ответ не имеет ничего общего с вопросом. Было бы хорошо, если бы вопрос заключался в следующем: какой сценарий и методы следует использовать для прокрутки вверх страницы? Правильный ответ здесь: stackoverflow.com/questions/4147112/…
skobaljic
2
Работаю для меня в Firefox 40 и Chrome 44 (чтобы ответить на комментарий Михаила)
Тони
10
Прокрутите страницу до window.scrollTo(0, document.body.scrollHeight);
конца
1347

Если вы хотите плавную прокрутку, попробуйте что-то вроде этого:

$("a[href='#top']").click(function() {
  $("html, body").animate({ scrollTop: 0 }, "slow");
  return false;
});

Это возьмет любой <a>тэг href="#top"и сделает плавную прокрутку до самого верха.

Марк Урсино
источник
+1. Мне было просто интересно, как сделать что-то подобное, и Google привел меня сюда. ВОПРОС, однако, где находится функция "scrollTop" в документации? Я просто посмотрел, но не смог его найти.
sqram
22
scrollTop - это не функция, это свойство элемента окна
Джалал Эль-Шаер
1
Это не работает правильно при использовании полного обратного вызова animate, так как он запускается дважды.
Дэвид Моралес
5
«html» и «body» необходимы для совместимости с браузером, т.е. Chrome v27 прокручивает только «body», а IE8 - нет. IE8 прокручивается только с "html", а Chrome v27 - нет.
SushiGuy
1
@jalchr Фактически, window.pageYOffsetбудет свойством объекта окна e̶l̶e̶m̶e̶n̶t̶.
Алекс W
176

Попробуйте это прокрутить сверху

<script>
 $(document).ready(function(){
    $(window).scrollTop(0);
});
</script>
Mehmood
источник
это то же самое: if ('scrollRestoration' в истории) {history.scrollRestoration = 'manual'; }
Василий Суриков
123

Лучшее решение с плавной анимацией:

// this changes the scrolling behavior to "smooth"
window.scrollTo({ top: 0, behavior: 'smooth' });

Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo#Example

Ганеш Галаме
источник
Возможно, вам все еще потребуется поддержка полифилла для ScrollOptions(для некоторых браузеров): github.com/iamdustan/smoothscroll
jneuendorf
Мне очень нравится это решение.
SuperManEver
Может кто-нибудь проверить это в Safari или Internet Explorer и посмотреть, работает ли он нормально? Спасибо
Фабио Магарелли
1
@FabioMagarelli Отлично работает на Safari, не тестировался на IE. Чтобы проверить это в Safari, откройте любую страницу, на которой есть прокрутка, и скопируйте, вставьте вышеуказанный код в Инструменты разработчика -> Консоль, на которую он будет прокручиваться до верхнего уровня (Safari Версия 13.0.5).
Ганеш Галаме
104

Вам не нужен jQuery, чтобы сделать это. Стандартный HTML-тег будет достаточно ...

<div id="jump_to_me">
    blah blah blah
</div>

<a target="#jump_to_me">Click Here To Destroy The World!</a>
Mathew
источник
12
+1 Это хорошо, если вам нужно перейти к конкретному элементу, а не только к вершине.
Иш
38
Используйте «<a href="#"> Top </a>», чтобы перейти на верх страницы.
Баканекобрейн,
3
Похоже, что это лучший способ иметь дело со СПА
Фил
Ницца! Есть ли способ сделать это плавной прокруткой?
stallingOne
65

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

$('html, body').animate({
    scrollTop: $("#elementID").offset().top
}, 2000);
D.Alexander
источник
47

плавная прокрутка, чистый JavaScript:

(function smoothscroll(){
    var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
    if (currentScroll > 0) {
         window.requestAnimationFrame(smoothscroll);
         window.scrollTo (0,currentScroll - (currentScroll/5));
    }
})();
пробуждения-нео
источник
31
<script>
$(function(){
   var scroll_pos=(0);          
   $('html, body').animate({scrollTop:(scroll_pos)}, '2000');
});
</script>

Редактировать:

$('html, body').animate({scrollTop:(scroll_pos)}, 2000);

Другой способ прокрутки с верхним и левым полем:

window.scrollTo({ top: 100, left: 100, behavior: 'smooth' });
Kamlesh
источник
4
Вы уверены, что длительность как функция в анимации работает?
Йогеш
Вы не можете использовать строку для длительности в animateфункции, вместо этого вы должны использовать: $('html, body').animate({scrollTop:(scroll_pos)}, 2000);
Кенни Алвизурис
1
Какой смысл заключать 0 в скобки? ((0)) просто оценит до 0.
Джек Виал
Да, Джек, ты можешь.
Kamlesh
29
<script>

  $("a[href='#top']").click(function() {
     $("html, body").animate({ scrollTop: 0 }, "slow");
     return false;
  });
</script>

в HTML

<a href="#top">go top</a>
hasancse016
источник
28

Действительно странно: этот вопрос активен в течение пяти лет, и до сих пор нет ванильного ответа JavaScript, чтобы оживить прокрутку ... Итак, вы идете:

var scrollToTop = window.setInterval(function() {
    var pos = window.pageYOffset;
    if ( pos > 0 ) {
        window.scrollTo( 0, pos - 20 ); // how far to scroll on each step
    } else {
        window.clearInterval( scrollToTop );
    }
}, 16); // how fast to scroll (this equals roughly 60 fps)

Если хотите, вы можете заключить это в функцию и вызвать ее через onclickатрибут. Проверьте это jsfiddle

Примечание. Это очень простое и, возможно, не самое эффективное решение. Очень сложный пример можно найти здесь: https://github.com/cferdinandi/smooth-scroll

AvL
источник
6
Однако вопрос явно требует решения jQuery. так что не странно
будет
2
Лучшее решение для меня. Нет плагинов, нет громоздкой библиотеки jquery, просто прямой JavaScript. Престижность
user2840467
Чувак, я также создал ту же логику XD через 5 лет, точно такую ​​же логику, разные значения, например, интервал времени и целое число, которое мы используем для вычитания, не может поверить XD. TBH, пришел сюда, чтобы ответить, но он уже там, так что проголосовал за ваш ответ.
Герма Винсмоук
27

Если вы хотите сделать плавную прокрутку, попробуйте это:

$("a").click(function() {
     $("html, body").animate({ scrollTop: 0 }, "slow");
     return false;
});

Другое решение - метод JavaScript window.scrollTo:

 window.scrollTo(x-value, y-value);

Параметры:

  • Значение x - это пиксель по горизонтальной оси.
  • значение y - это пиксель вдоль вертикальной оси.
Гауранг Сондагар
источник
7
copycat ... посмотреть ответы пользователей ... Это всего лишь подборка из 2 лучших ответов ....
Лоран B
это законный способ использовать stackoverflow - более практично иметь его в одном месте. Джоэл Спольски использовал повторное использование существующих ответов в качестве примера того, как stackoverflow должен работать в одной точке. Если вы заинтересованы, я могу попытаться найти сообщение в блоге
Эдгар Х
26

С window.scrollTo(0, 0);очень быстро,
поэтому я попробовал пример Марка Урсино, но в Chrome ничего не происходит,
и я нашел это

$('.showPeriodMsgPopup').click(function(){
    //window.scrollTo(0, 0);
    $('html').animate({scrollTop:0}, 'slow');//IE, FF
    $('body').animate({scrollTop:0}, 'slow');//chrome, don't know if Safari works
    $('.popupPeriod').fadeIn(1000, function(){
        setTimeout(function(){$('.popupPeriod').fadeOut(2000);}, 3000);
    });
});

проверил все 3 браузера, и он работает,
я использую blueprint css,
это когда клиент нажимает кнопку «Забронировать сейчас» и у него не выбран период аренды, медленно перемещается в верхнюю часть, где находятся календари, и открывает диалоговое окно div, указывающее на 2 поля, через 3 секунды он исчезает

Луиджи ЗАМОЛЬ
источник
Спасибо за указание на то, что вам нужно настроить таргетинг как на html, так и на body. Я делал это только для html и удивлялся, почему это не работает в Chrome.
Джаред
Анимация тела работает в Safari, поэтому я обновляю ваш ответ соответственно.
Дейв ДюПлантис
46
"Протестировал все 3 браузера "? Мидори, LuaKit и Konqueror, верно? : p
Анко
14
Почему бы просто не добавить $ ('html', 'body'). Animate ({scrollTop: 0}) вместо добавления двух строк?
Мэтт Смит
23

Много из пользователей рекомендуется выбирать как HTML , и тело теги для кросс-браузерной совместимости, например , так:

$('html, body').animate({ scrollTop: 0 }, callback);

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

Если это проблема для вас, вы можете сделать что-то вроде этого:

function scrollToTop(callback) {
    if ($('html').scrollTop()) {
        $('html').animate({ scrollTop: 0 }, callback);
        return;
    }

    $('body').animate({ scrollTop: 0 }, callback);
}

Причина, по которой это работает, в Chrome $('html').scrollTop()возвращает 0, но не в других браузерах, таких как Firefox.

Если вы не хотите ждать завершения анимации в случае, если полоса прокрутки уже находится вверху, попробуйте следующее:

function scrollToTop(callback) {
    if ($('html').scrollTop()) {
        $('html').animate({ scrollTop: 0 }, callback);
        return;
    }

    if ($('body').scrollTop()) {
        $('body').animate({ scrollTop: 0 }, callback);
        return;
    }

    callback();
}
Big McLargeHuge
источник
19

Старый #topможет сделать свое дело

document.location.href = "#top";

Прекрасно работает в FF, IE и Chrome

pollirrata
источник
Ницца! Есть ли способ сделать это плавной прокруткой?
stallingOne
вам следует избегать навигационных решений, см. комментарии к ответу Шриримаджейама.
Эндрю Грот
15

$(".scrolltop").click(function() {
  $("html, body").animate({ scrollTop: 0 }, "slow");
  return false;
});
.section{
 height:400px;
}
.section1{
  background-color: #333;
}
.section2{
  background-color: red;
}
.section3{
  background-color: yellow;
}
.section4{
  background-color: green;
}
.scrolltop{
  position:fixed;
  right:10px;
  bottom:10px;
  color:#fff;
}
<html>
<head>
<title>Scroll top demo</title>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
</head>
<body>
<div class="content-wrapper">
<div class="section section1"></div>
<div class="section section2"></div>
<div class="section section3"></div>
<div class="section section4"></div>
<a class="scrolltop">Scroll top</a>
</div>

</body>
</html>

Арвинда Кумар
источник
3
Хотя этот код может ответить на вопрос, предоставление информации о том, как и почему он решает проблему, улучшает ее долгосрочное значение
L_J
Поясните свой ответ!
Уллас Хунка
На веб-странице любой пользователь нажимает кнопку прокрутки вверху, а затем страница прокручивает верх сверху с анимацией.
Арвинда Кумар
Почему animate () вместо jquery scroll ()?
Акин Хван
14

Попробуй это

<script>
    $(window).scrollTop(100);
</script>
Renjith
источник
14

$(document).scrollTop(0); тоже работает.

Хари Ганесан
источник
2
Обратите внимание, что если вы не используете Firefox, это не сработает. Вы получаете ошибку, когда задаете только один аргумент (Ошибка: недостаточно аргументов [nsIDOMWindow.scrollTo]).
Хаски
14

Решение без jQuery / чистый JavaScript:

document.body.scrollTop = document.documentElement.scrollTop = 0;
TFont
источник
14

Это будет работать:

window.scrollTo(0, 0);

Сантош Джади
источник
3
Это был лучший ответ
О. Г. Шон
10

Попробуйте этот код:

$('html, body').animate({
    scrollTop: $("div").offset().top
}, time);

div => Dom Элемент, куда вы хотите переместить свиток.

время => миллисекунды, определить скорость прокрутки.

Васиф али
источник
9

Чистое решение JavaScript:

function scrollToTop() {
  window.scrollTo({
    top: 0,
    behavior: 'smooth'
});

Я пишу анимированное решение на Codepen

Также вы можете попробовать другое решение со scroll-behavior: smoothсвойством CSS .

html {
    scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
    html {
        scroll-behavior: auto;
    }
}
Саид Хассанванд
источник
8

Почему бы вам не использовать встроенную функцию JQuery scrollTop:

$('html, body').scrollTop(0);//For scrolling to top

$("body").scrollTop($("body")[0].scrollHeight);//For scrolling to bottom

Коротко и просто!

Сандип Гантэйт
источник
Вам просто не хватает ссылки на документ
Кирилл Дюшон-Дорис
8

Вам не нужен JQuery. Просто вы можете вызвать сценарий

window.location = '#'

по нажатию кнопки «Перейти наверх»

Пример демо:

output.jsbin.com/fakumo#

PS: не используйте этот подход, когда вы используете современные библиотеки, такие как angularjs. Это может сломать URL hashbang.

Шрирамаджейам Сугумаран
источник
9
К сожалению, это не лучшее решение, поскольку в этом случае вы физически меняете местоположение, а не прокручиваете страницу. Это может вызвать проблемы, если местоположение важно (в случае использования угловой маршрутизации или около того)
Ярослав Рогоза
2
@ ЯрославРогоза правильный. Хотя это может работать в простых случаях, я бы не рекомендовал это решение. Местоположение становится все более важным, и одностраничные приложения широко используют хэш для обработки навигации. Вы бы сразу добавили ошибку, связанную с побочными эффектами, когда добавляете навигацию, основанную на хэше, после этого, или это, в навигацию на основе хеша.
Эндрю Грот
8

Просто используйте этот скрипт для прямой прокрутки.

<script>
$(document).ready(function(){
    $("button").click(function(){
        ($('body').scrollTop(0));
    });
});
</script>
Гаяшан Перера
источник
7

Если вам не нужна плавная прокрутка, вы можете обмануть и остановить анимацию плавной прокрутки почти сразу же после запуска ... вот так:

   $(document).ready(function() {
      $("a[href='#top']").click(function() {
          $("html, body").animate({ scrollTop: 0 }, "1");              
          $('html, body').stop(true, true);

          //Anything else you want to do in the same action goes here

          return false;                              
      });
  });

Я понятия не имею, рекомендуется ли это / разрешено, но это работает :)

Когда бы вы использовали это? Я не уверен, но, возможно, когда вы хотите использовать один клик для анимации одной вещи с помощью Jquery, но сделать другую без анимации? то есть откройте скользящую панель входа администратора в верхней части страницы и сразу же перейдите наверх, чтобы увидеть ее.

Джон Стори
источник
7

мотивация

Это простое решение работает изначально и обеспечивает плавный переход к любой позиции.

Он избегает использования якорных ссылок (тех, которые имеют #), которые, на мой взгляд, полезны, если вы хотите сделать ссылку на раздел, но не очень удобны в некоторых ситуациях, особенно при указании сверху, что может привести к двум различным URL-адресам, указывающим на в том же месте ( http://www.example.org и http://www.example.org/# ).

Решение

Поместите идентификатор в тег, который вы хотите прокрутить, например, в свой первый раздел , который отвечает на этот вопрос, но идентификатор можно разместить повсюду на странице.

<body>
  <section id="top">
    <!-- your content -->
  </section>
  <div id="another"><!-- more content --></div>

Тогда в качестве кнопки вы можете использовать ссылку, просто отредактируйте атрибут onclick с помощью такого кода.

<a onclick="document.getElementById('top').scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })">Click me</a>

Где аргумент document.getElementById- это идентификатор тега, на который вы хотите перейти после щелчка.

Джанлука Казати
источник
Спасибо вам! отличное решение
Уго Стивен Лагуна Руэда
@HugoStivenLagunaRueda, пожалуйста, я нашел это на MDN, так что спасибо Mozilla. Удивительно, сколько вещей уже есть, поддерживается изначально. Я люблю ваниль JS.
Джанлука Касати
5

Вы можете просто использовать цель из вашей ссылки, такую ​​как #someid, где #someid - это идентификатор div.

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

http://plugins.jquery.com/project/ScrollTo является примером.

ScottE
источник
4

Вы можете попробовать использовать JS как в этой скрипке http://jsfiddle.net/5bNmH/1/

Добавьте кнопку «Перейти наверх» в нижнем колонтитуле вашей страницы:

<footer>
    <hr />
    <p>Just some basic footer text.</p>
    <!-- Go to top Button -->
    <a href="#" class="go-top">Go Top</a>
</footer>
asertym
источник
4
function scrolltop() {

    var offset = 220;
    var duration = 500;

    jQuery(window).scroll(function() {
        if (jQuery(this).scrollTop() > offset) {
            jQuery('#back-to-top').fadeIn(duration);
        } else {
            jQuery('#back-to-top').fadeOut(duration);
        }
    });

    jQuery('#back-to-top').click(function(event) {
        event.preventDefault();
        jQuery('html, body').animate({scrollTop: 0}, duration);
        return false;
    });
}
Mardzis
источник
4

Ни один из приведенных выше ответов не будет работать в SharePoint 2016.

Это должно быть сделано так: /sharepoint/195870/

var w = document.getElementById("s4-workspace");
w.scrollTop = 0;
jeancallisti
источник