2011-10-10 62 views
14

我已经使用CSS来制作一个“粘性标题”,它始终在页面顶部可见,其他内容在它下面。 在标题中我有一些内部链接。问题是当单击一个链接时,页面会滚动,以便目标位于页面的顶部 - 被粘滞标题隐藏 - 而不是在其下方。粘性标题和内部链接

有关如何解决此问题的任何建议?

CSS:

#header { 
    position: fixed; 
    top: 0; 
    left: 0; 
    width: 100%; 
    height: 3.5em; 
    padding:0; 
    margin: 0; 
} 

#container { 
    width: 100%; 
    margin: 3.5em 0 0 0; 
    padding: 0; 
    overflow:auto; 
} 

#content { 
    padding: 0 4em; 
    margin: 0; 
} 

HTML:

<body> 

    <div id="header"> 
     <div id="content"> 
      <p> 
       <a href="#xyz">XYZ</a> 
      </p> 
     </div> <!--end content--> 
    </div> <!--end header--> 

    <div id="container"> 
     <div id="content"> 
      <p>A lot of text.</p> 
      <a name="xyz"></a> 
      <p>A lot of text</p> 
     </div><!--end content--> 
    </div><!--end container--> 

</body> 

回答

0

一件简单的事情做的是把<a name="xyz"></a>小幅上涨的文本。

这将需要一些试验和错误,但它可能是最快/最容易做的事情。


你可以做的另一件事是动态地添加marginpadding链接被点击的时候。

0

你也可以在你的CSS文件中设置一个与你的xyz-fragment的粘性头一样高的顶边。这可能会导致您的结果HTML页面中的空白空缺...

0

开始为头部和容器内的内容部分获取唯一的ID。 也许你可以把ul放在内部链接的标题中。 设置包装内的内容的位置绝对,等瞧!

有什么地方可以看看你的问题吗?

1

的JavaScript点点(jQuery的使用这里)可以做到这一点:

$('#header a').click(function (e) { 
    e.preventDefault(); 

    var offset = $('a[name=' + $(this).attr('href').substr(1) + ']').offset(); 

    $('html, body').animate({ scrollTop: offset.top - $('#header').outerHeight() }, 'fast'); 
}); 

这个发现与匹配链接的href属性点击的name属性的元素,然后动画滚动到元素的位置减去标题的高度。

http://jsfiddle.net/blineberry/bTa8b/

21

首先,它是更好地使用块与id而不是name - 这是更标准的方式。

然后,将类添加到锚点,然后使其具有绝对位置+将其移动到与顶部高度相等的负顶部margin

看看这个小提琴:http://jsfiddle.net/kizu/gfXJJ/

,或者,对于支持伪元素的浏览器,你可以添加一个具有所需的高度和补偿是通过负边距的高度,所以就相当于为开端您要建立链接的区块。这样做可以将id添加到已有的元素中,而不是创建额外的元素。

这里是伪元素的一个版本:http://jsfiddle.net/kizu/gfXJJ/2/

或者你也可以添加顶部padding和负margin的元素与id本身:http://jsfiddle.net/kizu/gfXJJ/2/ - 但在这种情况下,有可能出现问题与它的背景,“导致该块在顶部物理扩展。

+0

完美的作品,谢谢! – user635817

+4

@ user635817请正式接受kizu的回答。 – Brent

1

我相信这个问题重叠在这个链接:offsetting an html anchor to adjust for fixed header它提供了更多的可能的解决方案。我相信这些问题可以合并,但我没有这些特权。 (这也是我作为答案输入的一个原因,虽然我知道它应该是一个评论,但我不允许发表评论。)

0

伪元素似乎不适用于所有场景。我有幸运用了负顶部边距和正顶部填充来抵消负边距。

例如。 <a id="xyz" style="margin-top:-50px; padding-top:50px">Title</a>