プロが教える店舗&オフィスのセキュリティ対策術

CSSのcurrentを使ったグローバルナビゲーションの作り方を教えてください。

以下のように二枚のつながった背景画像をロールオーバーさせるCSSのcurrentを使ったグローバルナビゲーションの作り方を教えてください。

画像URLと参考サイト
http://www.kagaya.co.jp/images/menu_gNav.gif
http://www.kagaya.co.jp/index.php

A 回答 (4件)

※先に一番下を読んでもらう方がいいかもしれません。


まずHTMLに関してですが、メニューリストという扱いになるので現状は以下のようにマークアップされることが多いです。

<ul id="NAV">
<li id="OMOTENASHI"><a href="#">おもてなし</a></li>
<li id="SUGOSHIKATA"><a href="#">過ごし方</a></li>
<li id="KYAKUSHITSU"><a href="#">客室</a></li>
</ul>

あまり多くてもやることは代わらないので、3つのメニュー項目でサンプルを書いてみます。

CSSでのレイアウトはfloatでボックスを並べて、幅と高さを指するだけです。この時、ブラウザごとにデフォルトの初期値が異なるプロパティがあるため、その部分を先に初期化しておきます。


/* 初期化 */

#NAV,#NAV *{
margin:0;
padding:0;
}

/* レイアウト */

#NAV {
width:960px;
height:60px;
}

#NAV li {
float:left;
width:160px;
height:60px;
}


ここまでで大まかなレイアウトはできていますが、a要素がまだインライン要素なので、ボタン全域をカバーできていません。なのでブロック要素にします。
メニューの●も消しましょう。


/* 初期化 */

#NAV,#NAV *{
margin:0;
padding:0;
}

/* レイアウト */

#NAV {
width:960px;
height:60px;
}

#NAV li {
list-style:none;
float:left;
width:160px;
height:60px;
}

#NAV a {
display:block;
}


今回の場合、CSSで画像を表示する方法としてbackground(背景画像)を利用します。
アクティブ時(hover)の画像だけを個別に指定し、全体の画像をul要素に一括で指定しておくと記述がすっきりします。


/* 初期化 */

#NAV {
width:960px;
height:60px;
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 0 0;
}

/* レイアウト */

#NAV li {
list-style:none;
float:left;
width:160px;
height:60px;
}

#NAV a {
display:block;
}

/* ロールオーバー時の画像 */

#NAV #OMOTENASHI a:hover {
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 0 60px;
}

#NAV #SUGOSHIKATA a:hover {
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 160px 60px;
}

#NAV #KYAKUSHITSU a:hover {
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 320px 60px;
}


最後に文字が画像にかぶっているので画面の外に飛ばして完成です。


/* 初期化 */

#NAV {
width:960px;
height:60px;
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 0 0;
}

/* レイアウト */

#NAV li {
list-style:none;
float:left;
width:160px;
height:60px;
}

#NAV a {
display:block;
text-indent:-9999px;
}

/* ロールオーバー時の画像 */

#NAV #OMOTENASHI a:hover {
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 0 60px;
}

#NAV #SUGOSHIKATA a:hover {
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 160px 60px;
}

#NAV #KYAKUSHITSU a:hover {
background:url(http://www.kagaya.co.jp/images/menu_gNav.gif) no-repeat 320px 60px;
}


と作りかたを書いたのはいいのですが・・・
この方法はサーバーの負担を減らせるので大規模サイトでの利用は考慮できますが、デメリットもあるためあまりおすすめしません。
CSSでのロールオーバーはまだ完全に環境が整っていない状況です。
現状では以下のリンク先のようなjavascriptを使う方が適していると思います。
http://css-happylife.com/log/javascript/000157.s …
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
よくわかりました。
解決することができましたありがとうございました!

ところで、
#NAV,#NAV *{
margin:0;
padding:0;
}
の記述がよくわからないのですが、
#NAV {
margin:0;
padding:0;
}
ではいけないのでしょうか?
なぜ#NAVを二つ並べるのでしょうか?
お時間あればご教授ください。

お礼日時:2009/10/09 15:42

画像の位置指定間違ってました・・・(汗



#NAV #OMOTENASHI a:hover {
background:url(​http://www.kagaya.co.jp/images/menu_gNav.gif)​ no-repeat 0 -60px;
}

#NAV #SUGOSHIKATA a:hover {
background:url(​http://www.kagaya.co.jp/images/menu_gNav.gif)​ no-repeat -160px -60px;
}

#NAV #KYAKUSHITSU a:hover {
background:url(​http://www.kagaya.co.jp/images/menu_gNav.gif)​ no-repeat -320px -60px;
}
    • good
    • 0

>なぜ#NAVを二つ並べるのでしょうか?



今回の場合では

#NAV {
margin:0;
padding:0;
}

でもかまわないのですが、一応汎用性を持たせています。
例えばhtmlの記述的に

<ul>
<li>
<p id="OMOTENASHI"><a href="#">おもてなし</a></p>
<p id="SUGOSHIKATA"><a href="#">過ごし方</a></p>
<p id="KYAKUSHITSU"><a href="#">客室</a></p>
</li>
</ul>

となるケースもあるかもしれませんし。
CSSを使ってレイアウトするとき、最初に大まかな初期化する人もいるのでそれにもあわせた感じです。
例えば初期化で一番簡単な書き方だと以下のようになります。

*{
margin:0;
padding:0;
}
    • good
    • 0
この回答へのお礼

丁寧な解説本当にありがとうございます!

なるほど、よくわかりました。

しかし、
#NAV,#NAV *{
margin:0;
padding:0;
}


#NAV, *{
margin:0;
padding:0;
}
とはならないんですね。

#NAV {
margin:0;
padding:0;
}

*{
margin:0;
padding:0;
}
が合体したものだから
#NAV, *{
margin:0;
padding:0;
}
と考えたのですが、

#NAV,#NAV *
と#NAVを二つ並べて書かないとならないロジックがいまいち分からないのですが、もしお時間が許すのであれば教えてください。

お礼日時:2009/10/09 18:53

#NAV,*{ }



と記述するなら大抵の場合

*{ }

で同じ効果が得られます。
ですがこのままではナビゲーション以外の要素にもmarginとpaddingの設定がされてしまい見た目が崩れる原因になります。

#NAV,#NAV * { }

これはあくまでナビゲーションとその子要素への指定に限定している感じです。


*(全称セレクタ)を使った初期化も簡単な例として提示しましたが、実はそんなに多く使われてはいません。
全称セレクタは全ての要素に適用を対象としているので、input要素のように各ブラウザによってCSSでも調整が困難な要素にまで設定が適用されてしまうためです。
実際には以下のように個別に指定する方法が多いのではないかと思います。

body, p, ul, ol, h1 , h2 , h3 , h4 , h5 , h6 {
margin:0;
padding:0;

}
    • good
    • 0
この回答へのお礼

なるほどわかりました!

#NAV,#NAV * { }とは
#NAVと#NAVの中の全ての子要素?に適用する書き方という事ですね!

ご丁寧な解説でとても助かりました!ありがとうございました!

お礼日時:2009/10/22 15:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!