【发布时间】:2015-07-08 16:22:10
【问题描述】:
我正在尝试实现文档导航,类似于 Bootstrap 网站上的文档导航。我已经完成了它的整体工作,但它有一个小方面困扰着我。
就像在 Bootstrap 上一样,我正在使用 affix.js 和 scrollSpy.js 的组合,这很有效。请参阅以下内容 JSFiddle.
$('#doc_nav').on( "click", "a", function( e ){
// e.preventDefault();
var target = this.hash;
var $target = $(target);
var offset = $target.offset().top;
console.log(offset);
offset = offset - 100;
console.log(offset);
$('html, body').scrollTop( offset );
});
注释掉 e.preventDefault() 后,导航菜单的行为与预期一致。向下滚动窗口会导致显示的 div 在菜单上突出显示。单击菜单列表中的某个项目,直接将您带到页面上相应的 div,然后当您从页面上的该部分滚动离开时,菜单会相应更新。
在我的“真实”页面上,我有一个高度为 100 像素的固定页眉。因此,目前,当我单击菜单链接时,页面会跳转到所需的部分并将其放置在页眉稍微遮挡它的页面顶部。除非我使用 e.preventDefault(),否则上面代码的 scrollTop 部分似乎不起作用。如果您在小提琴中取消注释此行并再次运行它,单击菜单上的“标题 3”链接,您将看到它现在将标题 3 内容放在页面中,从顶部偏移 100 像素。完美。
但是,现在将页面向上滚动到顶部。您将看到“标题 3”列表项保持在其 :hover 状态,即使鼠标不在其附近也是如此。好像 e.preventDefault() 阻止了浏览器检测到鼠标不再悬停在项目上。
在浏览器窗口外的任意位置单击鼠标即可解决问题。
谁能解释我在这里做错了什么?如何防止锚点单击的默认行为,以便我可以控制页面滚动位置,而不会在此过程中停止正确的 CSS 绘制?
出现问题是因为我使用 e.preventDefault() 来阻止浏览器的默认行为,因为我想控制滚动到锚定元素。
我已经在 Firefox 和 IE10 中对此进行了测试。
【问题讨论】:
标签: javascript jquery html css twitter-bootstrap