Ответ 1
Вы можете просто использовать .animate()
свойство scrollTop
, например:
$("html, body").animate({ scrollTop: "300px" });
Я хочу плавно прокрутить вниз. Я не хочу писать для этого функцию, особенно если у jQuery уже есть один.
Вы можете просто использовать .animate()
свойство scrollTop
, например:
$("html, body").animate({ scrollTop: "300px" });
Ник отвечает отлично. Будьте осторожны при указании функции complete() внутри вызова animate(), потому что он будет выполняться дважды, так как вы объявили два селектора (html и body).
$("html, body").animate(
{ scrollTop: "300px" },
{
complete : function(){
alert('this alert will popup twice');
}
}
);
Здесь вы можете избежать двойного обратного вызова.
var completeCalled = false;
$("html, body").animate(
{ scrollTop: "300px" },
{
complete : function(){
if(!completeCalled){
completeCalled = true;
alert('this alert will popup once');
}
}
}
);
Ответ на Nick отлично работает, и настройки по умолчанию хороши, но вы можете более точно управлять прокруткой, выполнив все дополнительные настройки.
вот что выглядит в API:
.animate( properties [, duration] [, easing] [, complete] )
чтобы вы могли сделать что-то вроде этого:
.animate(
{scrollTop:'300px'},
300,
swing,
function(){
alert(animation complete! - your custom code here!);
}
)
здесь находится функция jQuery.animate api: http://api.jquery.com/animate/
У меня есть то, что я считаю лучшим решением, чем $('html, body')
hack.
Это не однострочный, но проблема с $('html, body')
заключается в том, что если вы входите в журнал $(window).scrollTop()
во время анимации, вы увидите, что значение перескакивает повсеместно, иногда на сотни пикселей ( хотя я не вижу ничего подобного, что происходит визуально). Мне нужно, чтобы значение было предсказуемым, чтобы я мог отменить анимацию, если пользователь схватил полосу прокрутки или закрутил колесико мыши во время автоматического прокрутки.
Здесь функция будет плавно прокручиваться:
function animateScrollTop(target, duration) {
duration = duration || 16;
var scrollTopProxy = { value: $(window).scrollTop() };
if (scrollTopProxy.value != target) {
$(scrollTopProxy).animate(
{ value: target },
{ duration: duration, step: function (stepValue) {
var rounded = Math.round(stepValue);
$(window).scrollTop(rounded);
}
});
}
}
Ниже представлена более сложная версия, которая отменяет анимацию при взаимодействии с пользователем, а также восстанавливает до достижения целевого значения, что полезно при попытке установить scrollTop мгновенно (например, просто называть $(window).scrollTop(1000)
- в моем опыте, это не работает примерно в 50% случаев.)
function animateScrollTop(target, duration) {
duration = duration || 16;
var $window = $(window);
var scrollTopProxy = { value: $window.scrollTop() };
var expectedScrollTop = scrollTopProxy.value;
if (scrollTopProxy.value != target) {
$(scrollTopProxy).animate(
{ value: target },
{
duration: duration,
step: function (stepValue) {
var roundedValue = Math.round(stepValue);
if ($window.scrollTop() !== expectedScrollTop) {
// The user has tried to scroll the page
$(scrollTopProxy).stop();
}
$window.scrollTop(roundedValue);
expectedScrollTop = roundedValue;
},
complete: function () {
if ($window.scrollTop() != target) {
setTimeout(function () {
animateScrollTop(target);
}, 16);
}
}
}
);
}
}
Как упоминалось в Kita, существует проблема с запуском нескольких обратных вызовов, когда вы живите как на "html", так и "body". Вместо того, чтобы анимировать и блокировать последующие обратные вызовы, я предпочитаю использовать некоторые основные функции обнаружения и только анимировать свойство scrollTop для одного объекта.
Принятый ответ на этот другой поток дает некоторое представление о том, какое свойство scrollTop объекта мы должны попытаться оживить: pageYOffset Scrolling and Animation в IE8
// UPDATE: don't use this... see below
// only use 'body' for IE8 and below
var scrollTopElement = (window.pageYOffset != null) ? 'html' : 'body';
// only animate on one element so our callback only fires once!
$(scrollTopElement).animate({
scrollTop: '400px' // vertical position on the page
},
500, // the duration of the animation
function() {
// callback goes here...
})
});
UPDATE - - -
Вышеприведенная попытка обнаружения функции не работает. Кажется, что не существует однострочного способа сделать это, поскольку браузер типа Webkit свойство pageYOffset всегда возвращает ноль, когда есть doctype. Вместо этого я нашел способ использовать обещание сделать один обратный вызов для каждого раза, когда анимация выполняется.
$('html, body')
.animate({ scrollTop: 100 })
.promise()
.then(function(){
// callback code here
})
});
У меня возникли проблемы, когда анимация всегда начиналась с верхней части страницы после обновления страницы в других примерах.
Я исправил это, не анимируя css напрямую, а скорее называя window.scrollTo();
на каждом шаге:
$({myScrollTop:window.pageYOffset}).animate({myScrollTop:300}, {
duration: 600,
easing: 'swing',
step: function(val) {
window.scrollTo(0, val);
}
});
Это также распространяется на проблему html
vs body
, поскольку она использует кросс-браузерный JavaScript.
Посмотрите http://james.padolsey.com/javascript/fun-with-jquerys-animate/ для получения дополнительной информации о том, что вы можете сделать с функцией анимации jQuery.
Попробуйте плагин scrollTo.
Вы можете использовать анимацию jQuery для прокрутки страницы с определенной продолжительностью:
$("html, body").animate({scrollTop: "1024px"}, 5000);
где 1024px - смещение прокрутки, а 5000 - продолжительность анимации в миллисекундах.
$(".scroll-top").on("click", function(e){
e.preventDefault();
$("html, body").animate({scrollTop:"0"},600);
});
Но если вы действительно хотите добавить анимацию во время прокрутки, вы можете попробовать мой простой плагин (AnimateScroll), который в настоящее время поддерживает больше, чем 30 стилей стилей
Если вы хотите перейти в конец страницы (чтобы вам не нужно было прокручивать вниз), вы можете использовать:
$('body').animate({ scrollTop: $(document).height() });
код кросс-браузера:
$(window).scrollTop(300);
он без анимации, но работает везде