CSSのfloatについてあなたが知るべきこと:和訳

2007年05月02日 written by fjkktkys

(2007.05.24追記)
コメントで誤りだらけとの指摘をいただきましたので、以下は参考にしないようお願いいたします。


*翻訳に挑戦してみました。結構やっつけ仕事になってしまってます。ごめんなさい><ごめんなさい><
少しでもCSSな方たちのお役に立てると幸いです。

最後のセクションの「CSS Floatのチュートリアルとテクニック」がリンク集になっていて、そこが参考になるんじゃないかと思われます。

今後も機会を見て、翻訳の修正などをしていきたいと思います。

CSS Float Theory: Things You Should Know | Smashing Magazine
CSS Float Theory: Things You Should Know | Smashing Magazine

floatはCSSの中でも最も直感に反する存在である。floatは周辺の要素を動かしてしまう(floating)ので可読性やユーザビリティを損ない、誤解や非難の対象になりがちだ。
でもそれはfloat自体に問題があるのではなく、ブラウザに問題があったのだ。一番ヒドいのは古いInternet Explorerのバグであろう。バグが原因だとわかったなら、情報をより洗練された奥深いやり方で見せる方法を操ることができる。

ひとたびfloatが使われるといつも表面化する問題に取り組み、一般的な誤解を明らかにしていこう。私たちは数十の関連する記事を閲覧し、floatを使ったCSSレイアウトで最も重要なことを選び出した。

