Обновление за апрель 2018 года: Теперь есть собственный способ сделать это :
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
В настоящее время это поддерживается только в самых передовых браузерах.
Для поддержки старых браузеров вы можете использовать эту технику jQuery:
$(document).on('click', 'a[href^="#"]', function (event) {
event.preventDefault();
$('html, body').animate({
scrollTop: $($.attr(this, 'href')).offset().top
}, 500);
});
А вот и скрипка: http://jsfiddle.net/9SDLw/
Если у вашего целевого элемента нет идентификатора, и вы связываетесь с ним по name
, используйте это:
$('a[href^="#"]').click(function () {
$('html, body').animate({
scrollTop: $('[name="' + $.attr(this, 'href').substr(1) + '"]').offset().top
}, 500);
return false;
});
Для повышения производительности вы должны кешировать этот селектор $('html, body')
, чтобы он не запускался каждый раз при нажатии на ссылку:
var $root = $('html, body');
$('a[href^="#"]').click(function () {
$root.animate({
scrollTop: $( $.attr(this, 'href') ).offset().top
}, 500);
return false;
});
Если вы хотите, чтобы URL-адрес обновлялся, сделайте это в обратном вызове animate
:
var $root = $('html, body');
$('a[href^="#"]').click(function() {
var href = $.attr(this, 'href');
$root.animate({
scrollTop: $(href).offset().top
}, 500, function () {
window.location.hash = href;
});
return false;
});