css - CSS flexbox 模块是否仅适用于直接子元素?

标签 css flexbox

看看我拥有并运行的网站的这个页面设计:

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

如您所见,这涉及经典的两列布局。事情的顺序很重要。例如,您可以直接在照片旁边看到这涉及的物种。

我现在正在为这个网站编写响应式设计,并面临挑战。想象一下在狭窄的智能手机视口(viewport)上的那个页面。经典的策略是简单地将右栏“堆叠”在左栏下方,让用户垂直滚动。然而,就元素的排序而言,这远非理想。 “specie” block 将位于照片下方,用户必须先滚动浏览评论等内容,然后才能看到照片和 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>

接下来,容器被声明为一个 flexbox,方向垂直。最后,为每个子元素分配一个顺序。例如,这允许使用单个 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>

如您所见,此标记具有额外的层次结构,要重新排序的实际内容 block 不是最高级别容器的直接子元素。他们是 child ,但不是直接 child 。

flexbox 和子元素的重新排序能否在这种情况下工作?例如,“content5”可以在“content1”和“content2”之间移动吗?

不管浏览器支持有多差,我都试图从概念上理解它是否会受到支持。我问的原因是因为额外的列层次结构在标记中非常常见,如果 flexbox 重新排序只对直接子元素起作用,那就太糟糕了。

最佳答案

回答你的问题标题:是的,这实际上是stated quite clearly在规范中:

The contents of a flex container consists of zero or more flex items: each child of a flex container becomes a flex item

如果规范中的措辞让您感到困惑,那是因为您的措辞有点不对:

They are childs but not direct childs.

child 根据定义是直接的...内部 div 称为 descendants,但不是子代,因为它们不是直接嵌套在 flex 容器中。

现在,任何带有 display: flexdisplay: inline-flex 的东西都被指定为 flex 容器。虽然每个 flex 元素都参与了 flex 容器的格式化上下文,但 flex 元素的后代是独立格式化的,与 flex 容器无关,就好像容器从一开始就没有 flex 一样。

因此,您不能对 flex 元素的后代重新排序,除非 flex 元素本身也为其后代制作了一个 flex 容器,但即便如此,您也不能重新排序超出此内部容器和围绕容器的 sibling 到外容器。

关于css - CSS flexbox 模块是否仅适用于直接子元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14148162/

相关文章:

html - Wordpress:向右浮动侧边栏无法正常工作

html - 两个 div 动态填充视口(viewport)高度

html - 网格元素的响应式 View ,让它们相互叠加

css - 带 float 的无序列表项 :left do not float properly

css - 如何操纵屏幕大小/视口(viewport)大小,以便桌面显示网站的移动版本?

javascript - 当元素的前一个兄弟元素具有特定类时,如何设置元素的样式?

html - 如何在 img 中使用 flexbox

html - 使用 flex 将 div 移向右侧

html - 调整图像大小以适合显示 :flex divs

javascript - 将以前的值设置为 reactjs 中的状态