floatについて知るべきこと

  • 話は画像のテキスト回り込みまで遡ります。テキスト回り込みが、なぜWebがNetscape1.1とともに始まった時に追加され、またなぜCSSがfloatプロパティを使えるようになったのか。 Netscape1.1と共に現れた“Additions to HTML 2.0″では、”float”という用語はelementの横か下にfloatすることを意味しました。Containing Floats

    [Containing Floats]
  • (訳者註:normal flowとはbodyタグの一番外側に相当する部分かと思われますが、違うかも)
    floatボックスをflowの外に出して限界まで右か左にずらした場合、floatボックスはnormal flowの中に位置する。コンテンツはfloatの横側に沿ってflowするだろう。normal flowの外側にfloatボックスを取り出すと、やはりnormal flowの中の全てのコンテンツが、floatボックスを完全に無視するかfloatボックスのためのスペースを作らない。[Float Positioning]
  • ひとつの要素をブロックボックスになるようにfloatした場合。このボックスは現在のラインの右か左に位置させることができる。CSSのfloatプロパティのオプションは float: left, float: right or float: noneがある。[Floatutorial: Float Basics]
  • float要素にはwidthを指定するべきだ(画像が直接適用されている場合は除く、画像にはwidthがあるから)。widthがない時の結果は想像できないものになる。
  • 第一に、floatされるボックスには、明示的でも暗示的でも構わないので必ずwidthを持たせるべきだ。そうしないと、他のコンテンツがflowされる場所が残らずにfloatされてないコンテンツのように、水平にブロックが並んだボックスになるだろう。
    第二に、normal flow内のボックス要素ではないfloatされているボックス要素の縦マージンは、その上下に位置するボックス要素マージンを崩壊させない(破綻させない?マージンが効かないことあるよね)。
    最後に、normal flowではfloatされたボックスは隣りのボックスレベルのボックスに重ねることが可能だ。[CSS Positioning: Floats]
  • まず覚えるべきことは、floatしている要素は左か右にずらされるということだ。真ん中にfloatする要素を作ることは不可能だ。このことは初心者をいらつかせることが多い。基本はfloatしている要素は右か左にしかずらせないということだ。[Float Layouts]
  • 要素がその要素を含むブロックの端に達すると右か左にずれる時に、我々はその要素をfloatする。隣接する別の要素が同じ方向のfloatを持つなら、最初のfloat要素の端に達しない限りはずれない。[…] より多くの要素を同じ方向にfloatしようとすると、それらの要素はスタックして、そのうちスペースを使い果たすだろう。 […] 行(on the line)でスペースが不足する場合、それらの要素が収まるまで下へとずれる。 [Float Layouts]
  • 複数のブロックやボックスを含むということ: ブロックを含むというのは、 他のいくつかの要素(複数のボックスの子要素)を含むボックスやブロックを含んでいるということである。1要素がブロックを含むということはこういう意味だ。“ブロックに含まれる要素は生きている”. [Floatutorial]
  • floatされたボックスは、そのボックスの外側の端がそのボックスを含むブロックの端か別のfloatの外側の端にに達するまで左か右へと動くだろう。[Floatutorial: Float Basics]
  • 特にnormal flow内に収まるようにボックスが縦方向に位置する場合は、一番上のボックスがcurrent line boxの上に揃えられる。しかし、ボックスが横方向に位置する場合は、そのボックスが含まれているブロックのパディングの範囲内で(他のコンテントと同様に)右か左へと可能な限り移動する。取り囲まれているinlineコンテントは反対側へのflowが許されている。[CSS Positioning: Floats]
  • flow内ではないfloatをした場合、floatが存在しないかのように縦方向にflowしたfloatボックスの前後に、位置が決められていない複数のブロックボックスが作られる。しかしながら、line boxesはfloatボックス用の短縮された場所を用意されたfloatに隣接して作られる。floatボックスの前に位置するcurrent line上のあらゆるコンテントは、floatボックスの他のside内で最初に有効なline内で再びflowされる。W3C Visual Formatting Model

    [W3C Visual Formatting Model]
  • current lineにおけるfloatボックスのための横方向のスペースが十分にない場合、 十分なスペースが確保されるまでline by lineでそのfloatボックスは下方向へと移動する。[Floatutorial: Float Basics]
  • floatボックスはそのfloatボックスが作られたlineの上端の上側に位置させることはできない。 […] floatボックスの上端はcurrent line boxの上端(またはline boxを持たない前のブロックボックスの下端)に揃えられる。[Float Layouts]
  • float theoryについて真に理解したいなら、CSSにおいてline boxが意味するところを理解するべきだ。残念ながら、それを言い換えると、インラインボックスが意味することの理解が必要ということだ。 […] インラインボックスはブロックレベルでない要素(EMタグのような)によって作られる。 […] ラインボックスは、ブロックレベルに含まれる要素内のラインとして作られた全てのインラインボックスを含む架空の矩形である。ラインボックスは少なくともそのラインボックスで最も縦に長い。 [Float Layouts]
  • float: leftされた並んでいるように見えるDIV要素内の各カラムを取り囲もうとする場合、我々はそれがカラムになることを期待する。一番下に位置するfull-widthのフッタが欲しいなら、カラムがどんなに長くなろうとも、そのフッタにclear: bothをセットすれば良い。[Float Layouts]
  • floatを含む要素に対してfloatを使うことの潜在的な欠点は、何重にもネストしたfloat要素のレイアウトの解釈を常にブラウザーに任せるということだ。これらのfloatが、floatの使用、ポジショニング、テーブルという場合に、さらに複雑なレイアウトの一部となり、状況はますます酷くなる。 [Containing Floats]

floatのclearについて

  • floatされた要素に続く要素は、floatされた要素に包まれているだろう。このようなことを起こさないために、clearプロパティをfloatされた要素に続く要素に適用できる。clearには4つのオプションがある。clear: left, clear: right, clear: both or clear: none[Floats and “clear”]
  • 余計なHTMLマークアップをせずにCSSのfloatをclearするテクニック。3つの主要な方法がある。a)含まれている要素を同様にfloatする。b)containerにoverflow: hiddenを使う。c)CSSの疑似クラスである:afterを使ってコンテンツを作る。A test-page for techniques. [How to clear CSS floats without extra markup]

  • ネストされたfloatを“囲ん”でいるように見える外側のcontainerを作る標準的な方法は、containerの最後に完全に“cleared”された要素を置くことだ。そのcontainerは、dragging(足を引っ張る), which has the effect of ‘dragging’ the lower edge of the containing box lower than the float.”


