固定ページヘッダーがページ内アンカーと重なる


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; }
flen

*同じページまたは他のページからのアンカーに機能し、*コンテンツがヘッダーでクリップされないようにページダウンキーを調整し、* sib-divフッターに許可するソリューションを探していますcontent-divで上にスクロールします。まだ解決策が見つかりません!しかし、私は言わなければなりません。正しい方法は、個々のアンカーではなく、コンテンツdiv全体をターゲットにすることだと思います。stackoverflow.com/questions/51070758/...
ジョニー理由

@斧。CSS-tricks.comには、scroll-padding-topこちらに関するより優れた新しい記事があります。css
tricks.com

回答:


167

私も同じ問題を抱えていました。トップバーの高さをパディングトップ値としてアンカー要素にクラスを追加することで解決しました。

<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 14年

9
Roy Shoaの回答で提案されているようにmargin-top: -90px;、パディングによって作成されたギャップに対抗するために追加します。
Skippy le Grand Gourou 2015

37
.anchor:target {padding-top: 90px;}アンカータグを使用したときにパディングのみが追加されるように使用しました。この方法では、ページが上部に読み込まれる場合、常に多くのパディングがあるとは限りません。ページの下の特定のポイントをロードする場合のみ。
jimmyplaysdrums

265

新しいクラスを設定できない場合、または設定したくない場合は、CSSの疑似クラスにfixed-height ::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
私はあなたのソリューションが本当に好きです。それは私が見つけた最もクリーンなソリューションです。
Itay Grudev 2015

5
これは、ページレイアウトの他の部分を詰め込むことなく、私にとって完璧に機能するソリューションです。
ジェイミーカール、

2
CSSソリューションをWebKitのリストで使用すると問題が発生します。ルック:stackoverflow.com/questions/39547773/...
MERT S.カプラン

14
margin-collapseに依存しているため、ターゲットに上部パディングまたは境界がある場合は機能しません。
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で機能する2番目の解決策があります
スカベンジャー

これを最新のFirefox(PCでは55.0.3)でテストし、現在は機能しています。:-)
RachieVee 2017年

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/...
MERT S.カプラン

ターゲット要素自体にdisplay: flex;or がある場合、これは機能しないことに注意してください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

これは美しいソリューションです。スクロール動作を使用しました。また、アンカーに移動します。2行のコードで非常に簡単です
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
すべての答えのうち、これが私のために働いた唯一のものです!
ハビエルアリアス2018年

18

提案されたソリューションの一部は同じページのフラグメントリンク(=ハッシュリンク)で機能しますが(下にスクロールするメニューリンクのように)、他からのフラグメントリンクを使用したい場合、現在のChromeでは機能しませんでした。ページ

最初からwww.mydomain.com/page.html#fooを呼び出すように、意志はありませんても、現在のChromeのターゲットが、指定されたCSSソリューションまたはJSソリューションでオフセット。

問題の詳細を説明するjQueryバグレポートもあります。

解決

これまでにChromeで実際に機能する唯一のオプションは、onDomReadyではなく遅延を伴うJavaScriptです。

// 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 2016

今日私はその問題を抱えており、私はあなたの解決策を使いました。タイムアウトは必要ないようですが。これはIIFEとしても機能します。
kwiat1990

1
@ kwiat1990:はい、可能です。ただし、JSがHTMLコードの最後に配置されている場合のみです。そうしないと、スクロールターゲットがまだDOMにない可能性があります。実際、それがonDomReadyを使用する全体のポイントです。ですから、タイムアウトバージョンが安定した方法だと思います。
Jpsy 2017

