加载新页面上的Javascript以在顶部固定元素下方移动锚

加载新页面上的Javascript以在顶部固定元素下方移动锚,javascript,jquery,html,anchor,onload,Javascript,Jquery,Html,Anchor,Onload,我只是在学习javascript(字面意思),我有一点JS(如下所示),它将页面锚定从页面顶部向下移动90像素,以防止锚定的内容被固定的顶部元素重叠。在同一页面上单击指向锚定的链接时,效果非常好 我遇到的问题是,当我单击指向不同页面上锚的链接时。加载新页面时,锚定将加载在页面顶部,并部分隐藏在固定顶部元素下面 我怀疑我需要在每个页面上都有某种类型的onLoad事件来检查锚点散列,但我对这一点太陌生了,无法理解 感谢您的帮助,谢谢 统计信息:我这样做是为了我公司的网络帮助。我们有大约280多个帮助

我只是在学习javascript(字面意思),我有一点JS(如下所示),它将页面锚定从页面顶部向下移动90像素,以防止锚定的内容被固定的顶部元素重叠。在同一页面上单击指向锚定的链接时,效果非常好

我遇到的问题是,当我单击指向不同页面上锚的链接时。加载新页面时,锚定将加载在页面顶部,并部分隐藏在固定顶部元素下面

我怀疑我需要在每个页面上都有某种类型的onLoad事件来检查锚点散列,但我对这一点太陌生了,无法理解

感谢您的帮助,谢谢

统计信息:我这样做是为了我公司的网络帮助。我们有大约280多个帮助页面和2500个左右的锚。我希望在include或header中添加一些JS可以解决我的问题

注意:我使用的脚本是作为一个不同的stackoverflow问题的答案找到的,并且稍加修改

$(function(){
  $('a[href*=#]').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 
    && location.hostname == this.hostname) {
      var $target = (this.hash);
      $target = target.length && target || ('[name=' + this.hash.slice(1) + ']');
      if ($target.length) {
        var targetOffset = target.offset().top - 90;
        $('html,body').animate({scrollTop: targetOffset}, 1000);
        return false;
      }
    }
  });
});

如果我理解正确;您希望此移动在页面加载时发生,而不仅仅是在单击链接时发生。如果是这种情况,您将希望使用each()函数而不是click()。只需替换。单击。每一个,页面加载后就会发生。另外,为了安全起见,请将href匹配用双引号括起来

  $('a[href*="#"]').each(function() {...

这应该很有效。在Firefox和Chrome中测试

$(function(){
  if(location.hash !== "") {
    window.scrollTo(0,window.pageYOffset-90);
  }
});

实际上,我用一些CSS解决了这个问题(我在我所有的锚中添加了一个类):


这在短时间内有效。但是,在偏移量处加载页面后,页面将重置为将目标锚点放置在页面顶部(因此它被顶部固定元素隐藏)。我甚至将其设置为偏移到页面底部,在移动所有内容之前,我可以在页面底部短暂地看到内容。我可以看到window.scrollTo正在工作,并将内容放在我想要的位置,但是在if语句的close}被处理之后,内容会重置到window.scrollTo行之前的位置。也许我没有正确地实现它-你还有什么建议吗?你可能需要将window.scrollTo放入一个setTimeout函数中,并允许有一个小的延迟(我相信小于500ms的东西可以工作)。也许不是最好的解决办法,但这是我目前能想到的最好的办法。如果我有机会做更多的实验,我会看看是否有更好的方法。
a.target
{
    position: relative;
    border-top: 90px solid transparent;
    background-clip: padding-box;
    margin: -100px 0 0;
}

a.target:before
{
    content: "";
    position: absolute;
    top: -90px;
    left: 0;
    right: 0;
    border-top: 2px solid #ccc;
}