code1

  • [How To Clear Floats Without Structural Markup]


  • floatを使ったレイアウトの一般的な問題は、floatのcontainerはfloatに順応しないことだ。全てのfloat(例えば、containerの周囲のborder)のまわりのborderを追加したいなら、どうにかしてcontainerが行き着くところまでstretch upするようにブラウザに命令するべきだろう。overflow methodを使ってfloatをclearすることができる。

    Clearing Floats

    [Clearing floats]

  • :afterの利用: ‘period’のような簡単な文字を挿入するために :after を使い、{clear: both;}で作られた要素が存在することを想像せよ。 それでperiodが見えるようにするため我々はよく{height: 0;} and {visibility: hidden;}を使うが、container boxの終端を片付けるためにlineスペースを散らかしたくない。


code2

  • [How To Clear Floats Without Structural Markup]

  • Clearfix: borderやbackgroundが見えるようなcontainer box内にfloatが含まれる場合、そのfloatはfloatが縦方向に収まるようにそのcontainerの下端を自動的に下げない。そのかわりに、floatはcontainerに無視され、旗のようにcontainerの下側にぶら下がる。 […] IE/Winはcontainer要素が大きさ(widthとか?)を持つ場合に限り、container内のfloatを‘自動的に’取り囲む。 [Easyclearing: How To Clear Floats Without Structural Markup]


