• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:floatの挙動について)

floatの挙動について

このQ&Aのポイント
  • floatの挙動について質問があります。
  • 次のコードで#sidebody内に#a~cboxを左側に縦に並べ、#dboxを右側に配置したいのですが、#dboxのfloatが#sidebodyに対して効きません。
  • 原因を教えていただけませんでしょうか。

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

  • ベストアンサー
  • outbrave
  • ベストアンサー率60% (231/380)
回答No.2

原因は#sidebodyをfloat していないからでしょう。 <!DOCTYPE html> <html lang="ja"> <head> <title></title> <style type="text/css"> #content { width: 200px; /*height: auto;*/ border: red solid 1px; overflow: hidden; } #sidebody { width: 100px; float: left; } #abox { /*width: 100px;*/ height: 20px; background-color: blue; text-align: center; color: white; } #bbox { /*width: 100px;*/ height: 100px; background-color: pink; text-align: center; color: white; } #cbox { /*clear: both; width: 100px;*/ height: 100px; background-color: darkblue; text-align: center; color: white; } #dbox { width: 100px; height: 250px; float: left; background-color: green; text-align: center; color: white; } </style> </head> <body> <div id="content"> <div id="sidebody"> <div id="abox">a</div> <div id="bbox">b</div> <div id="cbox">c</div> </div> <div id="dbox">d</div> </div> </body> </html> DOCTYPE宣言なしの互換モードで書くのなら、#sidebodyのwidth:値を減らす必要があります。

ninnikutips
質問者

お礼

ズバリそれですね。 何回も何回も見直してるのに気づきませんでした。 いや、何回も見直してるからこそ気づかなかったのか・・・ すみませんね。 バカですね。 ありがとうございました!

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

その他の回答 (4)

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