この回答は、外部リンクで機能する唯一の回答でした。ただし、リンクが同じページで呼び出された場合は機能しません:(何かアイデアはありますか?
AugustoSamaméBarrientos '27

@Augustoあなたは解決策を見つけましたか?私も同じ問題を抱えています。
Jesse

9

CSSスクロールスナップ仕様は試合に出たとき、それはで容易に可能であるscroll-margin-topプロパティ。現在、ChromeとOperaで実行されています(2019年4月)。また、Safari 11以降でもこれをサポートするはずですが、Safari 11では実行できませんでした。

コードペンの例

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=

Safariでは次のように呼ばれscroll-snap-margin-topます:caniuse.com/#search=scroll-margin-top
Mu-Tsun Tsai

@ 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 2016

7

私にとって魅力のように機能する別の純粋なCSSソリューションを発見しました!

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

このサイトで見つかりました!


2
他のいくつかの人があなたの前にこのソリューションを発見しました。1ページの回答を参照してください。たとえば、stackoverflow.com
a / 56467997/18771

申し訳ありませんが、気づいていない!ありがとう!
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>

上部のパディング値をヘッダーの実際の高さに設定します。これにより、ヘッダーの上部に少し余分なギャップが生じますが、ユーザーがアンカーにジャンプして上にスクロールしたときにのみ表示されます。私は今、自分のサイト用にそのソリューションを作成しましたが、ページの上部に小さな固定バーのみが表示され、高すぎません。


ん 悪くはありませんが、それでもかなりのハックです(残念ながらIEでは機能しません)。
Tomalak、2012

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を使用しないように求めました。
Giulio Caccin 2017

外部リンクでは機能しますが、ページはめ込みリンクでは機能しません。
スナップ

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
共有してくれてありがとう!スレッドが古くなっているため、この問題に対する標準的な解決策はまだ存在していないようです。
トマラック

1
+ SteveCinqあなたは私の心を読みました-私は、共有ソリューションが予測どおりに機能しないのと同じ問題に直面していました。追加する<span>私のために働いたパディングとマージンに追加するとともに、スパンでアンカーに。スレッドの年齢に関係なく、この回答を提出するために時間を割いていただき、ありがとうございます。
twknab 2018

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

非常によく似ていますが、理解しやすく、外部ソースへのより詳細なリンクを使用すると、より詳細な応答が得られると思います。
Matt Underwood、

それは同じ解決策ですが、私はこれを簡単に理解して従うことができます。他の人は私に十分な情報を与えませんでした。
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
それはまったくハッキーではありません!素晴らしい解決策。
Tomalak

3

最初のものはChromeでは機能せず、2つ目はFirefoxでは機能しないため MutttenXdBadabam両方のCSSソリューションを一緒に使用する必要があることがわかりました。

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;
});

アンカーリンククラスをリンクに割り当てることにより、他のリンク(アコーディオンやタブコントロールなど)の動作には影響しません。

質問は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>

このコードでうまくいくはずです。ヘッダーバーの高さを45ピクセルに変更します。

編集:jQueryの使用がオプションの場合、オフセット値を設定してjQuery.localScrollを使用することもできました。offsetオプションは、jQuery.localScrollが構築されているjQuery.scrollToの一部です。デモはこちらから入手できます:http : //demos.flesler.com/jquery/scrollTo/(「オフセット」の下の2番目のウィンドウ)


この解決策は確かに動作しますが、それは防弾ではなく、それが別のブラウザ:(良いトライthougためfinetuningの多くを必要と私は余分なマークアップなしのソリューションを探しています。。
セーリングヴラド

残念ですが、これは非常に厄介で、IDだけを使用することはできません。解決策を見つけたいと思います、私はあらゆる種類のものを試しました。
理論を

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からこのコードのわずかに変更されたバージョンを使用することができました。私は、このページとでCSSのみでシンプルなソリューションの多くを試してみましたstackoverflow.com/questions/10732690/...と上stackoverflow.com/questions/10732690/...が、彼らは原因私の要求に使用できませんでした。このページはFAQページであり、ページの内外から多くのアンカーを配置するため、空白のスポットがたくさんある可能性があります。次のコメントに続く....
ジェフリーサイモン

1
これを機能させるために、マイナーな変更を以下に示します。(1)href.index行の "<="を "<"に変更して、ページ上のナビゲーションを許可します。(2)使用するために「#faq a」である必要があった「a.navigation」を変更します。(3)モバイルとデスクトップの違いについて、var fromTop = 250をwindow.innerWidthに基づく3値に変更します。(4)アニメーションは望ましくなく、0は機能しないため、animateの400を1に変更します。。(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
問題を解決しますが、「JavaScriptの助けなし」の部分は解決しません...
Tomalak '27

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;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.