【发布时间】:2014-06-03 01:49:11
【问题描述】:
当点击哈希链接时,我使用这段 JavaScript 为我的网站添加了平滑滚动。
$('a[href*=#]')
.click(onAnchorClick);
function onAnchorClick(event)
{
return ! scrollTo(this.hash);
}
function scrollTo(target)
{
var e = $(target);
var y = e.exists() ? e.offset().top : 0;
if(y == 0 && target != '#top')
return false;
if(Math.max($('html').scrollTop(), $('body').scrollTop()) != y)
$('html,body')
.animate({scrollTop: y}, 500, function() { location.hash = target; } );
else
location.hash = target;
return true;
}
$.fn.exists = function()
{
return this.length > 0 ? this : false;
}
在桌面浏览器中运行良好,至少在 iOS 设备上也能正常运行。但是,在我的 WinPhone 8 设备上它是垃圾。滚动是一团糟,甚至没有到达应有的位置。所以我决定不通过if( ! /Windows Phone 8\.0/.test(navigator.userAgent))在那里启用它。
现在效果很好,WinPhone上的浏览器似乎默认是平滑滚动的,非常棒。
但是如果浏览器已经默认启用平滑滚动脚本当然有点愚蠢。有什么方法可以检测浏览器是否已启用平滑滚动功能?
【问题讨论】:
-
也许在每个动画步骤中检查
.scrollTop是否仍然具有您之前分配给它的值。当然,这需要手动完成,而不是.animate(),当然,但应该不会太难。 -
@Bergi - (我知道这是 5 年后的事了,但是......)实施的一个不幸的副作用是它滥用了这些平滑滚动事件的滚轮事件。当用户移动鼠标滚轮一次时,平滑滚动会连续触发滚轮事件以便滚动。但是,用户实际上并没有在移动轮子。
-
@TravisJ 幸运的是,现在还有一个 CSS 替代方案!将其添加为新接受的答案????|
标签: javascript browser cross-browser browser-detection