※当サイトの記事には、広告・プロモーションが含まれます。

position:fixedの固定ナビとjQueryのスクロール

グローバルナビなどをcssのposition:fixedなどで固定した場合、ページ内リンクさせようとする際に、リンク先でのズレや、jQueryのanimateを使ってのページ内スクロールなどが、固定したナビの高さの分だけズレてしまうようです。

対処の仕方として、cssで調整する方法と、javascriptで調整する方法があるようです。

 

 高さ240pxの<div id="nav">をposition:fixedで固定し、top: 60px;とした場合

HTML

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
<title>リンク先のズレを解消</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="header">
<h1>リンク先のズレを解消</h1>
</div><!--#header-->

<div id="nav">
<ul>
<li><a href="#rice">おにぎり</a></li>
<li><a href="#soba">お蕎麦</a></li>
<li><a href="#pasta">パスタ</a></li>
<li><a href="#ramen">らーめん</a></li>
</ul>
</div><!--#nav-->

<div id="container">
<div id="nav">
<ul class="ch-grid">
<a href="#rice">
<li>
<div class="ch-item ch-img-1">
<div class="ch-info"><h3>おにぎり</h3>
<p>Rice balls with variety of filling like cooked seafood, Japanese pickles and such</p>
</div><!--ch-info-->
</div><!--.ch-item .ch-img-1-->
</li>
</a>
<a href="#soba">
<li>
<div class="ch-item ch-img-2">
<div class="ch-info"><h3>お蕎麦</h3>
<p>Soba are Japanese brown noodles made from buckwheat flour</p>
</div><!--ch-info-->
</div><!--.ch-item .ch-img-2-->
</li>
</a>
<a href="#pasta">
<li>
<div class="ch-item ch-img-3">
<div class="ch-info"><h3>パスタ</h3>
<p>Pasta is eaten at considerable frequency in Japan</p>
</div><!--ch-info-->
</div><!--.ch-item .ch-img-3-->
</li>
</a>
<a href="#ramen">
<li>
<div class="ch-item ch-img-4">
<div class="ch-info"><h3>らーめん</h3>
<p>Ramen was originally imported from China and has become one of the most popular dishes in Japan</p>
</div><!--ch-info-->
</div><!--.ch-item .ch-img-4-->
</li>
</a>
</ul><!--.ch-grid-->
</div><!--#nav-->

<div id="content">
<h3 id="rice">おにぎり</h3>
<div class="primary">
<h4>梅干し</h4>
<p>108円</p>
</div><!--.primary-->
<div class="primary">
<h4>おかか</h4>
<p>108円</p>
</div><!--.primary-->
<div class="primary">
<h4>しゃけ</h4>
<p>108円</p>
</div><!--.primary-->
<div class="primary">
<h4>昆布</h4>
<p>108円</p>
</div><!--.primary-->

<!--(途中省略)-->

<h3 id="ramen">らーめん</h3>
<div class="primary">
<h4>醤油らーめん</h4>
<p>324円</p>
</div><!--.primary-->
<div class="primary">
<h4>塩らーめん</h4>
<p>324円</p>
</div><!--.primary-->
<div class="primary">
<h4>味噌らーめん</h4>
<p>432円</p>
</div><!--.primary-->
<div class="primary">
<h4>豚骨らーめん</h4>
<p>432円</p>
</div><!--.primary-->

<h3 id="ninki">人気商品</h3>
<div class="primary">
<h4>しゃけ</h4>
<p>324円</p>
</div><!--.primary-->
<div class="primary">
<h4>天麩羅そば</h4>
<p>324円</p>
</div><!--.primary-->
<div class="primary">
<h4>ボンゴレ</h4>
<p>432円</p>
</div><!--.primary-->
<div class="primary">
<h4>豚骨らーめん</h4>
<p>432円</p>
</div><!--.primary-->

<h3 id="osusume">おすすめ</h3>
<div class="primary">
<h4>しゃけ</h4>
<p>324円</p>
</div><!--.primary-->
<div class="primary">
<h4>天麩羅そば</h4>
<p>324円</p>
</div><!--.primary-->
<div class="primary">
<h4>ボンゴレ</h4>
<p>432円</p>
</div><!--.primary-->
<div class="primary">
<h4>豚骨らーめん</h4>
<p>432円</p>
</div><!--.primary-->
</div><!--#content-->
</div><!--#container-->
<div id="footer">
<p>スクロールのズレを解消</p>
</div><!--#footer-->

</body>
</html>

cssで調整する場合

 padding-topで固定したナビの高さ分をズラし、margin-topでマイナスの値をいれます。

css

style.css

