固定的页眉与页内锚重叠


358

如果我在HTML页面中有一个非滚动标题,该标题固定在顶部并具有定义的高度:

有没有一种方法可以使用URL锚点(该#fragment部分)使浏览器滚动到页面中的某个点,但是在没有JavaScript的帮助下仍然可以尊重固定元素的高度?

http://foo.com/#bar
错误(但常见的行为):正确:
+ --------------------------------- + + -------------- ------------------- +
| BAR /////////////////////标题| | ///////////////////////
+ --------------------------------- + + -------------- ------------------- +
| 这是本文的其余部分| | 酒吧|
| ... | | |
| ... | | 这是本文的其余部分|
| ... | | ... |
+ --------------------------------- + + -------------- ------------------- +



3
@ax是的,这是最好的答案。另请查看nicolasgallagher.com/jump-links-and-viewport-positioning/demo。这对我最有效:.dislocate50px, #bar { padding: 50px 0 0; margin: -50px 0 0; -webkit-background-clip: content-box; background-clip: content-box; }
逃离了

我正在寻找一种解决方案,该解决方案*适用于来自同一页面或其他页面的锚点,并且*调整页面向下按键,以使内容不会被页眉剪切,并且*允许sib-div页脚使用content-div向上滚动。尚未找到解决方案!但是我必须说,我认为正确的方法应该针对整个内容div,而不是针对每个锚点。stackoverflow.com/questions/51070758/...
佐尼为什么

@斧头。CSS-tricks.com具有更好的更新的一篇关于scroll-padding-top这里:css-tricks.com/...相应的答案:stackoverflow.com/a/56467997/247696
Flimm

Answers:


167

我有同样的问题。我通过将一个类添加到锚元素(顶部栏高度为padding-top值)来解决此问题。

<h1><a class="anchor" name="barlink">Bar</a></h1>

然后简单的CSS:

.anchor { padding-top: 90px; }

19
@Tomalak请注意,此解决方案使填充区域内的链接不可单击。要解决此问题,您必须使用z-index,并将链接值设置为高于锚定值。请记住,顶部栏应具有最高的z-index值,因此滚动时页面的内容不会浮在顶部栏的顶部。
MutttenXd 2012年

由于WebKit的固定位置错误导致标头消失,因此无法在Chrome v28中使用。这个答案在我的情况下起到了作用。
Knickedi

2
MuttenXd ..你是我的英雄。我的网站上出现了奇怪的非功能链接问题(与锚无关),这使我发疯。您的不可点击评论确实有所帮助。我欠你大!
zipzit 2014年

9
正如Roy Shoa的答案中所建议的那样,添加margin-top: -90px;以抵消填充引起的间隙。
Skippy le Grand Gourou 2015年

37
我使用过,.anchor:target {padding-top: 90px;}以便仅在他们使用锚标记时才添加填充。这样,如果页面在顶部加载,就不会总是出现一堆填充。仅当它在页面下方加载该特定点时。
jimmyplaysdrums 2015年

265

如果您不能或不想设置新的类,请在CSS ::before:target伪类中添加一个固定高度的伪元素:

:target::before {
  content: "";
  display: block;
  height: 60px; /* fixed header height*/
  margin: -60px 0 0; /* negative fixed header height */
}

或相对于页面滚动 :target使用jQuery:

var offset = $(':target').offset();
var scrollto = offset.top - 60; // minus fixed header height
$('html, body').animate({scrollTop:scrollto}, 0);

30
我真的很喜欢您的解决方案。这是我发现的最干净的解决方案。
伊泰·格鲁杰夫

5
这是最适合我的解决方案,而不会在页面布局中填满其他任何内容。
杰米·卡尔

2
与WebKit中的列表一起使用时,CSS解决方案存在问题。看:stackoverflow.com/questions/39547773/...
莫特S.卡普兰

14
如果目标具有顶部填充或边框,则它将无效,因为它依赖于边距折叠。
krulik

9
:target只是辉煌!
不间断的

125

我使用这种方法:

/* add class="jumptarget" to all targets. */

.jumptarget::before {
  content:"";
  display:block;
  height:50px; /* fixed header height*/
  margin:-50px 0 0; /* negative fixed header height */
}

它在每个目标之前添加一个不可见元素。它适用于IE8 +。

以下是更多解决方案:http : //nicolasgallagher.com/jump-links-and-viewport-positioning/


看一下Badabam提供的链接,还有第二种解决方案,我使用它,并且可以在Chrome和Firefox中使用
清道夫

在最新的Firefox(PC上为55.0.3)上对此进行了测试,现在可以正常工作。:-)
RachieVee

