機能を検出し、サポートされている単一のオブジェクトでアニメーション化するのは良いことですが、1行の解決策はありません。それまでの間、Promiseを使用して実行ごとに1つのコールバックを実行する方法を次に示します。
$('html, body')
.animate({ scrollTop: 100 })
.promise()
.then(function(){
// callback code here
})
});
更新:代わりに機能検出を使用する方法を次に示します。このコードのチャンクは、アニメーションを呼び出す前に評価する必要があります。
// Note that the DOM needs to be loaded first,
// or else document.body will be undefined
function getScrollTopElement() {
// if missing doctype (quirks mode) then will always use 'body'
if ( document.compatMode !== 'CSS1Compat' ) return 'body';
// if there's a doctype (and your page should)
// most browsers will support the scrollTop property on EITHER html OR body
// we'll have to do a quick test to detect which one...
var html = document.documentElement;
var body = document.body;
// get our starting position.
// pageYOffset works for all browsers except IE8 and below
var startingY = window.pageYOffset || body.scrollTop || html.scrollTop;
// scroll the window down by 1px (scrollTo works in all browsers)
var newY = startingY + 1;
window.scrollTo(0, newY);
// And check which property changed
// FF and IE use only html. Safari uses only body.
// Chrome has values for both, but says
// body.scrollTop is deprecated when in Strict mode.,
// so let's check for html first.
var element = ( html.scrollTop === newY ) ? 'html' : 'body';
// now reset back to the starting position
window.scrollTo(0, startingY);
return element;
}
// store the element selector name in a global var -
// we'll use this as the selector for our page scrolling animation.
scrollTopElement = getScrollTopElement();
次に、先ほど定義した変数をページスクロールアニメーションのセレクターとして使用し、通常の構文を使用します。
$(scrollTopElement).animate({ scrollTop: 100 }, 500, function() {
// normal callback
});