Я сделал многоразовый плагин, который может это делать ... Я оставил привязку к событиям вне самого плагина, потому что я чувствую, что он слишком навязчив для такого маленького помощника ....
jQuery(function ($) {
/**
* This small plugin will scrollTo a target, smoothly
*
* First argument = time to scroll to the target
* Second argument = set the hash in the current url yes or no
*/
$.fn.smoothScroll = function(t, setHash) {
// Set time to t variable to if undefined 500 for 500ms transition
t = t || 500;
setHash = (typeof setHash == 'undefined') ? true : setHash;
// Return this as a proper jQuery plugin should
return this.each(function() {
$('html, body').animate({
scrollTop: $(this).offset().top
}, t);
// Lets set the hash to the current ID since if an event was prevented this doesn't get done
if (this.id && setHash) {
window.location.hash = this.id;
}
});
};
});
Теперь, мы можем загрузить, просто сделаем это, проверим хеш и, если он там, попробуем использовать его непосредственно в качестве селектора для jQuery. Сейчас я не мог легко протестировать это в то время, но недавно я сделал аналогичные вещи для производственных сайтов, если это не сработает сразу, дайте мне знать, и я посмотрю на решение, которое я получил там.
(скрипт должен находиться в разделе загрузки)
if (window.location.hash) {
window.scrollTo(0,0);
$(window.location.hash).smoothScroll();
}
Далее мы привязываем плагин к щелчку якорей, которые содержат только хэш в своем атрибуте href.
(скрипт должен находиться в разделе загрузки)
$('a[href^="#"]').click(function(e) {
e.preventDefault();
$($(this).attr('href')).smoothScroll();
});
Поскольку jQuery ничего не делает, если само совпадение не удается, у нас есть хороший запасной вариант, когда цель на странице не может быть найдена yay \ o /
Обновление
Альтернативный обработчик onclick для прокрутки вверх, когда есть только хеш:
$('a[href^="#"]').click(function(e) {
e.preventDefault();
var href = $(this).attr('href');
// In this case we have only a hash, so maybe we want to scroll to the top of the page?
if(href.length === 1) { href = 'body' }
$(href).smoothScroll();
});
Вот также простой jsfiddle, который демонстрирует прокрутку внутри страницы, настройка загрузки немного сложна ...
http://jsfiddle.net/sg3s/bZnWN/
Обновление 2
Так что вы можете столкнуться с проблемой, когда окно уже прокручивается до элемента загрузки. Это исправляет, что: window.scrollTo(0,0);
просто прокручивает страницу влево вверх. Добавил его во фрагмент кода выше.