• ベストアンサー

floatを使わずに、cssレイアウトって可能でしょうか?

edo_m18の回答

  • edo_m18
  • ベストアンサー率75% (3/4)
回答No.5

若干回答とは違いますが・・。 clearfixをなぜそんなに嫌うのか分かりませんが。 clearfixはハックではないですよ。 ハックというのは、CSSのバグを利用したブラウザの差異を埋めるためのテクニックのことを言います。 clearfixは、CSSの仕様通りに記述してそれをfloatの対処に使っているにすぎないのでハックとは(厳密には)言わないと思っています。 なので、バグを利用して・・と思っているのであればバグではないので使用して問題ないと思いますがいかがでしょうか。 clearfixの概要は、親ボックスが内包している子ボックスのfloatを"解除する"テクニックです。 「親ボックスからはみ出している」と明記されていますが、 これは認識の誤りです。(言い方の問題かもしれませんが) floatさせたボックスは、親ボックスから文字通り「float(浮く)」ので、親ボックスは子ボックスの範囲を識別しません。 そのために、子ボックスが親ボックスからはみ出しているように見えるのです。 ですが、clearfixを使うことで親ボックスの最後の要素にfloatをクリアするclearプロパティを指定することで、 親ボックスがfloatした子ボックスの後に出現する要素を識別するために(見た目的に)子ボックスを含んだ高さにまで親ボックスが広がるわけです。 これは自分の推察ですが、clearfixが広まった理由は、バグを利用したものではなく、かつ簡単に導入できるということから広く使われているものと考えています。(意味なくコピペして使ってる、というわけではないと思います) 余談ですが、自分自身はCSSの処理でどうしてそれがそうなるのかをある程度は検証や推察をしてから使うようにしています。 上記のclearfixに対する認識はそこから導き出したものです。(なので間違いもあるかもしれませんが・・) なので、sweepeaさんがなぜclearfixをそんなに嫌うのか分かりませんが、自分は納得済みでclearfixを使用しています。

sweepea
質問者

お礼

edo_m18さん、すいません・・・。 「OKWaveサポート担当」からメールがきまして、 > 投稿者自身が運営するホームページ・ブログや(略) のURLがダメなのと > 質問に対しての回答ではなく、他の回答者への指摘(略) がダメなので、削除になったそうです・・・。 【禁止事項】 http://help.okwave.jp/okwave/beginner/prohibition.html だそうです。 せっかく頂いていた、回答ですが、何卒ご了承ください。 ご回答、アドバイス、ありがとうございました。 でも、何を書かれていたのか、とても気になります・・・。 有益な情報であれば、上記の禁止事項を守った上で、再度ご投稿頂ければと思います。 (embedがobject... ↑途中で切れてる・・・。

sweepea
質問者

補足

ご意見いただきありがとうございます。 物議を醸すようなことを書いてしまって、失礼しました。 > clearfixはハックではないですよ。 > ハックというのは、CSSのバグを利用した 私にとってはハックです。 CSSハックの正式な定義というものがない以上、何がハックで、 何がハックでないかは、個人の判断に委ねられると思います。 レンダリングのバグを利用した、CSSの記述はもちろんハックですが、 たとえ、定義通りによる使用であっても、力技で本来意図しない使用法で 使用されているものはハックと考えます。 ボックスの擬似要素afterに ・ピリオド「.」を付けて、 ・高さを0にして、 ・表示を隠す 「出して、隠す。」これは、私には紛れも無いハックです。 なぜなら、そのような記述は後方互換性が無いためです。 当然ですが、ブラウザの開発者達は、clearfixが正しく表示されるように、 レンダリングエンジンを開発する訳ではありません。 例えば、clearfixがIE7に対応するために、 min-height: 1%; を追加したのがいい例だと思います。 個人でサイトを運用しているだけなら、1行の追加で済みますが、 何十というサイトを管理している、Web製作会社なら、頭が痛いはずです。 さらにそのサイトが、数百ページに及ぶようなものであれば。 理論上、min-height: 1%; は、表示に害を与えるようなものでは ないでしょうが、通常、clearfixの使用者は、clearfixハックを サイト内に多用するため、実務では、サイト内の各ページで、 本当に表示が崩れていないかを目視確認しなければなりません。 (たとえ、大丈夫だ、ということが分かっていても。) 一方、(当然ですが)左にマージンを20px空けたい時に、 margin-left: 20px; とするのはハックではありません。 CSSの仕様書を、どう斜めから読んでも、解釈に差異が出ようがありませんから。 よって、margin-left: 20px; の意味は、ほぼユニバーサルなものだといっても良いでしょう。 > 「親ボックスからはみ出している」と明記されていますが、 > これは認識の誤りです。(言い方の問題かもしれませんが) floatは、文字通り、浮かせるのが目的で、後続の要素はデフォルトで回り込みするので、 親ボックスからはみ出すのが仕様通りです。 (すいません、書き方が悪かったですね。IEの方が、独自の表示方法です。) ですので、floatされた要素は、本来、その要素より「後」に開始する要素によって、clearされるべきでしょう。 clearfixは、言ってみれば、「前」に開始する要素によって、clearを試みているので、 美しくないコードが必要になってきます。 そもそもの私の質問は、「floatでなくpositionで書けないのか」です。 なぜなら、コンテンツや右メニューのカラムを「配置」したい訳であって、 別に「浮かせたい」訳ではないからです。 もし「配置」のためのプロパティが「float」なら、ネーミングが悪すぎます。 やっぱり、positionでは無理なんでしょうか? もし無理だとしたら、それは誰が悪いわけではなく、W3Cに落ち度があると思います。 (個人的には、今後も(WHATWGでなく)W3Cに期待しますが。) ちなみに、overflow:auto; は駄目ですかね? 結局、floatだし、これも、もっと厳密な人に言わせれば、 ハックと言われてしまうかもしれませんが・・・。