CSS Floatのバグ



  • (ここ怪しい)container要素がその中にリンクを持つ場合、floatの状態が続く。これはいくつかのリンクがhoverの場合起こり、auto-enclosingがtoggleされるかauto-enclosingが無効になり、container boxの下端が突然floatされていないcontentの下部に現れる。hoverは他のリンクを元の状態に戻す。この面白い効果はIE/Win Guillotine Bug(ギロチンバグ)と呼ばれている。、a:hoverがリンクの背景や他の多くのスタイル(padding, margin, font)が変更される場合にのみ、toggleされる。不思議なことに、hoverでのテキスト色の変更はこのバグが起こらない。
    IE/Win Guillotine Bug

    [How To Clear Floats Without Structural Markup]

  • The IE Escaping Floats Bug: もしdivボックスをmargin, borders, left floatされたdivと一緒に使うなら、IE Winでは2つの表示エラーが起こる。1つは、containerが最終行のfloatだけを含み、そのfloatが右へと押しやられ、スクリーンの右端まで行き着く。そのため、横方向のスクロールバーがすごい長くなる。 […] 解決方法: IE/winでは、heightを与えることができ、表示されているcontainerのheightには影響しない。IEはboxとdimension(大きさとか面積などの意)に非標準のふるまいを持つので、この方法が可能だ。 Holly Hack(ヒイラギハック): 要素にheightを指定する。例えばheight: 1%;というように。
    IE Escaping Floats Bug

  • Win/IE6 Peekaboo bug(いないいないばあバグ): リキッドボックスが内部にfloatを持ち、contentがそのfloatに沿うように見えている。IE6ではcontentが見えなくなる。画面を下にスクロールするか別窓に移動すると、その上で全部見えるようになる(IE7でやっとこのバグはなくなった)。
    Win/IE6 Peekaboo bug

  • IE/Winはleft floatされたブロックに3pxの右マージンを与える。あなたがどうしようと、そのマージンはそこに存在する。アクションの中でこの現象を見るには、floating bugの最初とdouble float fixをチェックせよ。このバグはThe IE Three Pixel Text-Jog(3ピクセルのテキストのでこぼこ)とも呼ばれている。 [Floating Bugs].

  • IE Duplicate Character Bug(文字コピーのバグ): IE6は複数のfloat要素によって引き起こされる不可解なバグを持つ。最後にfloatされた要素からテキストの文字が時々最後のfloatの下に複製されるというバグだ。一連のfloatの間に挟まれたこういった普通のHTMLコメントに限っては、このバグがいきなり発生する。Bugfix.
    IE Duplicate Character Bug

    [IE Duplicate Character Bug]

  • ウェブページのコンテントのレイアウト時における最も一般的なタスクは、テキストflowの周辺に画像を右か左にfloatして配置することである。floatされた画像にclearを追加すれば、それぞれの要素を前の要素の直下に必ず置くことができます。しかし、IEで同じ要素の中にfloatとclearのプロパティを置くと大きなギャップが出現します。ギャップはCSSの修正をさらに複雑にさせます。元々使っていたCSSにはほど遠いぐらいに。Bugfix.” [Close Gaps Next to Floated Images in Internet Explorer]

  • left floatをconatiner boxの中に置き、containerの左サイドから離そうとしてそのfloatに左マージンを使う。IEではleft floatのマージンは2倍(!)の長さになります。 [The IE Doubled Float-Margin Bug]

  • floatされたdiv要素に隣接するインライン要素(画像やテキスト)が期待される位置からインデントされたように見えるバグがあります。IE/Winのfloat要素への奇妙なマージン操作によってインデントされます。[Floats, Margins and IE]

  • 簡単な解決方法は、IEの多くのfloatのバグを修正することである。全てのfloatがブロックボックスになるようにすればいい。displayプロパティにnoneを指定されない限りは、floatは無視されるようにすればいいと、よく言われている。floatしている要素にdisplay:inlineを設定すると、魔法のようにいくつかのIE/Winのバグが出なくなる。IE/Winは、多くのバグが修正されてはいるが、inlineボックスの中に要素を作ることができない。 [Float Layouts]

  • Safari1.3とSafari2.0で、ある要素にfloatとマイナスマージンを組合せて使うと、その要素内のリンクがクリックできなくなる。テキストも同様に非常に選び(フォーカス)にくくなり、フォーカスされなくなった時にtab through the linksするとリンクは見えなくなる。( Text also becomes very difficult to select, and if you tab through the links they disappear when they lose focus.)この現象を回避するには、マイナスマージンを持つfloat要素にposition:relativeを追加すると良い。 [Float + negative margin problems in Safari]

  • 現在、MSIE 7はfloatされた子要素を含むcontainerを折り畳むことで、W3C規格を正しく実装している。しかし、generated contentには実装されていないので、easy clearing methodと呼ばれている。( However, as it has not implemented generated content, the so called easy clearing method is not an option for clearing floats in MSIE 7.) easy clearing methodはMSIE 7のfloat clearのオプションではない。IEの全バージョンでの適切な解決方法は以下のようなoverflow methodである。



  1. #content { overflow : hidden; _height : 1%; }


CSS Floatのチュートリアルとテクニック


【個人的な疑問】
ブロックとボックスの違いは?
normal flowが指すものは何?
containerが指すものは何?
contentが指すもの。
current lineが指すもの。

  • No Related Posts

track feed

