在jQuery中,你可以做這樣的事情在JavaScript中平滑滾動?
$('html, body').stop().animate({
'scrollTop': $target.offset().top
}, 1000);
而且我很感興趣如何在只有JavaScript處理呢?
謝謝!
在jQuery中,你可以做這樣的事情在JavaScript中平滑滾動?
$('html, body').stop().animate({
'scrollTop': $target.offset().top
}, 1000);
而且我很感興趣如何在只有JavaScript處理呢?
謝謝!
這個問題通常與功能利用setInterval
/setTimeout
和滾動在微小的增量元素回答,請參閱:Cross browser JavaScript (not jQuery...) scroll to top animation
我想建議使用動態添加CSS過渡做的另一種更現代的方式,這應該是更順暢和更少的CPU飢餓。它使用CSS動畫body
,JavaScript只計算並設置元素上的translateY()
變換。 CSS動畫完成後,將移除變換並設置滾動位置。
演示:http://jsfiddle.net/00uw1Lq9/4/(跨瀏覽器修復後的更新鏈接)。
僅適用於帶有前綴過渡和轉換的瀏覽器(在IE11,當前的Chrome和Firefox中測試過),對於舊版本您可能需要添加前綴檢測。它也可能在某些方面被打破,把它當作一個起點,而不是一個解決方案。
// this function self-initializes and attaches an event listener to the root element
var smoothScroll = (function(root){
//keep track of the target element between scrolling function and transitionend callback
var targetElement;
// called when the CSS transition finishes
root.addEventListener('transitionend', function(e){
// remove transition and transform
root.style['transition'] = '';
root.style['transform'] = '';
// do the actual scrolling
targetElement.scrollIntoView();
});
// this function fill be available as the smoothScroll function
return function(element, time){
// get the top position of target element
var offset = element.offsetTop - root.scrollTop;
// if the element is very low it can't get scrolled up to the top of the window
offset = Math.min(offset, root.offsetHeight - document.documentElement.clientHeight);
// save reference to the target element for callback
targetElement = element;
// set transfor/transition CSS properties
root.style['transition'] = 'transform';
root.style['transition-duration'] = time;
// this fakes the scrolling animation by animating transform on the element
root.style['transform'] = 'translateY(' + offset * -1 +'px)';
}
}(document.body));
用途:smothScroll(DOMNodeReference, time)
,其中time
是有效的CSS transition-duration
屬性(例如'300ms'
或'2.5s'
)的字符串。
非常有趣!你有沒有在任何地方做過改進或其他的例子? – 2015-03-06 23:35:07