関連するQ&A

  • CSSの三段組みレイアウトについて教えて下さい。。

    CSSレイアウト初心者ですが、CSSの作成段組みを作る時に <div id="container"> <div id="header"> </div><!--/header--> <div id="contents"> <div id="left_bar"> </div><!--/left_bar--> <div id="main"> </div><!--/main--> </div><!--/contents--> <div id="right_bar"> </div><!--/right_bar--> <div id="footer"> </div><!--/footer--> </div><!--/container--> と三段組固定レイアウトを作成したいのですが、 一度目は何回やり直してもfloatの設定でleft_bar,mainの横並びが上手くいかずに、 contentsの中でleft_bar,mainが縦並びになってしまい何回何が原因か様々なサイトで考えを模索してソースを直しても何故かleft_bar,main がcontentsの中で何回書き直しても縦並びになりもう一度一からCSSを組み直してみると、 どうした訳かようやくcontentsの中でleft_bar,mainが横並びになってくれました。 これは一体根本的に何が原因で横並びにさせるつもりが、縦にボックスが並んでしまうのでしょうか? CSSのfloatの概念からハックかなと思いハック親ボックスにハックをかけてみてでも全く関係ないみたいでしたし、親ボックスにピクセルを指定していないからかと思い親ボックスにピクセルで指定しても何故か縦並び?! CSSをもう一度書きなすことで意図したレイアウトになると言う事は一番は何が原因していると見られるのでしょうか?

    • 締切済み
    • CSS
  • CSSによる3カラムレイアウト

    CSSによる3カラムレイアウト 以下のHTML(A)をCSSで(B)の様に表示させたいのですが、どの様にすると良いでしょうか? HTML(A) <!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" xml:lang="ja" lang="ja" dir="ltr"> 省略 <body> <div id="container"> <div id="wrapper"> <div id="content">コンテンツ</div> </div> <div id="header">ヘッダー</div> <div id="navigation">ナビゲーション</div> <div id="widget">ウィジェット</div> <div id="footer">フッター</div> </div> </body> </html> 表示(B) |ヘッダー                     | |ナビゲーション|コンテンツ|ウィジェット| |フッター                     | 自分でも大分試行錯誤したのですが、思い通りの結果が得られません。 今のところは、コンテンツとナビゲーションをfloatで横並びにし、ヘッダー分の高さをmarginで下げて、ヘッダーはposition: absolute;で上部に表示させています。 ウィジェットが無い2カラムの状態ならそれで解決しているのですが、ウィジェットを追加して表示(B)の様に3カラムにしようとすると上手くいきません。 HTMLを変えれば他にやり様は思いつくのですが、containerとwrapperを除く要素の並びは(A)の通りで実現させたいです。 また、上記のソース自体あまりスマートではないのですが、もっとスマートなやり方があればそちらも指南頂けると幸いです。

    • ベストアンサー
    • HTML
  • 【CSS】不具合の原因がわかりません。

    すいません、少しややこしいかもしれませんが・・・。 下記のように、「ヘッダ」「コンテンツ」「フッタ」の3つにレイアウトが分かれていて、「コンテンツ」「フッタ」に clear: both; float: none; をかけると不具合なく表示されます(縦に3つ並びます)。 ですが、諸事情により「フッタ」部分にcssをかけることが出来なくなりました。 (企業によるガイドラインなので詳しくは書けません。すいません・・・。) 「フッタ」から clear: both; float: none;をはずすとFirefoxではレイアウトがずれてしまいます。float: left をかけたように「コンテンツ」の右側に「フッタ」が来てしまいます。 いちから構築しなおしてはいるのですが、「コンテンツ」部分にmarginやpaddingの値を加えたり(左右ではなく上下でも)、高さを指定したりするだけでずれてしまいます。 原因は何が考えられるでしょうか? よろしくお願い致します。 ちなみに宣言文は <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> としています。 ////////html//////// <body> <div id="header"> ヘッダ </div> <div id="contents"> コンテンツ </div> <div id="footer"> フッター </div> ////////css//////// #header{ } #contents{ clear: both; float: none; } #footer{ clear: both; float: none; }

  • CSSのfloatでレイアウトしたページの印刷について

    CSSのfloatでレイアウトしたページを印刷してみると、 2ページ分必要なところが1ページ分しか印刷されなかったり、2ページ目が印刷されていても、ある一箇所だけ・・・ といった、印刷した時のレイアウトの崩れで悩んでいます。 ページ内のコンテンツ部分だけを印刷したいのではなく、あくまでも全体がきちんと印刷されるようにしたいのですが、 float:none; を設定すると、floatが解除されてしまうので、印刷するとますますおかしくなってしまいます。。。 印刷用スタイルシートをどのように設定したら良いのか、皆様アドバイスをお願いします・・・!!

    • ベストアンサー
    • CSS
  • CSSレイアウトの本当の正しいやり方

    CSSでヘッダーとフッター付きの2カラムレイアウトを書籍のサンプルを見て行ないました。 表示は何も問題ないのですが、色々とサンプルレイアウトのサイトを見ていると「main」でleft-marginfを指定しているのはなく、floatを指定しているのが多いのですが、下記でも合っているのでしょうか。 #wrap { width: 700px; margin: 0 auto; text-align: left; } #header { color: #fff; } #menu { width: 160px; float: left; } #main { margin-left: 160px; padding: 10px; } #footer { clear: both; padding: 10px; }

    • ベストアンサー
    • HTML
  • CSSでブラウザごとにレイアウトが崩れたりします。

    はじめまして。 現在、CSS初心者でお店のホームページを作成しているのですが、作ったサイトのレイアウトがブラウザごとにレイアウトが違って見えます。 細かな部分でも違って見えてきてしまっているのですが、大枠のレイアウトが崩れてしまっていて、なんとか修正できないものかと頑張っています。 ■■■■■■    ■=ヘッダー □□●●●●    □=メニュー □□●●●●    ●=コンテンツ(中身)1 □□○○○○    ○=コンテンツ(中身)2 □□○○○○    ▲=フッター ▲▲▲▲▲▲ このようなレイアウトで組んでいるのですが、初心者なため、ひたすら「div」で囲って、さらにその中をdivで囲ってなんとかレイアウトを組みました。 そこで、問題の崩れているレイアウトですが、メニュー(□)とコンテンツ(○+●)の部分の高さを「auto」にしているのですが、フッターの部分が左のメニュー(□)の高さにしかあっておらず、右のコンテンツの途中からフッターが出てきてしまいます。 ※コンテンツ(○+●)部分はさらに大枠の「right」で囲っており、メニュー部分は「left」で、両方ともdivで、高さは他と同様に「auto」トなっております。 ちなみにこの現象はIE7のみでして、IE6やfirefoxなどでは正常に表示されました。 全てのhtmlファイルごとに高さを指定して、divを指定すれば、解決するとは思うのですが、テンプレートを使用しているため、なんとかこのまま解決方法を見いだせればありがたいのですが、、、 どうか教えていただけないでしょうか? body{ margin:0px; padding:0px; text-align:center; } /* ラッパーの設定*/ #wrap{ position:relative; width:790px; background-color:#FFFFFF; margin:0px auto; text-align:left; } /* ヘッダーの設定*/ #head{ width:790px; height:100px; background-color:#FFFFFF; } /* 左側の設定*/ #left{ width:210px; height:auto; float:left; background-color:#FFFFFF; } /* 右側の設定*/ #right{ width:580px; height:950px; float:right; background-color:#FFFFFF; margin-bottom: 15px; } #sub_main { width: 550px; margin-left: 15px; background-color: #FFFFFF; margin-top: 10px; height: auto; margin-bottom: 5px; } #sub_main2 { width: 550px; margin-left: 15px; margin-top: 15px; background-color: #FFFFFF; height: auto; } #foot{ position:relative; width:100%; height:auto; background-color:#CCFFCC; clear:both; float: left; } ※sub_main1,2は●と○になります。 どうかよろしくお願いいたします。

    • ベストアンサー
    • HTML
  • Perlでcssを使わないで3カラムにしたい

    現在、Perlでcgiを作成していますが、ページの最上部にヘッダー、ページの両端にメニューや広告、中央にメインコンテンツを配置する3カラム(三段組み)、最下部をフッターにしたいと考えています。 現在、メインコンテンツは完成しております。 cssは、使わないで上記のようなレイアウトをPerlで組みたいのですが、上記にようにしたい場合は、どのように書けば良いのでしょうか? 横幅全体は800。(ヘッダーとフッターも横幅は800) 左メニュー180、中央メインコンテンツ 440 、右メニュー180 で組みたいと思っています。 お手数をおかけ致しますが、アドバイスよろしくお願い致します。

    • ベストアンサー
    • Perl
  • XHTML+CSSサイトで<div>の順序変更によるレイアウト崩壊

    よろしくお願いいたします。 コンテンツ部分をmain、右側に帯をつくりsubとして2カラム(他ヘッダとフッタもあります)のサイトです。 XHTMLでdiv id="sub"部分を先に記述してしまったので、div id="main"部分と上下を入れ替えたところ、表示が大きく崩れてしまいました。CSSのfloatで左右指定の確認もしましたが、解決しません。 CSSについては初心者ですので、なにか重大なことを見落としているのかもしれません。教えていただけると助かります。どうぞよろしくお願いいたします..

    • ベストアンサー
    • CSS
  • どう変更してもIE6だけCSSレイアウトが崩れてしまいます。

    CSSレイアウトで、サイトを作成していたのですが、 最近になってIE6で確認してみると、レイアウトが崩れまくっていました。。。 3カラムレイアウトなのですが、Firefox等他のブラウザではきちんと表示されるので、なぜかIE6だけ縦1列になってしまいます。。 こちらのサイトでもIE6はレイアウトが崩れやすいという情報がたくさんあり、そちらのアドバイスを参考にしながら1日かけてがんばってのですが、できませんでした。もう限界です(涙) 現在のCSSは、 * { margin:0; padding:0; } .wrapper { width: 740px; margin: 0 auto; } .header { width: 740px; } .main { width: 740 px; /* 両端ブロックとコンテンツを囲んでいるクラスです。 */ } .menu {display: inline; float: left; width: 205px; } .contents {display: inline; float: left; width: 385px; } .affiliate {display: inline; float: left; width: 150px; } .footer { clear: both; width: 740px; } というような状態です。 どなたかアドバイスいただけますと大変幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • ie7の印刷レイアウトがくずれます。css対策 

    質問です。 印刷についてのIE7対策をうかがいたいです。 画面上はまったく問題ないのですが、 いざ、印刷となると崩れてしまいます。 フッターがメインメニューの半ばまで せりあがって (崩れた形)で印刷されてしまいます。 たぶん3のメニューが短いからか... (今後 a-2 が更新する可能性があるためにheightはautoに してありますが。。) 対策としてはどうしたらよいでしょうか? よろしくお願いします。 ※print用のcss はすでに作成しています。 IE8,FIREFOXについてはフッターを css改行コードに強制改ページさせることにより 修正は成功しています。 メイン部分のレイアウトとしてはこういった感じです。 ​http://css.uka-p.com/3column/image.html​ レイアウトの順番としては。 0コンテナでつつんでます。 1ヘッダー height=auto 2メイン height=auto float: right;  (内部)a-1 右エリア height=auto float: right;   (内部)a-2 メインの部分 height=auto float: none; 3左メニュー height=auto float: left; 4フッター  height=auto clear:both; ちなみに画面上では ie6,ie7.firefoxはまったく問題が ありません.... よろしくお願いします。

    • ベストアンサー
    • CSS