CSSのcurrentを使ったグローバルナビゲーションの作り方を教えてください。
以下のように二枚のつながった背景画像をロールオーバーさせるCSSのcurrentを使ったグローバルナビゲーションの作り方を教えてください。
画像URLと参考サイト
http://www.kagaya.co.jp/images/menu_gNav.gif
http://www.kagaya.co.jp/index.php
No.1
- 回答日時:
※先に一番下を読んでもらう方がいいかもしれません。
まず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 …
早速の回答ありがとうございます。
よくわかりました。
解決することができましたありがとうございました!
ところで、
#NAV,#NAV *{
margin:0;
padding:0;
}
の記述がよくわからないのですが、
#NAV {
margin:0;
padding:0;
}
ではいけないのでしょうか?
なぜ#NAVを二つ並べるのでしょうか?
お時間あればご教授ください。
No.2
- 回答日時:
画像の位置指定間違ってました・・・(汗
#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;
}
No.3
- 回答日時:
>なぜ#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;
}
丁寧な解説本当にありがとうございます!
なるほど、よくわかりました。
しかし、
#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を二つ並べて書かないとならないロジックがいまいち分からないのですが、もしお時間が許すのであれば教えてください。
No.4ベストアンサー
- 回答日時:
#NAV,*{ }
と記述するなら大抵の場合
*{ }
で同じ効果が得られます。
ですがこのままではナビゲーション以外の要素にもmarginとpaddingの設定がされてしまい見た目が崩れる原因になります。
#NAV,#NAV * { }
これはあくまでナビゲーションとその子要素への指定に限定している感じです。
*(全称セレクタ)を使った初期化も簡単な例として提示しましたが、実はそんなに多く使われてはいません。
全称セレクタは全ての要素に適用を対象としているので、input要素のように各ブラウザによってCSSでも調整が困難な要素にまで設定が適用されてしまうためです。
実際には以下のように個別に指定する方法が多いのではないかと思います。
body, p, ul, ol, h1 , h2 , h3 , h4 , h5 , h6 {
margin:0;
padding:0;
}
なるほどわかりました!
#NAV,#NAV * { }とは
#NAVと#NAVの中の全ての子要素?に適用する書き方という事ですね!
ご丁寧な解説でとても助かりました!ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSでサイトの背景に画像を組み込みたいのですが反映されません 2 2022/11/22 16:21
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- HTML・CSS 画像が分割されて切り替わる、ループアニメーションが作りたい 7 2023/05/27 17:12
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- ホームページ作成・プログラミング ホームページ作成について。「ワードプレスではありません」。 3 2023/08/13 14:44
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- HTML・CSS サイトをマルチデバイス対応にする為の準備や、CSSなどのおすすめサンプル集やアドバイスを頂きたいです 1 2022/07/13 22:15
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- PHP アップロードファイルの数に応じてCSSを動的に変更したいのですが、方法がわかりません 3 2023/07/23 21:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
htmlの文字が縦書きになる
-
CSS、width100%でもできる余白
-
インラインフレーム内の表示位...
-
CSS テキストフィールドの文字...
-
widthやheightの数値に単位(px...
-
div要素の左寄せ、中央寄せ、右...
-
CSS:animation開始位置の設定
-
マウスオーバー時に画像と一緒...
-
safariだけ、cssが効きません!
-
初心者html・CSS ウィンドウを...
-
border-style:solidで文字がずれる
-
ライトボックスでスクロールバー
-
余分な縦スクロールバーが出て...
-
テーブルのセル間に余白が空い...
-
ヘッダーの高さが合わない
-
CSSでiframe要素の編集
-
CSSで「overflow:scroll」をしてい
-
cssでの幅の分割(固定・可変混...
-
HTMLのiframeの入れ子について
-
【HTML】【CSS】【Swiper】 元...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
htmlの文字が縦書きになる
-
widthやheightの数値に単位(px...
-
画像イメージの上下左右、欲し...
-
css初心者 フレックスボックス...
-
表示倍率を変えるとレイアウト...
-
CSSがなぜかfont-sizeだけ効か...
-
CSS、width100%でもできる余白
-
W3Cのソースコードの検証サービ...
-
CSS:animation開始位置の設定
-
CSSで指定した背景画像にリンク...
-
<div>と<div>の間の10px程の...
-
余分な縦スクロールバーが出て...
-
CSSでボックスのheightが0になる
-
【CSS】ヘッダーの高さが不明の...
-
スクロールボックスを中央に配...
-
li 黒丸含んで移動する方法
-
border-style:solidで文字がずれる
-
【HTML&CSS】フッター下部の余...
-
Media Queries 4 で 非推奨とな...
-
初心者html・CSS ウィンドウを...
おすすめ情報