5 Responses to “CSSのfloatについてあなたが知るべきこと:和訳”

  1. Yoshioka Says:

    ちょっと意味の違うところがあるように見えます。

    「めちゃくちゃ奥深いバグ回避方法にたどりつくだろう。」の文はthe wayとinformationの間のthatが省略されており、意味は「情報をより洗練された、奥深いやり方で見せる方法を操れる。」です。

    「以前のfloatの使い方によって明らかにされた誤解や問題に」の文は、後半の文が「issue」と「misunderstandings」を説明している形です。意味は「ひとたびfloatが使われるといつも表面化する問題に取り組み、一般的な誤解を明らかにしていこう」です。

    「10個ほどの記事を交えて」のところの正しい訳は「私たちは数十の関連する記事を閲覧し、(中略)最も重要なことを選び出した」です。

  2. fjkktkys Says:

    ありがとうございます。
    正直、ごまかしたとこです、その辺w

    頑張って続きも訳してみようかと思います。

  3. 一寸詳しい人 Says:

    間違いだらけ。頼むから仕様書とか,それに基く翻訳とか,
    リファレンスとかを確り熟読してから,翻訳に試みて戴きたい。

    >訳者註:normal flowとはbodyタグの一番外側に相当する部分かと思われますが,違うかも

    CSS2.1の視覚整形モデルを理解していない。
    http://www.w3.org/TR/CSS21/visuren.html#normal-flow

    大雑把には,非フロートで,絶対位置決めでもない「通常の流れ」にあること。
    つまり float: none であり,position: static である要素の整形文脈のこと。
    これの一般的な翻訳は「通常フロー」もしくは「通常の流れ」とする事が多い。

    >floatは周辺の要素を動かしてしまう(floating)

    floatの意味は凡そ「浮かせる」。通常フローにないので,浮いた状態になり,
    その前後にある通常フローのレイアウトには影響を及ぼさない,ということ。

    >現在のライン

    これは「現在の行」と翻訳すべき。

    >マージンを崩壊させない(破綻させない?マージンが効かないことあるよね)。

    通常フローでは,隣接ブロックのマージン同士は相殺される。
    たとえば p { margin: 1em 0 } としても段落間は1emになる。
    正の値同士で隣接する場合,最大値が採用される決りだから。

    これの一般的な翻訳は「相殺」「潰しあい」とされる。
    細かい決りが色々規定されるので,仕様書を参照のこと。
    http://www.w3.org/TR/CSS21/box#collapsing-margins

    >そうしないと,他のコンテンツがflowされる場所が残らずにfloatされてないコンテンツのように,水平にブロックが並んだボックスになるだろう。

    これは正反対で「さもなければ,それは包含ブロックの水平空間を埋尽くし,ほかの内容がその脇に流しこむ余地をまったく残さず,あたかも非フロートの内容であるかのごとくなるだろう。」という意味と思われる。

    包含ブロック(containing block)は,仕様上の定義用語。
    http://www.w3.org/TR/CSS21/visuren#containing-block

    >ボックス要素

    意味不明。単に「ボックス」で宜しい。

    >要素がその要素を含むブロックの端に達すると右か左にずれる時に,我々はその要素をfloatする。

    これも正反対で「私たちが要素をフロートさせる時,それは包含ブロックの辺に到達するまで,右または左に寄せられて行く。」という意味と思われる。

    >隣接する別の要素が同じ方向のfloatを持つなら,最初のfloat要素の端に達しない限りはずれない。

    これも「隣接する別要素を同一方向にフロートさせると,その辺が最初のフロート要素の辺に到達するまで,それは寄せられて行く。」という意味と思われる。

    取敢えず,ここまで。疲れた……
    残りはまだ確認していません……

  4. fjkktkys Says:

    >一寸詳しい人
    ご指摘ありがとうございます。
    そうですね。かなり間違えてるなと後から気付いています。
    一旦、このエントリを下げようかと思っております。
    ありがとうございました。

  5. 一寸詳しい人 Says:

    >複数のブロックやボックスを含むということ: ブロックを含むというのは,他のいくつかの要素(複数のボックスの子要素)を含むボックスやブロックを含んでいるということである。

    「包含ブロックもしくは包含ボックス: 包含ブロックは,ほかの要素(子孫ボックス)を含むボックスかブロックである。」
    原文の“box or block”は意図が不明。“containing boxes”という表現は余計。単に“a box that”でよいだろう。

    >1要素がブロックを含むということはこういう意味だ。“ブロックに含まれる要素は生きている”.

    「ある要素の包含ブロックというのは,“その要素が存在している包含ブロック” の意味である。」
    もっと詳しく言えば,“その要素自身が含まれている祖先の包含ブロック” という意味。

    >floatされたボックスは,そのボックスの外側の端がそのボックスを含むブロックの端か別のfloatの外側の端にに達するまで左か右へと動くだろう。

    “outer edge”というのは,ボックスの「マージン辺(margin edge)」と同義。これは一般に「外辺」と訳す。
    一般に“edge”は「辺」と訳す。それと「動く」ではなく,「~へ移動される」とすべきだろう。

    >特にnormal flow内に収まるようにボックスが縦方向に位置する場合は,一番上のボックスがcurrent line boxの上に揃えられる。しかし,ボックスが横方向に位置する場合は,そのボックスが含まれているブロックのパディングの範囲内で(他のコンテントと同様に)右か左へと可能な限り移動する。取り囲まれているinlineコンテントは反対側へのflowが許されている。[

    「フロートボックスに指定されるとき,そのボックスは通常フローの範囲内で縦方向に置かれ,フロートの上辺は現在の行ボックスの上辺に揃えられる。しかしフロートの水平位置は,その包含ブロックのパディング内側で(ほかの内容と同様に)可能なかぎり右または左に寄せられる。そして周囲のインライン内容は,その反対側に流し込むことが出来る。」 (今一自身なし)

    行ボックスとは,1行を構成する複数のインラインボックスが含まれている矩形領域のこと。

    >flow内ではないfloatをした場合,floatが存在しないかのように縦方向にflowしたfloatボックスの前後に,位置が決められていない複数のブロックボックスが作られる。

    「フロートは通常フローには属さないので,その前後に生成される位置指定されないブロックボックスは,恰もフロートボックスが存在しないかのごとく縦方向に流し込まれる。」

    >しかしながら,line boxesはfloatボックス用の短縮された場所を用意されたfloatに隣接して作られる。floatボックスの前に位置するcurrent line上のあらゆるコンテントは,floatボックスの他のside内で最初に有効なline内で再びflowされる。

    「しかながら,フロートに後続する行ボックスについては,フロートボックスの場所を確保するせいで幅が短縮される。また,フロートボックスより前の行に含まれる全内容は,フロート側面に現れる最初の利用できる行へと流し込み直される。」

    >current lineにおけるfloatボックスのための横方向のスペースが十分にない場合,十分なスペースが確保されるまでline by lineでそのfloatボックスは下方向へと移動する。

    「フロートボックスを確保する充分な水平空間がその行に無ければ,それが確保できるまで一行ずつ押下げられるだろう。」

    >またはline boxを持たない前のブロックボックスの下端

    “previous”だから,「直前の~」であろう。

    >float theory

    これは普通に「~の理論」「~セオリー」でよいではないか。

    >ラインボックスは,ブロックレベルに含まれる要素内のラインとして作られた全てのインラインボックスを含む架空の矩形である。ラインボックスは少なくともそのラインボックスで最も縦に長い。

    「行ボックスとはそれを包んでいるブロックレベル要素において,1行を構成する全てのインラインボックスが含まれている架空の矩形である。それは最も高い行ボックスと(少なくとも)同じぐらいの高さである。」 (今一自身なし)

    英語に特別堪能というわけでもなく,自身の翻訳力に大して自信もないが,誰かが指摘せねばなるまいと奮闘してはみた。だが,悉くの誤りで本当に厭になった。あとはご自分で何とかして戴きたい。全面的な書換えを奨める。

    というか仕様すら知らずして,無理やりに翻訳など試みるべきではない。原著者はかなり真摯な態度でフロートについて解説して居られるようだ。にも拘らず,無知に基いて拙く翻訳されたのでは,あまりに非道いではないか。また,これを鵜呑みにしてしまった多くの読者を混乱させたであろう。ウェブという媒体でひろく情報公開することの影響力を認識して戴きたい。

    どんな翻訳でも何かしらの誤りが潜在するものであろう。しかしその大半が誤りでは話にならない。

Leave a Reply

add to hatena hatena.comment (29) add to del.icio.us (26) add to livedoor.clip (11) add to Yahoo!Bookmark (2) Total: 68