46

官方采用的答案:

*[id]:before { 
  display: block; 
  content: " "; 
  margin-top: -75px; // Set the Appropriate Height
  height: 75px; // Set the Appropriate Height
  visibility: hidden; 
}

学分

合并


1
非常感谢您添加此内容,对于完整性请+1。
amjoconn

2
与WebKit中的列表一起使用时,此解决方案存在问题。看:stackoverflow.com/questions/39547773/...
莫特S.卡普兰

请注意,如果目标元素本身恰好具有display: flex;或,则此方法将无效padding-top<a name="my_link">{leave this empty}</a>在这种情况下,请使用专用的锚元素(例如)。
WoodrowShigeru

如果目标元素是<tr>,则此方法将无效
Ivan Gusev

42
html {
  scroll-padding-top: 70px; /* height of sticky header */
}

来自:https : //css-tricks.com/fixed-headers-on-page-links-and-overlapping-content-oh-my/



为我工作。我正在从另一个页面导航到锚点。其他人没有工作。谢谢!
davidloper

1
这对于在Edge和Safari中滚动整个页面不起作用(bugs.webkit.org/show_bug.cgi?id=179379)。
Juliusz Gonera

1
救主!简单点。没有其他解决方案对我有用,因为我正在使用display:flex。多谢,尝试所有解决方案实在令人沮丧。
Priya Payyavula

这是一个美丽的解决方案,我使用了滚动行为:smooth!important; 也要停下来,用两行代码非常简单
yehanny

30

我发现处理此问题的最佳方法是(用固定的元素高度替换65px):

div:target {
  padding-top: 65px; 
  margin-top: -65px;
}

如果您不喜欢使用目标选择器,也可以按照以下方式进行操作:

.my-target {
    padding-top: 65px;
    margin-top: -65px;
}

注意:如果目标元素的背景颜色与其父元素不同,则此示例将不起作用。例如:

<div style="background-color:red;height:100px;"></div>
<div class="my-target" style="background-color:green;height:100px;"></div>

在这种情况下,my-target元素的绿色将以65px覆盖其父红色元素。我没有找到任何纯CSS解决方案来解决此问题,但是如果您没有其他背景色,则此解决方案是最好的。


2
在所有答案中,这是唯一对我有用的答案!
哈维尔·阿里亚斯

18

虽然一些建议的解决方案适用同一页面中的片段链接(=哈希链接)(例如向下滚动的菜单链接),但我发现当您要使用来自其他页面的片段链接时,它们都无法在当前的Chrome中工作页数

因此,从头开始调用www.mydomain.com/page.html#foo 不会使用任何给定的CSS解决方案或JS解决方案抵消您在当前Chrome中的目标。

还有一个jQuery错误报告,描述了问题的一些详细信息。

到目前为止,我发现唯一可以在Chrome中真正使用的选项是JavaScript,它没有被称为onDomReady,但是会延迟。

// set timeout onDomReady
$(function() {
    setTimeout(delayedFragmentTargetOffset, 500);
});

// add scroll offset to fragment target (if there is one)
function delayedFragmentTargetOffset(){
    var offset = $(':target').offset();
    if(offset){
        var scrollto = offset.top - 95; // minus fixed header height
        $('html, body').animate({scrollTop:scrollto}, 0);
    }
}

