ナビゲーションを固定にしたときにコンテンツが隠れてしまう対処法
ページの上部に固定ナビゲーションを配置する際によく起こる現象ですが、指定の場所にページ内リンクをさせた時に、少し上にずれてしまって要素(コンテンツが)見えなくなることがあります。
その他にも、「ページ画面のギリギリの位置過ぎて見栄えが良くない・・・」や「そもそも固定ナビゲーションの下に隠れてしまって見えない・・・」など、どうにかしたいってときの対処方法をご紹介します。
今回はCSSのみで解決できる簡単な方法になります。

まずは、サンプルでどういった現象なのか確認していきましょう。
HTML
サンプルでは<header>に固定バナーを配置しています。そして、それぞれのナビゲーションをクリックすると「#n1」などのページ内リンクへ遷移するように設定しています。
<header>
<ul class="g-nav">
<li><a href="#n1">NAVI1</a></li>
<li><a href="#n2">NAVI2</a></li>
<li><a href="#n3">NAVI3</a></li>
<li><a href="#n4">NAVI4</a></li>
<li><a href="#n5">NAVI5</a></li>
</ul>
</header>
<section id="mainVisual">
<h1>NEWYORK</h1>
</section>
<section id="contents">
<div class="conts bg1">
<h2 id="n1">CATEGORY-1</h2>
<div>STAGE1</div>
</div>
<div class="conts bg2">
<h2 id="n2">CATEGORY-2</h2>
<div>STAGE2</div>
</div>
<div class="conts bg3">
<h2 id="n3">CATEGORY-3</h2>
<div>STAGE3</div>
</div>
<div class="conts bg4">
<h2 id="n4">CATEGORY-4</h2>
<div>STAGE4</div>
</div>
<div class="conts bg5">
<h2 id="n5">CATEGORY-5</h2>
<div>STAGE5</div>
</div>
</section>
<footer>
<h6>DemoSample</h6>
</footer>CSS
少し長いCSSになっていますが、ポイントは<header>が「position: fixed;」で固定ナビゲーションであること。遷移先の要素を囲む<div class=”conts”>に「padding: 60px;」が指定されていること。
header{
position:fixed;
top:0;
width: 100%;
}
.g-nav{
position: relative;
display: flex;
}
.g-nav li{
width: 25%;
height: 60px;
background: #111;
box-sizing: border-box;
border-right: 1px solid #FFF;
text-align: center;
display: table;
}
.g-nav li:last-child{
border-right: none;
}
.g-nav li a{
display: block;
padding: 0;
color:#FFF;
display: table-cell;
vertical-align: middle;
}
.g-nav li a:hover{background: #999;}
#mainVisual{
width: 100%;
height: 100vh;
background: url(../images/newyork.jpg) no-repeat;
background-size: cover;
display: table;
margin-top:60px;
}
h1{
text-align: center;
color:#FFF;
font-size: 100px;
font-family: "Abril Fatface", serif;
font-weight: 400;
font-style: normal;
display: table-cell;
vertical-align: middle;
}
h2{
text-align: center;
color:#111;
font-size: 80px;
font-family: "Abril Fatface", serif;
font-weight: 400;
font-style: normal;
}
#wrapper{
width: 980px;
margin: 0 auto;
text-align: center;
}
#contents{
height: auto;
background:#ccc;
}
.conts{
height: 500px;
border-bottom: 1px solid #111;
text-align:center;
padding: 60px;
}
.bg1{background: #f4b3c2;}
.bg2{background: #f8e58c;}
.bg3{background: #f9c89b;}
.bg4{background: #a59aca;}
.bg5{background: #bbc8e6;}
footer{
width: 100%;
height: 600px;
display: table;
}
h6{
display: table-cell;
vertical-align: middle;
text-align: center;
font-family: "Abril Fatface", serif;
font-weight: 400;
font-style: normal;
}一旦、このHTMLとCSSで表示されるデモページを見てみましょう。
固定ナビゲーションのボタンをクリックすると、下画像のようになります。

遷移先が<div class=”conts”>のため、画面の一番上に<div class=”conts”>の一番上の位置が来てしまう。固定ナビゲーションでなければ何も問題はないけれど、ナビゲーションの裏側に隠れてしまって見えなくなっています。
この現象を解決して、固定ナビゲーションの下の位置に<div class=”conts”>の一番上の位置がくるように調整していきます。
scroll-padding-topプロパティで位置を調整するだけ
まず、以下の2点の距離を確認します。
- 固定ナビゲーションの高さ
- 遷移先に指定した要素のpaddingの大きさ
「.g-nav li」に対して「height: 60px;」を指定しているので、固定ナビゲーションの高さは「60px」です。そして遷移先の「div class=”conts”」に「padding: 60px;」を指定しているので、こちらも「60px」です。

上の2点を踏まえて、CSSを調整していきますが、先ほどのCSSに以下のコードを追記すればOKです。
CSSに追記
html {
scroll-padding-top: 120px; /* 固定ヘッダーの高さに合わせて調整します */
scroll-snap-type: y proximity; /* 垂直方向に自然なスナップをさせる */
}まず、先程の2点の距離の合計(60px+60px=120px)を、htmlに「scroll-padding-top: 120px;」と指定します。ついでにスムーズなスクロールをするために「scroll-snap-type: y proximity;」を指定して自然にスナップするようにします。
scroll-padding-top
アンカーリンクでページ内遷移をしたときに、ずれてしまう距離を「scroll-padding-top」に指定するだけで位置の調整が可能です。
scroll-snap-type: y proximity
垂直方向にスクロールさせる際に、要素の位置できちんと止まらせたい場合にこちらの指定をすると自然なスクロールを実現します。
以上の設定で、思い通りの位置にピタっと止まるようになっていると思います。最後に「デモサンプル2」を確認してみてください。
ページ内遷移でずれてしまう現象にお困りの方は、ぜひ参考にしてみてください。