21

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

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

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

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

我正在尝试解决这个问题,这篇解释 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>

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

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

无论浏览器支持不佳,我都试图从概念上了解是否会支持。我问的原因是因为额外的列层次结构在标记中非常常见,如果 flexbox 重新排序仅适用于直接子级,那将是完全糟糕的。

4

3 回答 3

36

要回答您的问题标题:是的,这实际上在规范中已明确说明:

弹性容器的内容由零个或多个弹性项目组成:弹性容器的每个子项都成为弹性项目

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

他们是孩子,但不是直系孩子。

根据定义,孩子是直接的……内部div的 s 称为后代,但不是孩子,因为它们没有直接嵌套在 flex 容器中。

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

因此,您不能重新排序弹性项目的后代,除非弹性项目本身也成为其后代的弹性容器,但即便如此,您也不能在此内部容器之外以及相对于外部容器的兄弟姐妹周围重新排序它们容器。

于 2013-01-04T04:18:08.580 回答
5

BoltClock回答很好,但我想补充一点:

它是 flex 容器的(直接)子框成为 flex 项。但这些不一定对应于(直接)子元素。

一些例子:

  • 弹性容器的::before::after伪元素生成弹性项目。
  • 每个直接包含在 flex 容器内的连续文本都被包裹在一个匿名的 flex 项中。
  • 如果 flex 容器的子元素有display: contents,它将不会被渲染,并且它的子元素(flex 容器的孙子)将显示为 flex 项。

然后,如果您在 flex 容器内有一个复杂的结构,并且您希望树的叶子成为外部容器的 flex 项,您可以使用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/

不确定是否正在开发中,或者我们是否会有另一种 flex-box 类型的东西,它有很多相似但不断变化的语法

于 2013-02-22T09:17:22.547 回答