摘要

如果没有JS延迟,则解决方案可能会在Firefox,IE,Safari和Chrome中都无法使用。


3
我得出了相同的结论和解决方案。似乎其他所有人都忘记了使用井号的外部链接。
AJJ

我今天遇到了这个问题,我已经使用了您的解决方案。尽管您似乎不需要超时。这也可以用作IIFE。
kwiat1990 '17

1
@ kwiat1990:是的,这是可能的,但前提是您的JS必须放在HTML代码的末尾。否则,您的滚动目标可能尚未在DOM中。实际上,这就是使用onDomReady的全部重点。因此,我认为超时版本是稳定的方法。
Jpsy

该答案是唯一适用于外部链接的答案。但是,当在同一页面中调用链接时,它对我不起作用:(有什么想法吗?
AugustoSamaméBarrientos 17-10-27

@Augusto找到解决方案了吗?我有同样的问题。
杰西

9

随着CSS Scroll Snap规范的出现,使用scroll-margin-topproperty 很容易实现。目前在Chrome和Opera上运行(2019年4月)。Safari 11+也应支持此功能,但我无法在Safari 11上运行它。可能我们必须等待其他人在那里修复它。

Codepen示例

body {
  padding: 0;
  margin: 0;
}

h1,
p {
  max-width: 40rem;
  margin-left: auto;
  margin-right: auto;
}
h1 {
  scroll-margin-top: 6rem; /* One line solution. :-) */
}
.header {
  position: sticky;
  top: 0;
  background-color: red;
  text-align: center;
  padding: 1rem;
}
.header .scroll {
  display: block;
  color: white;
  margin-bottom: 0.5rem;
}
.header .browsers {
  color: black;
  font-size: 0.8em;
}
<header class="header">
  <a class="scroll" href="#heading">Scroll to heading</a>
  <span class="browsers" >Chrome 69+, Opera 56+ and Safari 11+ only</span>
</header>
<p>
  Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
</p>
<h1 id="heading">What is Lorem Ipsum?</h1>
<p>
  Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
</p>
<p>
  

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent pulvinar eleifend dolor, in cursus augue interdum quis. Morbi volutpat pulvinar nisl et condimentum. Quisque elit lacus, egestas non ante sit amet, hendrerit commodo dui. Nunc ac sagittis dolor. Proin iaculis ante non est pharetra, et ullamcorper nisl accumsan. Aenean quis leo vel sapien eleifend aliquam. Pellentesque finibus dui ex, blandit tristique risus vestibulum vitae. Nam a quam ac turpis porta eleifend. Sed at hendrerit risus, ac efficitur ante. Aenean pretium justo feugiat condimentum consectetur. Etiam mattis urna id porta hendrerit.
</p>
<p>
Mauris venenatis quam sed egestas auctor. Fusce lacus eros, condimentum nec quam vel, malesuada gravida libero. Praesent vel sollicitudin justo. Donec mattis nisl id mauris scelerisque, quis placerat lectus scelerisque. Ut id justo a magna mattis luctus. Suspendisse massa est, pretium vel suscipit sit amet, iaculis at mi. Aenean vulputate ipsum non consectetur sodales. Proin aliquet erat nec mi eleifend, eu dapibus enim ultrices. Sed fringilla tortor ac rhoncus consectetur. Aliquam aliquam orci ultrices tortor bibendum facilisis.
</p>
<p>
Donec ultrices diam quam, non tincidunt purus scelerisque aliquam. Nam pretium interdum lacinia. Donec sit amet diam odio. Donec eleifend nibh ut arcu dictum, in vulputate magna malesuada. Nam id dignissim tortor. Suspendisse commodo, nunc sit amet blandit laoreet, turpis nibh rhoncus mi, et finibus nisi diam sed erat. Vivamus diam arcu, placerat in ultrices eu, porta ut tellus. Aliquam vel nisi nisi.
</p>
<p>
Integer ornare finibus sem, eget vulputate lacus ultrices ac. Vivamus aliquam arcu sit amet urna facilisis consectetur. Sed molestie dolor et tortor elementum, nec bibendum tortor cursus. Nulla ipsum nulla, luctus nec fringilla id, sagittis et sem. Etiam at dolor in libero pharetra consequat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse quis turpis non diam mattis varius. Praesent at gravida mi. Etiam suscipit blandit dolor, nec convallis lectus mattis vitae. Mauris placerat erat ipsum, vitae interdum mauris consequat quis. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</p>
<p>
Nunc efficitur scelerisque elit. Integer ac massa ipsum. Cras volutpat nulla purus, quis molestie dolor iaculis eget. Maecenas ut ex nulla. Pellentesque sem augue, ornare ut arcu eu, porttitor consectetur orci. Aenean iaculis blandit quam, in efficitur justo sodales auctor. Vivamus dignissim pellentesque risus eget consequat. Pellentesque sit amet nisi in urna convallis egestas vitae nec mauris. 
</p>


1
真是太好了。希望它能被更广泛地采用!
Tomalak

scroll-padding-top和之间有什么区别scroll-margin-top
Flimm

scroll-margin-top不幸的是,此用例未在Safari 11-13中实现:bugs.webkit.org/show_bug.cgi?id=189265
fabb

在Safari中它被称为scroll-snap-margin-topcaniuse.com/#search=scroll-margin-top
木樽仔

@ Mu-TsunTsai有点复杂。这在Safari上确实存在,但不适用于滚动到碎片的行为。见我在浏览器compat的数据问题的评论:github.com/mdn/browser-compat-data/issues/...
dakur

8

对于Chrome / Safari / Firefox,您可以添加,display: block并使用负边距来补偿偏移量,例如:

a[name] {
    display: block;
    padding-top: 90px;
    margin-top: -90px;
}

参见示例http://codepen.io/swed/pen/RrZBJo


7

您可以使用jQuery来做到这一点:

var offset = $('.target').offset();
var scrollto = offset.top - 50; // fixed_top_bar_height = 50px
$('html, body').animate({scrollTop:scrollto}, 0);

不是“ .target”,应该是“:target”
Mert S. Kaplan

@ MertS.Kaplan“ .target”是类'target'。
webvitaly

7

刚刚发现了另一个纯粹的CSS解决方案,对我来说就像一个迷住了!

html {
  scroll-padding-top: 80px; /* height of your sticky header */
}

此网站上找到!


2
其他一些人在您之前发现了此解决方案,请参见第1页的答案,例如stackoverflow.com/a/56467997/18771
Tomalak

对不起,没注意到!谢谢!
jamawe

这对于在Edge和Safari中滚动整个页面不起作用(bugs.webkit.org/show_bug.cgi?id=179379)。
Juliusz Gonera

5

您可以尝试以下方法:

<style>
h1:target { padding-top: 50px; }
</style>

<a href="#bar">Go to bar</a>

<h1 id="bar">Bar</h1>

将顶部填充值设置为标题的实际高度。这将在标题的顶部引入一些额外的间隙,但是只有当用户跳到锚点然后向上滚动时,该间隙才可见。我现在已经为我的网站准备了该解决方案,但是它仅在页面顶部显示一个小的固定栏,没有什么高的东西。


嗯 还不错,但还是很hack(可惜在IE中不起作用)。
Tomalak

5

使用上面提到的“ anchor:before”方法,我可以轻松地将它与CSS和HTML一起使用。我认为效果最好,因为它不会在div之间产生大量填充。

.anchor:before {
  content:"";
  display:block;
  height:60px; /* fixed header height*/
  margin:-60px 0 0; /* negative fixed header height */
}

它似乎不适用于页面上的第一个div,但是您可以通过在第一个div上添加填充来解决这一问题。

#anchor-one{padding-top: 60px;}

这是一个有效的小提琴:http : //jsfiddle.net/FRpHE/24/


5

这个对我有用:

HTML锚点链接:

<a href="#security">SECURITY</a>

HTML锚点:

<a name="security" class="anchor"></a>

CSS:

.anchor::before {
    content: "";
    display: block;
    margin-top: -50px;
    position: absolute;
}

4

我使用@Jpsy的答案,但是出于性能原因,我仅在URL中存在哈希的情况下设置计时器。

$(function() {
      // Only set the timer if you have a hash
      if(window.location.hash) {
        setTimeout(delayedFragmentTargetOffset, 500);
      }
  });

function delayedFragmentTargetOffset(){
      var offset = $(':target').offset();
      if(offset){
          var scrollto = offset.top - 80; // minus fixed header height
          $('html, body').animate({scrollTop:scrollto}, 0);
          $(':target').highlight();
      }
  };

OP要求不要使用javascript。
朱利奥·卡钦

适用于外部链接,但不适用于页内链接。
捕捉

4

我在这里和其他地方的许多答案都遇到了很多麻烦,因为我标记为书签的锚点是FAQ页面中的节标题,因此抵消标题无济于事,因为其余内容只会保留在原处。所以我认为我会发布。

我最终要做的是将一些解决方案组合在一起:

  1. CSS:

    .bookmark {
        margin-top:-120px;
        padding-bottom:120px; 
        display:block;
    }

其中“ 120px”是您固定的标题高度(可能加上一些边距)。

  1. 书签链接HTML:

    <a href="#01">What is your FAQ question again?</a>
  2. 带有书签的内容HTML:

    <span class="bookmark" id="01"></span>
    <h3>What is your FAQ question again?</h3>
    <p>Some FAQ text, followed by ...</p>
    <p>... some more FAQ text, etc ...</p>

此解决方案的优点是,该span元素不仅被隐藏,而且实际上已折叠并且不会填充您的内容。

对于这种解决方案,我感到不以为然,因为它来自大量不同的资源,但是在我的情况下,它最适合我。

您可以在此处查看实际结果。


1
非常感谢您的分享!尽管线程很古老,但似乎仍然没有解决该问题的规范方法。
Tomalak

1
+ SteveCinq您读懂了我的想法-我面临着共享解决方案无法按预期工作的相同问题。在<span>跨度中添加锚点,以及添加填充和边距对我来说都很有效。非常感谢您尽管花了很多时间就花时间提交此答案!
twknab

4

我对上面列出的答案没有任何运气,最终使用了效果很好的解决方案...

在要设置锚点的位置创建一个空白跨度。

<span class="anchor" id="section1"></span>
<div class="section"></div>

并应用以下课程:

.anchor {
  display: block;
  height: 115px;       /* same height as header */
  margin-top: -115px;  /* same height as header */
  visibility: hidden;
}

即使这些部分具有不同的彩色背景,该解决方案也将有效!我在此链接中找到了解决方案


1
这与Guillaume LeMière和其他一些人在该帖子中显示的方法不是完全一样吗?
Tomalak '18

它非常相似,但我认为它更易于理解,并且通过与外部资源的更深入链接,可以得到更详细的响应。
马特·安德伍德

这是相同的解决方案,但我可以轻松理解和遵循这一解决方案。其他人没有给我足够的信息。
MacroMan

3

在我的纯粹主义者看来,这有点怪异,但是作为纯CSS解决方案,您可以使用:target选择器将填充添加到活动的锚定元素中:

html, body {height:100%; min-height:100%; margin:0;}
body {min-height:200%;}
header {display:inline-block; position:fixed; font-size:1.5em; height:100px; top:0; left:0; right:0; line-height:100px; background:black; text-align:center;}
header a {color:#fff;}
section {padding:30px; margin:20px;}
section:first-of-type, section:target {padding-top:130px;}
<header><a href="#one">#One</a> <a href="#two">#two</a> <a href="#three">#three</a></header>
<section id="one"><h1>One</h1>Aenean lacinia bibendum nulla sed consectetur. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.</section>
<section id="two"><h1>Two</h1>Aenean lacinia bibendum nulla sed consectetur. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.</section>
<section id="three"><h1>Three</h1>Aenean lacinia bibendum nulla sed consectetur. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.</section>


1
那根本不是hacky!不错的解决方案。
Tomalak

3

我发现我不得不使用这两种 MutttenXd的和Badabam的CSS解决方案结合在一起,作为第一个在Chrome没有工作,Firefox中的第二个没工作:

a.anchor { 
  padding-top: 90px;
}

a.anchor:before { 
  display: block;
  content: "";
  height: 90px;
  margin-top: -90px;
}

<a class="anchor" name="shipping"></a><h2>Shipping (United States)</h2>
...

3

我发现最干净的方法是以下一种:

  #bar::before {
    display: block;
    content: " ";
    margin-top: -150px;
    height: 150px;
    visibility: hidden;
    pointer-events: none;
  }

2

使用jQuery的一种最低限度的介入方法:

链接:

<a href="#my-anchor-1" class="anchor-link">Go To Anchor 1</a>

内容:

<h3 id="my-anchor-1">Here is Anchor 1</a>

脚本:

$(".anchor-link").click(function() {
    var headerHeight = 120;
    $('html, body').stop(true, true).animate({
        scrollTop: $(this.hash).offset().top - headerHeight
    }, 750);
    return false;
});

通过将anchor-link类分配给链接,其他链接(例如手风琴或选项卡控件)的行为不会受到影响。

这个问题不需要javascript,但另一个更受欢迎的问题由于这个问题而被关闭,我无法在那里回答。


2

我需要一些适用于入站链接,页面上的链接并且可以被JS定位的东西,以便页面可以响应页眉高度的变化

的HTML

<ul>
  <li><a href="#ft_who">Who?</a></li>
  <li><a href="#ft_what">What?</a></li>
  <li><a href="#ft_when">When?</a></li>
</ul>
...
<h2 id="ft_who" class="fragment-target">Who?</h2> 
...
<a href="#">Can I be clicked?</a>
<h2 id="ft_what" class="fragment-target">What?</h2>
...
<h2 id="ft_when" class="fragment-target">When?</h2> 

的CSS

.fragment-target {
    display: block;
    margin-top: -HEADER_HEIGHTpx;
    padding-top: HEADER_HEIGHTpx;
    z-index: -1;
}

z-index: -1允许在片段目标上方的“填充区域”链接,还是点击,作为对他的回答评论说@MuttenXd

我尚未在IE 11,Edge 15 +,Chrome 38 +,FF 52+或Safari 9.1+中发现问题


1
<div style="position:relative; top:-45px;">
    <a name="fragment"> </a>
</div>

这段代码可以解决问题。换掉45px,以保持标题栏的高度。

编辑:如果使用jQuery是一个选项,我也已经成功使用具有偏移值集的jQuery.localScroll。offset选项是jQuery.scrollTo的一部分,jQuery.scrollTo是jQuery.localScroll的基础。此处提供了一个演示:http : //demos.flesler.com/jquery/scrollTo/(第二个窗口,在“偏移”下)


该解决方案的工作确实是,但它不是防弹的,它需要大量的细化和微调不同的浏览器:(很好的尝试thoug的我寻找没有额外的标记解决方案。
弗拉德的Saling

可惜这太乱了,意味着您不能只使用ID。很想找到一个解决方案,我尝试了各种事情。
theorise

1

这是将在IE中运行的完整的jquery解决方案:

假设导航栏元素是这样的:

<ul>
    <li><a class="navigation" href="/#contact-us">Contact us</a></li>
    <li><a class="navigation" href="/#about-us">About us</a></li>
</ul>

您可以使用以下jquery片段来抵消滚动:

$(function() {
    $("a.navigation").click(function(event) {
        event.preventDefault();
        offSetScroll($(this));
    });
    offSetScrollFromLocation(window.location.href.toLowerCase());
});

function offSetScroll(anchor) {
    var href = anchor.attr("href");
    offSetScrollFromLocation(href);
}

function offSetScrollFromLocation(href) {
    //Change this according to the height of the navigation bar
    var fromTop = 250;
    if(href.indexOf("#")<=0)
        return;
    var hash=href.substring(href.indexOf("#"));
    var targetOffset = $(hash).offset().top-fromTop;
    $('html, body').animate({scrollTop: targetOffset}, 400, function(e) {

    });
}

我可以使用Thunder中此代码的稍作修改的版本。我在本页和stackoverflow.com/questions/10732690/…以及stackoverflow.com/questions/10732690/…上尝试了许多仅CSS且更简单的解决方案,但由于我的要求,它们无法使用。该页面是一个FAQ页面,无论页面上还是页面外都有许多锚点可以定位到该页面,因此可能会有很多空白点。继续在下
杰弗里·西蒙

1
为了使它对我有用,这是一些小的更改:(1)将href.index行中的“ <=”更改为“ <”以允许页面上导航;(2)更改供我使用的“ a.navigation”(必须为“ #faq a”);(3)根据移动与台式机之间的差异,将var从top = 250更改为基于window.innerWidth的三元;(4)将动画的400更改为1,因为不需要动画并且0不起作用;(5)如果加($(“我的页面选择器”)的匿名函数调用offSetScrollFromLocation前的长度,以防止在不需要的网页上不必要的调用。
杰弗里·西蒙

1

使用:before实现非常有效,直到我们意识到伪元素实际上覆盖并阻止了位于伪元素区域的指针事件。在锚点上甚至直接在锚点pointer-events: none上使用类似的东西:before都没有影响。

我们最终要做的是使锚的位置绝对,然后将其位置调整为固定区域的偏移/高度。

偏移锚点,不阻塞指针事件

.section-marker {

    position: absolute;
    top: -300px;
}

这样做的价值在于我们没有阻止任何可能落在这300px之内的元素。不利的一面是,从Javascript获取元素的位置时需要考虑该偏移量,因此必须调整其中的任何逻辑。


1

这就是我单击导航时最终到达正确位置的方法。我为导航点击添加了事件处理程序。然后,您可以使用“ scrollBy”在偏移量上向上移动。

var offset = 90;

 $('.navbar li a').click(function(event) {
    event.preventDefault();
    $($(this).attr('href'))[0].scrollIntoView();
    scrollBy(0, -offset);
 });

2
解决了问题,但没有解决“没有Java
脚本

1

我创建了一个带有几个换行符的div并指定了ID,然后将要显示的代码放在下面。然后,该链接会将您带到图像上方的空间,并且标题将不再妨碍您:

<a href="#image">Image</a>
<div id="image"><br><br></div>
<img src="Image.png">

当然,您可以更改换行的数量以适合您的需求。这对我来说非常理想,尽管不确定是否有任何问题,但我仍在学习HTML。


实用,但有一个缺点-它仅适用于页面上的第一个标题。如果标题更多,由于<br>每个标题之前都有标签,您将开始在文本中看到较大的空白。
Tomalak

1

使用了这个脚本

$(document).on('click', 'a[href^="#"]', function (event) {
    event.preventDefault();

    $('html, body').animate({
        scrollTop: $($.attr(this, 'href')).offset().top -140
    }, 1000);
});

请尝试解释为什么您认为此脚本可以解决问题
Ali Kanat

1

我认为这种方法更有用:

<h2 id="bar" title="Bar">Bar</h2>

[id]:target {
    display: block;
    position: relative;
    top: -120px;
    visibility: hidden;
}

[id]:target::before {
    content: attr(title);
    top: 120px;
    position: relative;
    visibility: visible;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.