21

私が所有して運営しているサイトのこのページデザインをご覧ください。

http://www.jungledragon.com/image/9472/barn_owl_close-up.html

ご覧のとおり、これは従来の2列のレイアウトに関係しています。物事の順序は重要です。たとえば、写真のすぐ横に、これが関係する種を確認できます。

現在、このサイトのレスポンシブデザインをコーディングしており、課題に直面しています。狭いスマートフォンのビューポートでそのページを想像してみてください。古典的な戦略は、右の列を左の列の下に単純に「スタック」し、ユーザーが垂直方向にスクロールできるようにすることです。ただし、これは要素の順序に関しては理想からはほど遠いものです。「種」ブロックは写真のずっと下にあり、ユーザーは写真と種の関係を確認する前に、まずコメントなどをスクロールする必要があります。

私はそれを解決しようとしていますが、CSSのフレックスボックスを可能な解決策として説明しているこの記事は非常に有望に聞こえました:

http://www.jordanm.co.uk/post/21863299677/building-with-content-choreography

ここでの考え方は、CSSのみを使用して、要素の視覚的な順序を、まさに私が必要としているものに変更できるということです。残念ながら、それ以来、この記事では古い仕様が使用されており、新しい仕様はどのブラウザでもほとんどサポートされていないことを知りました。

http://css-tricks.com/old-flexbox-and-new-flexbox/

この種は私にとってそれを台無しにします。それでも、概念レベルで質問したいと思います。

フレックスボックスに関して私が見たすべてのデモには、次のような単純なマークアップがあります。

<div id="somecontainer">
  <div id="child1"></div>
  <div id="child2"></div>
</div>

次に、コンテナは垂直方向のフレックスボックスであると宣言されます。そして最後に、各子要素に順序が割り当てられます。これにより、たとえば、単一のCSSステートメントを使用してchild2をchild1の上に移動できます。

ここに質問があります。追加の階層が機能しているという意味で、実際のマークアップがより複雑な場合はどうなりますか?例:

<div id="somecontainer">

  <div id="colmain">

    <div id="content1"></div>
    <div id="content2"></div>
    <div id="content3"></div>

  </div>

  <div id="colside">

    <div id="content4"></div>
    <div id="content5"></div>
    <div id="content6"></div>

  </div>

</div>

ご覧のとおり、このマークアップには追加の階層があり、並べ替えられる実際のコンテンツブロックは、最上位のコンテナの直接の子要素ではありません。彼らは子供ですが、直接の子供ではありません。

フレックスボックスと子要素の並べ替えは、このようなシナリオで機能しますか?たとえば、「content5」を「content1」と「content2」の間に移動できますか?

ブラウザのサポートが不十分であるにもかかわらず、私はそれがサポートされるかどうかを概念的に理解しようとしています。私が尋ねる理由は、追加の列階層はマークアップで非常に一般的であり、フレックスボックスの並べ替えが直接の子でのみ機能する場合は完全にダメだからです。

4

3 に答える 3

36

あなたの質問のタイトルに答えるために:はい、これは実際には仕様で非常に明確に述べられています:

フレックスコンテナの内容は、0個以上のフレックスアイテムで構成されます。フレックスコンテナの各子は、フレックスアイテムになります。

仕様の文言が混乱する場合は、文言が少しずれているためです。

彼らは子供ですが、直接の子供ではありません。

は定義上直接です...内部は子孫divと呼ばれますが、フレックスコンテナ内に直接ネストされていないという点で子ではありません。

現在、display: flexまたはdisplay: inline-flexフレックスコンテナに指定されているものはすべてあります。各フレックスアイテムはフレックスコンテナのフォーマットコンテキストに参加しますが、フレックスアイテムの子孫は、フレックスコンテナに関係なく独立してフォーマットされ、最初からコンテナがフレックスされなかったかのようになります。

そのため、フレックスアイテム自体もその子孫のフレックスコンテナになっている場合を除いて、フレックスアイテムの子孫を並べ替えることはできませんが、それでも、この内側のコンテナを超えて、外側に対してコンテナの兄弟の周りで並べ替えることはできません。容器。

于 2013-01-04T04:18:08.580 に答える
5

BoltClock答えは素晴らしいですが、重要なメモを追加したいと思います。

フレックスアイテムになるのは、フレックスコンテナの(直接の)子ボックスです。ただし、これらは必ずしも(直接の)子要素に対応しているわけではありません。

いくつかの例:

  • フレックスコンテナの::beforeおよび::after疑似要素は、フレックスアイテムを生成します。
  • フレックスコンテナ内に直接含まれる連続する各テキストは、匿名のフレックスアイテムにラップされます。
  • フレックスコンテナの子要素にが含まれている場合、その要素はdisplay: contentsレンダリングされず、その子(フレックスコンテナの孫)はフレックスアイテムとして表示されます。

次に、フレックスコンテナの内部に複雑な構造があり、ツリーの葉を外部コンテナのフレックスアイテムにしたい場合は、すべての中間要素をでスタイル設定できますdisplay: contents

ただし、notedisplay: contentsは最近追加されたものであるため、まだ広くサポートされていません。

于 2015-11-14T16:25:52.163 に答える
2

いくつかの潜在的な解決策はCSSグリッドレイアウトです:http://dev.w3.org/csswg/css3-grid-layout/ただし、執筆時点ではIE10のみがサポートしています:http://caniuse.com/css-grid

およびテンプレートレイアウトhttp://www.w3.org/TR/2009/WD-css3-layout-20090402/

ただし、どちらかが開発されているのか、または類似しているが構文が変更されている別のフレックスボックスタイプのものがあるのか​​はわかりません

于 2013-02-22T09:17:22.547 に答える