• ベストアンサー

CSSでID指定の親子を重ねる理由

<div id="1"> <div id="2"> </div> </div> というDOM構造に対し、 #1 #2{color:#fff;} のようなスタイルの指定をサンプルやハウツーよく見かけます。 2はIDなので、わざわざ親の#1の中にある#2と指定しなくても#2が指定されるでしょう。 なぜ、#1 #2{color:#fff;}のような記述をするのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

No.2です。 >ブラウザがDOMツリーを上から順に読み込み、先にCSS抜きでHTMLとHTMLに記載された画像をブラウザに表示するでしょう。  想像で書いたらダメです。実はブラウザ自身もスタイルシートを持っているのです。具体的にどのように動作するかはブラウザによって異なるでしょうが、  仕様書には、 1) 対象の要素とプロパティに適用される宣言をすべて検索する 2) 宣言の最初のソートは、優先度及び出所によって行う。 3) 次に詳細度によるソートを行う。  ※ここで初めてブラウザのスタイルシートと共に比較されます。これまでは描画は行われません。 4) 最後に指定された順序によるソートを行う。 となっています。 ・14.4 カスケードするスタイルシート ( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/present/styles.html#h-14.4 ) ・6.4 カスケード処理(The cascade) ( http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/cascade.html#cascade )  その後でDOMを参照して、どのスタイルを適用するかを決めているはずです。HTMLを読んだだけでは、DOMに現れない(擬似要素・擬似クラス)セレクタもいくつかあります。 (3)の詳細度でのソートと、同じ詳細度なら(4)の出現順番が関わってきますから、速度には現れないのではないかと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • ss-ak
  • ベストアンサー率58% (23/39)
回答No.4

意味があるとすれば、そのCSSを複数のHTML文書で共有して使用したり、HTMLが動的に変化するWebアプリケーション等の場合において、エレメントの階層構造が指定の組み合わせになった場合のみ有効となるスタイル指定をしたい場合、でしょうかね。 例を示します(実例として良いか否かは、大目に見てください)。 【HTML例1(写真アルバムのページ)】 <div id="photoAlbum"> <div id="pageTitle">写真アルバムA</div> </div> 【HTML例2(文章のページ)】 <div id="articleArea"> <div id="pageTitle">文章B</div> </div> photoAlbum、articleArea、pageTitleは、それぞれページ内に必ず一つしか置かない文書構造とするならば、それをクラスではなくidにすることには、それなりに意味があると思われます。 これらのページ群で、同じCSSを共有するようにした場合に、例えば写真アルバムのタイトルのみに指定したいスタイルがある場合は、次のような書き方になるかと思います。 #photoAlbum #pageTitle { /* ここに、写真アルバム用のタイトルのスタイル指定を書く */ } こういう書き方を積極的にすべきなのかどうかは、サイト全体の設計やメンテナンス等の要件によるでしょうし、いちがいには言えないと思いますが、書き方的には、まあ、ありと言えば、ありなのではないかと。 ちなみに、処理速度への影響は、この場合は殆ど(実質的には全く)ないと考えて良いと思います。 (通信や、他のレンダリング処理等の方が、問題にならないくらいに、遥かに大きいため)

全文を見る
すると、全ての回答が全文表示されます。
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

そのマニュアルは捨てましょう。 IDに数字を先頭に置くことはできません。 ID--すなわち一意セレクタは詳細度が0,1,0,0でしかも、そのページには一箇所しかなく、かつ基数大きいので、たとえ#ID1 #ID2 #ID3・・・#ID20{}としてもstyle属性での指定(詳細度1,0,0,0)より優位に立つことはありません。  なのにそれが使われているのは、もしちゃんと理解して例示しているとしたら ・一枚のスタイルシートを複数のHTMLに適用させたときに、区別される ・詳細度が高くなり詳細度の差で指定が変えられる  などの理由からです。 ---ただ、きちんとHTMLやCSSを理解しているとは思えません。なら、重要なことですから、説明がされているはずです。 [HTML1] <div id="ID1">  <div id=""ID2"> [HTML2] <div id="ID3">  <div id=""ID2"> の場合、 #ID1 #ID2{}が適用されるのは、HTML1だけですね。 また、 #ID #ID2{color:blue} #ID1,#ID2{color:red;} とあれば、前者の詳細度が0,2,0,0になりますから、続く指定でも上書きされませんね。 ★CSS2以降、基点となるセレクタを書くことになっています。ない場合は*(全称セレクタ--詳細度 0,0,0,0 )があるとみなされますが・・・。 ★一意セレクタは、その要素にしか有効でなく、かつ詳細度も高いためスタイルのためだけにIDを振るのは感心しません。 [HTML1] <div class="header">  <div class="nav"></div> </div> [HTML2] <div class="section">  <div class="nav"></div> </div> <div class="footer">  <div class="nav"></div>  <div class="nav"></div> </div> でも、この4つのdiv.navはいくらでも区別できるわけですから・・ div.nav{} div.header div.nav{} div.section div.nav{} div.footer div.nav{} div.footer div.nav + div.nav{} と・・そうすると共通する部分はclassですから一挙に指定できますし、変えたいところのみ詳細度にしたがって上書きすれば良いですから・・

choco0213
質問者

お礼

そうですね。 ところで、実際の動作はどうなるのでしょうか? ブラウザがDOMツリーを上から順に読み込み、先にCSS抜きでHTMLとHTMLに記載された画像をブラウザに表示するでしょう。 次に、CSSを読み込み、CSSのセレクタを見つけたら、HTMLに戻り、HTMLの要素を上から順にマッチングさせていくのでしょう。 だとしたら、CSSのセレクタとHTMLの要素を上から順にマッチングさせ、ひとつ見つかったらマッチングを中断して、次CSSセレクタに移るのがID、 CSSのセレクタとHTMLの要素を上から順にマッチングさせ、ひとつ見つかっても、</html>までマッチングし続けるのがClassなのだと思います。 この仮説が正しかったとしたら、詳細度の都合ならセレクタを親子として重ねる必要が無くても、読み込み効率化の都合で重ねべき場合もあるのではないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • naokita
  • ベストアンサー率57% (1008/1745)
回答No.1

CSSファイルの中で、見やすくする為、何処の子か把握できる。 HTMLファイルでのtabインデントみたいなもの。

choco0213
質問者

補足

ありがとうございます。 それの影響で遅くなったりはないのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • idとclassの指定方法

    id(class)の指定は、セレクタといっしょに指定(1)、セレクタを除いて指定(2) どちらが正しいというのはあるのでしょうか? 【例】 <html> <head> <title>タイトル</title> </head> <body>      <div id="sample">           <p>サンプル</p>      </div> </body> </html> (1) div#sample p { color:#f00; } (2) #sample p { color:#f00; } どちらでも良いような気がしますが、実際の所どうなんでしょうか。

    • ベストアンサー
    • CSS
  • CSS classの場合とidの場合の指定方法

    h1などをブロック要素ごとに、違うスタイルを適用させたく、下記のように、記述したのですが、ブロック要素をidで指定する場合は同じように、#mainと#main h1で指定し、<div id="main">とすればよいのでしょうか? それとも、h1は.main h1 とクラス指定して、<div id="main" class="main">とした方がよいのでしょうか?変な質問かもしれませんが、どちらも同じように表示するので、どちらがよいのか分かりません. <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <style type="text/css" media="screen"><!-- .main { width:100px;} .main h1 { color:red;} --></style> </head> <body> <div class="main"> <h1>aaa</h1> </div> </body> </html>

    • ベストアンサー
    • HTML
  • 複数のidを指定する

    こんにちわ。いつもお世話になります 少し、HTMLのことも含まれるのですが、 1つのHTMLドキュメントの中で、複数回、同じidを使用するのは文法違反ですか? たとえば <span id="x"></span> <div id="x"></div> のような感じです やりたいことは、複数のspan(場合によってspanの数が変わる)のstyle.colorに 同じ値を指定したいです。 for()を使ってid名を変えて、繰り返すとかしないとダメですか?

  • CSSについて

    CSSについて質問させてください。 CSSをタグの中に直接書き込む場合 <div style="color:#ffa500; font-size:20pt; font-weight:bold; text-decoration:underline;"> このような場合のstyle="部分は、styleタグと呼んで いいのでしょうか? divタグの中に記述しているので、styleプロパティと 呼ぶのでしょうか? CSSのリファレンスにはstyleプロパティはありません。 ということは、やっぱりdivタグのstyleプロパティで CSSを指定していると考えるのでしょうか?

  • floatをfooterに指定すると正しく表示ができない。

    floatをfooterに指定すると正しく表示ができない。 画像の(3)のようにfooterにfloat:leftを指定しなければ綺麗に表示されるのは分かります。ところが、画像の(1)や(2)のように、footerにfloat:left;を指定して、次の行で<div style="clear:left"></div>と指定して、footerにfloat:leftを指定しなかったのと同様の処理をすると、(1)や(2)のようにwidthに対して様々な現象が起きてしまいます。 (1)はwidthを指定しない場合、width:auto;を指定した場合に見られ、(2)はwidth:100%;とした場合にwrapperよりはみ出すという現象が起きます。なぜ、floatを指定しないのと指定後解除するのとで同様の結果が得られずに違った結果になるのでしょうか?わかる方いらっしゃいましたら回答宜しくお願い致します。 以下はソースでそのままエディタに貼り付けると表示できます。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>サンプル</title> <style type="text/css"> <!-- /* default.css */ #container { background:red; border:10px solid fuchsia; padding:10px; } #left { float: left; width: 200px; height:100px; background:yellow; } #right { float: left; border:5px #000 solid; width: 200px; height:200px; background:black; color:#FFF; } #footer { float: left; height:200px; background:blue; border:5px #000 solid; color:#FFF; } --> </style> </head> <body> <div id="wrapper">WRAPPER <div id="header">HEADER</div> <div id="container">CONTAINER <div id="left">LEFT </div> <div id="right">RIGHT </div> <br style="clear:left"/> </div> <div id="footer">FOOTER </div> <div style="clear:left"></div> </div> </body> </html>

    • ベストアンサー
    • HTML
  • CSSのクラス名・ID名の指定でワイルドカードか正規表現を使いたい

    CSSでクラス名やID名を指定する場合に、 ワイルドカードか正規表現を使いたいと思ったのですが、うまくできません。 使えないのでしょうか? また、他に、似たクラス名・ID名を一括で指定する方法はありますか? 例) <div id="cat1">猫が1匹</div> <div id="cat2">猫が2匹</div> <div id="cat3">猫が3匹</div> #cat1, #cat2, #cat3{color:#FF00FF;} を #cat*{color:#FF00FF;} のようにまとめて指定したい。

    • ベストアンサー
    • HTML
  • CSSについて教えてください。id,class

    <body> <div class="style1" id="header"> <div id="logo"><img src="images/banner.gif" alt="見本1"/></div> <ul id="globalNav"> <li><a href="index.html">見本2</a></li> </ul> </div> <div id="contentWrapper"> <div id="content"> <div id="primary"> ※参考書に上記の様な書き出し記述があるのですが、1.まず素人考えでコンテナの様な土台となるボックスはないと考えていいですか? 2.idがdivに包含されいくつも出てきますが,idは一つしか使用できないため慎重にって事は無いのですか? 固有を確定するために便利なのですか? 3.div classのあとidが使われている様に思うのですが、classにもidは使えますか?? 的外れですみません

  • cssでの要素間の余白について。

    ホームページを作成しており、画像の下にdivをくっつけて、配置したいのですが、どうやっても、余白が出来てしまいます。styleでdiv要素にmargin-bottom:0、h2にmargin-top:0と記述しても、余白が出来てしまい、困っています。 さらにdiv containerの大きさについても、styleでwidth,heightで、大きさを指定しているのですが、横に画面一杯に広がってしまい、大きさ指定が反映されません。 初歩的な質問かもしれませんが、どこに問題がありますでしょうか? ご教授お願いいたします。 "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=Shift_JIS"/> <title>xxxxxxxxxxxxxx</title> <style type="text/css"> body {background-color:#f5f5f5} div#container {width="800" height="40";background-color:#fff4d8} h1 {color:#330000;font-family:Geogia,Times New Roman,sans-selif} h2 {color:#330000;font-family:Geogia,Times New Roman,sans-selif;margin-top:0} </style> </head> <body> <div id="content"> <h1><img src="xxxxxx.jpg" alt="xxxxxxxxx" </h1> </div> <div id="container"> <h2> xxxxxxxx </h2> </div> </body> </html>

    • ベストアンサー
    • CSS
  • cssで<div>にpaddingを指定したとき

    下のように、cssで<div>にwidth720px、padding10px,background-color: #00FFFF;と指定して、 IE6とoperaで表示してみたところ、widthが740px、padding10pxになってしまいます。 divの下に740pxのテーブルをおいて確認してみました。 これは、こういうものと、思うしかないのでしょうか? また、こうなるのは、私だけなのでしょうか? <style type="text/css"> <!-- #contents { width: 720px; padding: 10px; background-color: #00FFFF; } --> </style> </head> <body> <div id="contents"> あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ </div> <table width="740" border="0"> <tr> <td bgcolor="#0000FF">あ</td> </tr> </table> </body>

    • ベストアンサー
    • HTML
  • CSSで指定したwidthをマウスで変更したい

    frameはnoresizeを指定しなければ、マウスドラックでサイズの変更ができますが、同じような事をframeを使わずにCSSとjavascriptで出来ないものでしょうか? 具体的に言うと、以下に示すhtmlの20%,80%のwidthをマウスドラックで変更できないでしょうか? <html> <head> <style type="text/css"> #f1 { float:left; width:20%; overflow: auto; background-color : #ffd2ff; } #f2 { float:right; width:80%; background-color : #e0fef8; } </style> </head> <body> <div id="f1">f1</div> <div id="f2">f2</div> </body> </html>