Работает ли модуль flexbox только для прямых дочерних элементов?

Посмотрите на этот дизайн страницы сайта, который я владею и запускаю:

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

Как вы можете видеть, это касается классического двухколоночного макета. Порядок вещей важен. Например, вы можете видеть непосредственно рядом с фотографией, что это касается.

Теперь я кодирую отзывчивый дизайн для этого сайта и сталкиваюсь с проблемой. Представьте себе эту страницу в узком окне просмотра смартфонов. Классической стратегией было бы просто "складывать" правый столбец ниже левого и позволить пользователям прокручивать по вертикали. Однако это далеко не идеально с точки зрения упорядочения элементов. Блок "specie" будет ниже под фотографией, пользователи сначала должны прокручивать такие вещи, как комментарии, прежде чем они смогут увидеть взаимосвязь между фотографией и изображением.

Я пытаюсь решить эту проблему, и эта статья, в которой объясняется CSS flexbox как возможное решение, звучала очень многообещающе:

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

Идея здесь заключается в том, что только с использованием CSS можно изменить визуальный порядок элементов, именно то, что мне нужно. К сожалению, с тех пор я узнал, что статья использует устаревшую спецификацию и что новая спецификация почти не поддерживается любым браузером:

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

Этот вид руин для меня. Тем не менее, я все еще хотел бы задать свой вопрос на концептуальном уровне:

Все демонстрации, которые я видел относительно flexbox, имеют разметку так же просто, как это:

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

Затем контейнер объявлен как гибкая, вертикальная по направлению. И, наконец, каждому дочернему элементу присваивается ордер. Это позволяет, например, child2 перемещаться выше child1, используя один оператор CSS.

Теперь вот вопрос. Что делать, если фактическая разметка более сложна в том смысле, что в игре есть дополнительные иерархии? Пример:

<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>

Как вы можете видеть, эта разметка имеет дополнительные иерархии, фактические блоки содержимого, подлежащие переупорядочению, не являются прямыми дочерними элементами контейнера наивысшего уровня. Это дети, но не прямые дети.

Может ли flexbox и переупорядочение дочерних элементов работать в таком сценарии? Можно ли, например, "content5" перемещаться между "content1" и "content2"?

Независимо от плохой поддержки браузера, я пытаюсь концептуально понять, будет ли это поддерживаться. Причина, по которой я спрашиваю, заключается в том, что дополнительные иерархии столбцов чрезвычайно распространены в разметке, и это полностью сосало бы, если переупорядочение переборки было бы работать только на прямых дочерних элементах.

Ответ 1

Чтобы ответить на ваш вопрос: да, это на самом деле довольно четко указано в спецификации:

Содержимое контейнера flex состоит из нуля или более элементов гибкости: каждый дочерний элемент гибкого контейнера становится гибким элементом

Если формулировка в спецификации смущает вас, это потому, что ваша формулировка немного выключена:

Это дети, но не прямые дети.

Ребенок по определению является прямым... внутренний div называется потомками, но не дочерними, поскольку они не имеют прямого вложения в контейнер flex.

Теперь все с display: flex или display: inline-flex обозначается гибким контейнером. Хотя каждый гибкий элемент участвует в контексте форматирования гибкого контейнера, потомки гибких элементов отформатируются независимо и независимо от контейнера flex, такие же, как если бы контейнер никогда не сгибался в первую очередь.

Таким образом, вы не можете переупорядочивать потомки элементов flex, за исключением того, что сам элемент flex также является контейнером flex для своих потомков, но даже тогда вы не можете переупорядочить их за пределами этого внутреннего контейнера и вокруг братьев-братьев-контейнеров по отношению к внешним контейнер.

Ответ 2

Некоторыми потенциальными решениями будут макет CSS Grid: http://dev.w3.org/csswg/css3-grid-layout/, однако на момент написания IE10 поддерживает его: http://caniuse.com/css-grid

и макет шаблона http://www.w3.org/TR/2009/WD-css3-layout-20090402/

Не уверен, что если они разрабатываются, или если у нас будет другая вещь типа гибкого ящика с множеством аналогичных, но изменяющихся синтаксисов

Ответ 3

Ответ BoltClock велик, но я хочу добавить важное примечание:

Это (прямые) детские коробки гибкого контейнера, которые становятся гибкими элементами. Но это не обязательно соответствует (прямым) элементам детей.

Некоторые примеры:

  • Элементы ::before и ::after псевдоэлементов гибкого контейнера генерируют элементы гибкости.
  • Каждый непрерывный пробег текста, который непосредственно содержится внутри контейнера flex, завернут в анонимный элемент flex.
  • Если дочерний элемент гибкого контейнера имеет display: contents, оно не будет отображаться, а его дочерние элементы (внуки гибкого контейнера) будут отображаться как элементы гибкости.

Затем, если у вас сложная структура внутри контейнера flex, и вы хотите, чтобы листья дерева были гибкими элементами внешнего контейнера, вы можете стилизовать все промежуточные элементы с display: contents

Тем не менее, обратите внимание display: contents является недавним дополнением, поэтому оно пока не поддерживается широко.