No.3,4です。 >floatを使わずリストでレイアウトを作るなんて、考えてもみませんでした。 >参考のHPのソースをいくつか見てますが、初めてです。 たまたま、今までにそのようなサイトしか出会えなかっただけでしょう。 プロの作成したページだと逆転すると思います。 ちょっと説明しておきます。 1) floatを使わず【absolute/relative】で並べてレイアウトする 2) 【ナビゲーションのリストをそのまま正直に】リストでマークアップ (2)は言わずもがなですので(1)について  先のサンプルで <style type="text/css"> となっているところを <style type="text/css" media="screen"> と書き換えて印刷プレビューでご覧頂くだけで効果は実感できるでしょう。本文 と関係ないナビゲーションリンクは後回しにされるはずです。 ★それは「検索エンジンにもそう見えている!!」と言う意味です。  このページの本文に直接関係ないが関連した補足記事(asideと言います)を追 加したとします。もしこれを右なり左に表示しようとすると本文より前に置くこ とになります。これはSEO上もメンテナンスの上からも望ましくありません。  また本文中でfloatやclearが使えないという致命的な問題が発生します。 【引用】____________ここから 例えば絶対配置による方法では、HTMLを記述する上で内容の配置順序が自由にな ることが回り込ませるボックスを先に記述する必要がある回り込みによる方法よ りも優れているが、場合によっては後続のボックスに重なって表示されるおそれ がある  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[段組 - Wikipedia( http://ja.wikipedia.org/wiki/%E6%AE%B5%E7%B5%84 )]より >これから組みなおすのはちょっと難しく、今後の目標とさせていただくことと しました。  でしようね。  いずれHTML5の時代が到来します。HTML5では完全に文書構造とプレゼンテー ションが分離されることが望まれます。今までも物はそのままで良いので、順次 切り替えていかれるのが良いでしょう。サンプル見られたらわかるように、なに せ色々な面で楽になります。デザインは気が変わったら自在に変えられる。スマ ホやプリンターに対応させようとしたらスマホ用やプリンター用のスタイルシー トを別に書けば良い。

ninnikutips
質問者

お礼

お礼が遅れて失礼いたしました。 思い切って、ご教示頂いたやり方で組みなおしました。 レイアウト崩れもないし、どこでclearするか迷うこともなくなるし、構造もすっきりと分かりやすくなりました。 本当にありがとうございます。 しかし・・・今までいくつかcssの教材や入門者向けのHP、DreamWeaverのチュートリアルでさえどれも段組みをfloatで行っていたのですが、一体なんだったんだろうという気持ちです。 そういったHP等ではセレクタの使い方もちゃんと説明されていなかったので、無駄にclassを増やして対応していたのですが、今回の改修を機にhtmlは文書構造のみ、cssはプレゼンテーションという考えに切り替えました。ありがとうございました。

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

body内は(検索エンジンも含めて)誰が見てもわかるので説明しません。 class名は、HTML5の新しい要素名とその意味をそのまま利用しています。HTML5にするときは、それぞれ <div class="header"></div> ⇒<header></header> <div class="section"></div> ⇒<section></section> <div class="nav"></div>   ⇒<nav></nav> <div class="footer"></div> ⇒<footer></footer>  に書き換えるだけです。 html,body{margin:0;padding:0;}  ブラウザのデフォルトのスタイルでは余白が少しあるので h1,h2,h3,h4,h5,h6,p{margin:0;line-height:1.6em;}  いずれも同様にマージンがあるので、また日本語の文字は大きいので p{text-indent:1em;}  日本語の段落の更新は「字下げ」で示すので /* ここから */ div.header,div.section,div.footer{  width:90%;min-width:190px;max-width:900px;   基本サイズと最大、最小サイズを指定することでスマホから幅広ディスプレイまで対応  margin:0 auto;   中央に寄せます。  padding:5px;   余白を少しとって置くブロックの最小サイズは上の190px+2×5px=200px  border-color:red;  border-style:solid;   ボーダーのスタイルと色を指定 } div.header{  border-width:1px 1px 0 1px;   headerは上と左右を1px  position:relative;   これはここではなくても良かった } div.section{  border-width:0 1px;   上下は0、左右は1px;  background-color: green;  position:relative;   ナビゲーションなど含まれる要素のサイズの基本にするため!!(ポイント)  min-height:250px;   ナビゲーションに最低限必要な高さはここで指定する。 } div.footer{border-width:0 1px 1px 1px;}  footerは左右と下が1px、上は0 div.section h2,div.section p{margin-left:100px;}  section(本文)内のh2,p要素の左を空けてナビゲーション用のスペース確保 div.section div.nav{  position:absolute;   親ブロックから切り離す  top:0;left:0;width:100px;height:100%;   高さ・幅・位置はstaticでない親コンテナブロックを参照 background-color:silver; } div.section div.nav ol{  list-style:none;  margin:0;padding:0;   リストなのだがリストでない=ブロックに変更  text-align:center;   中央配置--この値は継承されるので最上階が便利 } div.section div.nav ol li{  display:block;   リストの項目じゃなくする  margin:0;padding:0;   これらも0にしておく  line-height:20px;height:20px;   これで上下左右中央に配置される。  position:relative;   これも下位(a要素)の位置サイズ基準にするため } div.section div.nav ol li+li{ 二つ目以降は・・  line-height:100px;height:100px;   高さが100pxになるので・・ } div.section div.nav ol li a{  display:block;   a要素は行内要素なのでブロックにして  width:100%;height:100%;   高さと幅は親に合わせる。 color:white; } div.section div.nav ol li a{  background-color: blue; } div.section div.nav ol li+li a{  background-color:fuchsia;/* pinkはない */ } div.section div.nav ol li+li+li a{  background-color:navy;/* darkblueはない */ } ★使える色は、『 ⇒色キーワードのリストは、aqua、black、blue、fuchsia、gray、green、lime、maroon、navy、olive、orange、purple、red、silver、teal、white、yellowである。( http://momdo.s35.xrea.com/web-html-test/spec/CSS21/syndata.html#value-def-color )』です。これ以外はブラウザ依存で保証されていません。 もし、sub sectionがあるときは _<div class="section"> __<h2>見出し</h2> __<p>本文はsection</p> __<p>メインの記事は先に書かないと検索エンジンがページ内容を誤解する。</p> __<div class="section"> ___<h3>見出し</h3> ___<p>・・・・</p> __</div> __<div class="nav"> ___<ol> ・・・【中略】・・・ ___</ol> __</div> _</div> div.section div.section{margin-left:100px;min-height:0;min-width:0;} div.section div.section p,div.section div.section div.section{margin-left:0;} などが必要になます。 本文と関係ない記事(aside)を追加するときは <div class="section">  本文  <div class="nav"></div>  <div class="aside"></div> </section> にしてそれぞれ右左に置けば良いです。

ninnikutips
質問者

お礼

大変参考になりました。 これから組みなおすのはちょっと難しく、今後の目標とさせていただくこととしました。 ありがとうございました。

ninnikutips
質問者

補足

ORUKA1951様、またまたご教示いただきましてありがとうございます。 floatを使わずリストでレイアウトを作るなんて、考えてもみませんでした。 参考のHPのソースをいくつか見てますが、初めてです。 floatである程度作ってしまってるので、どうしようか悩みどころですが・・・ ウーン、悩みます

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

まず、HTMLとスタイルシートのとっても重要な関係 【必読】構造とプレゼンテーションの分離( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/intro/intro.html#h-2.4.1 )  「文書の構造をプレゼンテーションと切り離すことで広汎なプラットフォームや多様なメディアでの文書提供コストを低下でき、文書の改訂も容易になる」 【必読】要素のグループ化: DIV要素とSPAN要素( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/global.html#h-7.5.4 )  『id属性及び class属性と併用することで、文書に構造を付加する』  残念ながらこの部分理解されることが少なく、「文書内に埋め込まれた「意味」が不明確( http://www.atmarkit.co.jp/ait/articles/1008/30/news106_2.html )」なものがたくさん登場しました。その反省から「文書をよりよく構造化するために、新しい要素が追加されました。( http://standards.mitsue.co.jp/resources/w3c/TR/html5-diff/#new-elements )」 [例]プレゼンテーションに関することが書かれてないので、とってもわかりやすいのでメンテナンスも楽。デザインは自在に変更できる。 <body>  <div id="content">   <div id="sidebody">    <div id="abox">a</div>    <div id="bbox">b</div>    <div id="cbox">c</div>   </div>   <div id="dbox">d</div>  </div> </body> じゃなくて、 <body>  <div class="header">   <h1>ページタイトル</h1>  </div>  <div class="section">   <h2>本文記事<h3>   <p>本文記事・・・</p>   <p>メインの記事は先に書かないと検索エンジンがページ内容を誤解する。</p>   <div class="nav">    <ol>     <li><a href="a">a</a></li>     <li><a href="b">b</a></li>     <li><a href="c">c</a></li>    </ol>   </div>  </div>  <div class="footer">   <h3>文書情報</h3>  </div> </body> [HTML5}だと <body>  <header>   <h1>ページタイトル</h1>  </header>  <section>   <h2>本文記事<h3>   <p>本文記事・・・</p>   <p>メインの記事は先に書かないと検索エンジンがページ内容を誤解する。</p>   <nav>    <ol>     <li><a href="a">a</a></li>     <li><a href="b">b</a></li>     <li><a href="c">c</a></li>    </ol>   </nav>  </section>  <footer>   <h3>文書情報</h3>  </footer> </body> ・・・・HTMLにはこのように文書構造だけ!!を書くこと。どのようにプレゼンテーションするかはスタイルシートに任せること。 ★スタイルシート  floatは、挿絵などの周囲にテキストを回りこませるためのもので、このようなブロックの配置に使用すると ・サイドに配置するメインでない記事を前に書かなければならないなど、文書の構造が制約を受けます。 ・本文中で挿絵等を用いてfloatさせようとすると解除(cleear)が重なって利用できなくなる  などの問題が生じます。 【具体例】 ★タブは_に置換してあるので戻す。 ★説明は次回 ★body内。とてもわかりやすいはずです。 ★リキッドウィンドウ幅200px以上自在 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> _<meta http-equiv="content-type" content="text/html; charset=Shift_JIS"> _<title>サンプル</title> _<meta name="author" content="ORUKA1951"> _<meta http-equiv="Content-Style-Type" content="text/css"> _<link rev="made" href="mailto:oruka1951@hoge.com" title="send a mail" > _<link rel="START" href="../index.html"> _<style type="text/css"> <!-- html,body{margin:0;padding:0;} h1,h2,h3,h4,h5,h6,p{margin:0;line-height:1.6em;} p{text-indent:1em;} /* ここから */ div.header,div.section,div.footer{width:90%;min-width:190px;max-width:900px;margin:0 auto;padding:5px;border-color:red;border-style:solid;} div.header{border-width:1px 1px 0 1px;position:relative;} div.section{border-width:0 1px;background-color: green;position:relative;min-height:250px;} div.footer{border-width:0 1px 1px 1px;} div.section h2,div.section p{margin-left:100px;} div.section div.nav{position:absolute;top:0;left:0;width:100px;height:100%;background-color:silver;} div.section div.nav ol{list-style:none;margin:0;padding:0;text-align:center;} div.section div.nav ol li{display:block;margin:0;padding:0;line-height:20px;height:20px;position:relative;} div.section div.nav ol li+li{line-height:100px;height:100px;} div.section div.nav ol li a{display:block;width:100%;height:100%;color:white;} div.section div.nav ol li a{background-color: blue;} div.section div.nav ol li+li a{background-color:fuchsia;/* pinkはない */} div.section div.nav ol li+li+li a{background-color:navy;/* darkblueはない */ --> _</style> </head> <body> _<div class="header"> __<h1>タイトル</h1> __<p>このページでは・・・・</p> _</div> _<div class="section"> __<h2>見出し</h2> __<p>本文はsection</p> __<p>メインの記事は先に書かないと検索エンジンがページ内容を誤解する。</p> __<div class="nav"> ___<ol> ____<li><a href="a">a</a></li> ____<li><a href="b">b</a></li> ____<li><a href="c">c</a></li> ___</ol> __</div> _</div> _<div class="footer"> __<h2>文書情報</h2> __<dl class="documentHistry"> ___<dt id="FIRST-PUBLISHED">First Published</dt> ___<dd>2013-03-03</dd> __</dl> _</div> </body> </html>

すると、全ての回答が全文表示されます。
回答No.1

はじめまして。 挑戦してみたのですが、cssの最初の#contentの赤枠線がうまくいきませんでした。 とりあえず#dboxが右側に行ったので中途半端ですいませんが、回答してみました。 1.まず書き損じと思いますが</head>が下から2行目に来ているので、  上から4行目へ移動してください。 2.htmlのbodyの中身は並べ替えました。 <div id="content"> <div id="dbox">d</div> <div id="sidebody"> <div id="abox">a</div> <div id="bbox">b</div> <div id="cbox">c</div> </div> </div> 3.cssは#contentの赤枠線がうまくいきません。その後を変更しました。 #dbox { display :block; width: 100px; height: 250px; float: right; background-color: green; text-align: center; color: white; } #abox { display :block; width: 100px; height: 20px; background-color: blue; text-align: center; color: white; float: left; } #bbox { display :block; width: 100px; height: 100px; background-color: pink; text-align: center; color: white; } #cbox { display :block; width: 100px; height: 100px; background-color: darkblue; text-align: center; color: white; }

ninnikutips
質問者

お礼

どうもありがとうございました。 参考にさせていただきました。

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

関連するQ&A