#header {
width: 960px;
height: 60px;
margin: 0 auto;
}
#container {
width: 960px;
margin: 0 auto;
}
#nav {
width: 960px;
height: 240px;
position: fixed;
left:50%;
margin-left: -480px;
top:60px;
z-index: 10;
overflow: hidden;
background: rgba(0,0,0,0.7);
}

#nav ul {
list-style-type: none;
padding: 0 0 0 4px;
margin: 0;
}
#nav a {
text-align: center;
display: inline-block;
text-decoration: none;
color: #FFFFFF;
cursor: pointer;
}
#nav li {
width: 234px;
height: 234px;
display: inline-block;
z-index: 20;
}
/ *hover-anime(Circle Hover Effects)の始まり*/
.ch-item {
width: 100%;
height: 100%;
border-radius: 50%;
position: relative;
cursor: pointer;
box-shadow:
inset 0 0 0 0 rgba(200,95,66, 0.4),
inset 0 0 0 16px rgba(255,255,255,0.6),
0 1px 2px rgba(0,0,0,0.1);
transition: all 0.4s ease-in-out;
}
.ch-img-1 {
background-image: url(../img/01.png);
}
.ch-img-2 {
background-image: url(../img/02.png);
}
.ch-img-3 {
background-image: url(../img/03.png);
}
.ch-img-4 {
background-image: url(../img/04.png);
}
.ch-info {
position: absolute;
width: 100%;
height: 100%;
border-radius: 50%;
overflow: hidden;
opacity: 0;
transition: all 0.4s ease-in-out;
transform: scale(0);
backface-visibility: hidden;
}
.ch-info h3 {
color: #fff;
text-transform: uppercase;
position: relative;
letter-spacing: 2px;
font-size: 22px;
margin: 0 30px;
padding: 65px 0 0 0;
height: 60px;
font-family: 'Open Sans', Arial, sans-serif;
text-shadow:
0 0 1px #fff,
0 1px 2px rgba(0,0,0,0.3);
}

.ch-info p {
color: #fff;
padding: 10px 5px;
font-style: italic;
margin: 0 30px;
font-size: 12px;
border-top: 1px solid rgba(255,255,255,0.5);
}

.ch-info p a {
display: block;
color: rgba(255,255,255,0.7);
font-style: normal;
font-weight: 700;
text-transform: uppercase;
font-size: 9px;
letter-spacing: 1px;
padding-top: 4px;
font-family: 'Open Sans', Arial, sans-serif;
}

.ch-info p a:hover {
color: rgba(255,242,34, 0.8);
}
.ch-item:hover {
box-shadow:
inset 0 0 0 110px rgba(200,95,66, 0.4),
inset 0 0 0 16px rgba(255,255,255,0.8),
0 1px 2px rgba(0,0,0,0.1);
}
.ch-item:hover .ch-info {
opacity: 1;
transform: scale(1);
}

/* hover-anime(Circle Hover Effects)の締め */

/*リンク先のズレのcssで調整する場合の部分の始まり*/
#content{
padding-top: 260px;
overflow: hidden;
}
#content h3 {
clear: both;
}
#rice {
margin-top:-300px;
padding-top:300px;
}
#soba {
margin-top:-300px;
padding-top:300px;
}
#pasta {
margin-top:-300px;
padding-top:300px;
}
#ramen {
margin-top:-300px;
padding-top:300px;
}
#ninki {
margin-top:-300px;
padding-top:300px;
}

/*リンク先のズレのcssで調整する場合の部分の締め、javascriptで調整の場合は消す*/

.primary {
float: left;
width: 240px;
}
.primary h4, .primary p {
width: 240px;
text-align: center;
}
#footer {
clear: both;
}
#footer p {
width: 960px;
margin: 0 auto;
text-align: center;
}

javascriptで調整する場合

<script type="text/javascript">

$(function ( ) {
  var navHight = 300; //ナビ(#nav)の高さ
//aタグのhref属性の値が「#」から始まる要素がクリックされたら
  $('a[href^=#]').click(function( ){
//animateの引数で動きの速さを変数speedとしてます
    var speed = 1000;
//クリックされた要素のhrefの値(リンク先、アンカーの値)を取得し変数hrefに格納
    var href = $(this).attr("href");
//移動先を取得。3項演算子で、hrefが#か""の条件で処理を分岐。
    var target = $(href == "#" || href == "" ? 'html' : href);
//移動先を数値で取得
    var position = target.offset( ).top-navHight; //ヘッダの高さ分位置をずらす
//animate()関数でアクションのあるスクロール
    $("html, body").animate({scrollTop:position}, speed, "swing");
    return false;
  });
});

 </script>

 

⇩ jQueryセレクターについていろいろ紹介してくれてます

jQuery – いろんなセレクタ指定方法+αを覚えて、目的の要素をさくっと取得する | 1:n - DETELU Blog

今回はこのへんで。