CSS 3 弹性盒子模型

这篇文章关于弹性盒子布局,由法国开放网络爱好者 Jérémie Patonnier 撰写。

弹性盒子模型

CSS 3 引入了全新的盒子模型,除了 CSS 1 和 2 中的传统盒子模型。弹性盒子模型决定了盒子在其他盒子内部的分布方式以及它们如何共享可用空间。

您可以查看规范 这里

这个盒子模型类似于 XUL 使用的盒子模型(Firefox 使用的用户界面语言)。其他一些语言也使用类似的盒子模型,例如 XAML 或 GladeXML。

通常,如果您想创建适应浏览器窗口大小的灵活布局或适应字体大小的弹性布局,弹性盒子模型正是您所需要的。

在这篇文章中,我的所有示例都基于以下 HTML 代码

  
1
2
3

分布盒子:所以呢?

默认情况下,传统的 CSS 盒子模型根据 HTML 流垂直分布盒子。使用弹性盒子模型,可以显式指定顺序。您甚至可以反转它。要切换到弹性盒子模型,将属性 display 设置为值 box(或 inline-box)到具有子盒子的盒子。

display: box;

水平或垂直分布

box-orient 属性允许您指定分布轴。verticalhorizontal 值定义了盒子的显示方式。其他值 (inline-axisblock-axis) 具有相同的效果,但还允许您定义基线对齐本身(基本上,盒子被视为“内联”盒子)。

body{
  display: box;
  box-orient: horizontal;
}

反转分布

box-direction 属性允许您设置盒子出现的顺序。默认情况下,当您只指定分布轴时,盒子会遵循 HTML 流,并在使用垂直轴时从上到下分布,并在使用水平轴时从左到右分布。通过将 box-direction 设置为 reverse,您可以反转盒子的分布顺序。它就像您实际上反转了 HTML 中元素的顺序。

小心使用此属性,因为它会改变某些其他属性的工作方式,从而产生一些意想不到的行为。

body {
  display: box;
  box-orient: vertical;
  box-direction: reverse;
}

显式分布

box-ordinal-group 属性允许您指定盒子将被分布的顺序。这是最终的定制机会,因为您可以定义所需的顺序,而无需考虑 HTML 流顺序。这些组由从 1 开始的数字定义(这是默认值)。因此,盒子模型将首先分布这些组,然后分布每个组中的所有盒子。分布从最低值(编号为 1 的组)到最高值(编号为 2 及以上的组)进行。

body {
  display: box;
  box-orient: vertical;
  box-direction : reverse;
}
#box1 {
  box-ordinal-group: 2;
}
#box2 {
  box-ordinal-group: 2;
}
#box3 {
  box-ordinal-group: 1;
}

那么灵活度呢?

如果改变自然的 HTML 流顺序是巨大的,那么当您开始处理可用空间时,真正的乐趣就开始了。

盒子大小

默认情况下,盒子不灵活。只有当它具有 box-flex 属性且值为至少 1 时,它才会变得灵活。

如果盒子不灵活,它将尽可能宽以使内容可见,没有任何溢出。它的尺寸可以使用属性 widthheight(或它们的 min-*max-* 替代方案)强制执行。

如果盒子是灵活的,它的尺寸将按如下方式计算

  1. 显式尺寸声明 (width, height, min-*max-*)
  2. 父盒子的尺寸以及所有剩余的可用内部空间。

因此,如果盒子没有尺寸声明,它们的尺寸将完全取决于其父盒子的尺寸。它将按以下方式工作:盒子的尺寸等于其父尺寸乘以其 box-flex 属性的值,再除以其父级中包含的所有盒子的所有 box-flex 属性值的总和。

另一方面,如果一个或多个盒子有显式尺寸语句,则所有这些盒子的尺寸都会被计算,并且所有灵活的盒子都会以与上面相同的原则共享剩余的可用空间。

这听起来可能有点棘手,但通过一些示例,它会变得更容易。

所有盒子都是灵活的

在下一个示例中,盒子 1 是盒子 2 大小的两倍,盒子 2 与盒子 3 的大小相同。它看起来与使用百分比设置盒子的大小相同。但有一个很大的区别。如果您添加一个盒子,您无需重新计算其大小。使用弹性盒子模型,每次添加一个盒子时,所有其他盒子都会自动缩小以腾出空间供新盒子使用。

body {
  display: box;
  box-orient: horizontal;
}
#box1 {
  box-flex: 2;
}
#box2 {
  box-flex: 1;
}
#box3 {
  box-flex: 1;
}

某些盒子具有固定大小

在下一个示例中,盒子 3 不灵活,宽度为 160 像素。在这种情况下,盒子 1 和 2 可用 240 像素的自由空间。因此,盒子 1 的宽度将为 160 像素(240 像素 x 2/3),盒子 2 的宽度将为 80 像素(240 像素 x 1/3)。如果您愿意,也可以使盒子 3 灵活。在这种情况下,计算此盒子尺寸的方式将几乎与使用 min-width 属性相同。

body {
  display: box;
  box-orient: horizontal;
  width: 400px;
}
#box1 {
  box-flex: 2;
}
#box2 {
  box-flex: 1;
}
#box3 {
  width: 160px;
}

管理溢出

因为我们可以混合灵活盒子、不灵活盒子以及具有预设尺寸的灵活盒子,所以所有盒子尺寸的总和可能大于或小于父盒子尺寸。因此,您可能会有太多空间或空间不足。

我有很多可用空间;我该怎么办?

可用空间的分配取决于属性 box-alignbox-pack

属性 box-pack 管理水平轴上空间的分配方式,可以有四个可能的值:startendjustifycenter

  1. start:所有盒子都在父盒子的左侧,所有剩余的空间都在右侧。
  2. end:所有盒子都在右侧,剩余的空间在左侧
  3. justify:可用空间在每个盒子之间均匀分配
  4. center:可用空间在父盒子的两侧均匀分配

属性 box-align 管理垂直轴上空间的分配方式,可以有五个值:startendcenterbaselinestretch

  1. start:每个盒子的顶部边缘与父盒子的顶部对齐,所有剩余的空间都放在下方。
  2. end:每个盒子的底部边缘与父盒子的底部对齐,所有剩余的空间都放在上方。
  3. center:可用空间被均匀分配,一半放在上方,一半放在下方。
  4. baseline:所有子级都与其基线对齐放置,剩余的空间根据需要放置在前面或后面(这只是关于此值实际工作方式的简化,但您明白了)。
  5. stretch:每个盒子的高度被调整以适应父盒子高度

关于这些属性如何工作的警告:它们受到 box-orientbox-direction 属性使用的强烈影响。它们会导致一些意想不到的行为(例如,值 startend 的行为可能会完全颠倒)。我希望一旦规范最终确定,我们将获得更多关于这些属性如何协同工作的信息。

body {
  display: box;
  box-orient: horizontal;
  /* The content of the body is horizontally centered */
  box-pack: center;
  /* and vertically as well ... o/ */
  box-align: center;
  width: 100%;
  height : 100%;
}

如果空间不足会发生什么?

就像传统的盒子模型一样,溢出属性允许您定义管理它的方式。这里没有惊喜。

但是,您在这里也要小心。事实上,box-orientbox-direction 属性的使用可能会弄乱它。例如,您可以看到元素溢出到右侧而不是左侧,或溢出到顶部而不是底部。在尝试将其用于大型项目之前,花点时间进行实验,否则您可能会疯掉。

您还可以通过将 box-lines 属性设置为 multiple 来避免溢出,使盒子跨多行(或列,具体取决于方向)运行。

好吧,很酷,但它在现实生活中有效吗?

是的!Gecko 和 WebKit 都有盒子模型的供应商前缀实现 (注意:规范的当前状态不反映 Mozilla 或 WebKit 的实现)。这意味着 Firefox、Safari、Chrome 以及使用其中一个渲染引擎的任何浏览器都能够使用本文中描述的功能。如果您使用这些很棒的浏览器之一,这里有一个关于弹性盒子模型实际操作的小演示

如果您没有使用实现盒子模型的浏览器,则此屏幕截图显示了它的样子

总结

您可以开始使用此盒子模型来使用现代 Web 浏览器布局您的 HTML 文档。但要小心,这是 W3C 工作草案的第一个迭代。肯定会有一些变化。无论如何,Gecko 和 Webkit 中可用的实现非常一致且成熟,因此如果存在更改,它们应该不会那么麻烦。

这个盒子模型是一种非常简单易行的方法,可以解决网页设计中的一些常见问题(表单布局、页面页脚、垂直居中、视觉流与 HTML 流分离等)。我强烈建议您熟悉它,因为它可能会在不久的将来成为网页设计师的标准工具(如果微软决定将其包含在 IE 中,它可能会变得非常快)。

目前已有的功能是一个很好的开始,可以用来玩玩。但到目前为止,传统盒子模型和弹性盒子模型的交互方式并不十分清楚(例如,不可能在使用 box-ordinal-group 属性的盒子中使用 position:relative 与属性 lefttop)。这将得到改进,但不要惊讶,如果您的工作习惯受到一定程度的破坏。另一个棘手的点:与这个新的盒子模型相关的属性的交互方式有时会非常令人困惑。这应该让您想起您发现 float 属性的那一天。;)

更多信息

关于 Paul Rouget

Paul 是一位 Firefox 开发者。

Paul Rouget 的更多文章……


105 条评论

  1. Christian

    感谢这篇精彩的文章!太可惜了,IE 还没有支持。

    顺便说一下,以下内容是否应该从

    1

    1

    2010 年 4 月 22 日 下午 10:22

    1. Christian

      看来我不能在这里插入任何 html 代码。基本上,您只需要看看第一段中的示例代码。

      2010 年 4 月 22 日 下午 10:23

      1. Paul Rouget

        谢谢。已修复。

        2010 年 4 月 22 日 下午 11:05

        1. James John Malcolm

          在示例 3(显式分配)中,您应该在文章中添加“box-direction : reverse; ”行,因为现在图片显示的是您期望的相反方向。

          尽管如此,非常好的、清晰简洁的示例!

          2010 年 4 月 22 日 下午 11:18

          1. Paul Rouget

            好眼力!已修复。

            2010 年 4 月 22 日 下午 11:27

  2. Kroc Camen

    不错不错。很高兴能够在没有浮动的情况下轻松地反转 CSS 中的顺序。

    缺点?与 display、position 和 float 相结合,这个新添加的功能只会让 CSS 布局对于新手开发者来说更加令人费解,并且它仍然无法在表格布局中取代 colspan / rowspan。

    谁知道呢,也许有一天我们真的可以弃用 CSS1 布局,让 CSS 恢复一些简洁和精确。

    2010 年 4 月 22 日 下午 10:27

    1. James John Malcolm

      它并没有真正让人费解。

      我特别感谢为解决源代码顺序与流代码顺序问题、居中问题以及永恒的粘性页脚问题所做出的努力。所有这些都是长期存在的 CSS 问题,似乎已以一种非笨拙、灵活且兼容的方式得到解决。

      2010 年 4 月 22 日 下午 11:09

  3. Norman

    这甚至比使用 display:table & display:table-cell 更好。干得好,我很快就会去看看。:)

    2010 年 4 月 22 日 下午 10:32

  4. Hans Wurest

    « 如果微软决定将其包含在 IE 中,它可能会变得非常快 »

    和 IE6 用户数量的下降一样快吗?

    2010 年 4 月 22 日 下午 5:32

  5. Hans Wurest

    如果微软决定将其包含在 IE 中,它可能会变得非常快

    和 IE6 用户数量的下降一样快吗?

    2010 年 4 月 22 日 下午 5:33

  6. [...] 在主体中并水平显示它。就这么简单。以下是我从 Mozilla Hacks 博客中获得的一个示例:123<div id="box1"></div> <div id="box2"></div> <div [...]

    2010 年 4 月 22 日 下午 7:35

  7. Jamie

    我这些年来怎么没注意到这个?我感到震惊,这个完整的规范经过如此周密的思考和实现,却一直保持着如此低调。它确实看起来很复杂,但可能不是不必要的复杂。它似乎解决了“让此高度等于下一列高度”的问题以及乱序的 HTML 显示问题。

    2010 年 4 月 22 日 下午 7:50

  8. Havvy

    有这么多 display 属性,展示它们在您更改它们时如何级联可能会有所帮助。现在看来,将各种模型组合在一起如何工作纯粹是猜测。还可能存在冗余。测试这一点会很好。哦,布局看起来是什么样子的图片也会很有用。

    2010 年 4 月 22 日 下午 10:17

  9. Loïc

    非常有趣!

    不过,实际的实现可能会让用户感到困扰。事实上,您试过在示例中选择文本吗?例如,从“始终置顶的文章”开始选择并向下移动。这并不是真正预期的效果......

    2010 年 4 月 22 日 下午 11:33

  10. jpvincent

    对于那些想知道的人:即使 IE9 预览版也不支持它

    2010 年 4 月 23 日 上午 1:24

  11. Dan

    “有些盒子有固定大小

    在下一个示例中,盒子 3 不是灵活的,宽度为 160 像素。在这种情况下,盒子 1 和 2 有 240 像素的可用空间。因此,盒子 1 的宽度将为 160 像素(240 像素 x 2/3),盒子 2 的宽度将为 80 像素(240 像素 x 2/3)。”

    最后一段应该是 1/3,而不是 2/3。

    感谢这篇博文,这似乎是一种更自然的设计方式。

    2010 年 4 月 23 日 上午 5:50

    1. Paul Rouget

      已完成!谢谢。

      2010 年 4 月 23 日 上午 6:41

  12. Ian Obermiller

    我在任何地方都没有看到这一点,所以我会在这里澄清一下。在文章末尾提到的示例页面上,他们提到可以使用弹性盒子模型来创建一个粘性页脚。这是通过在前面的元素上设置 box-flex:1 来实现的,在本例中为 #main { -moz-box-flex:1; }。

    2010 年 4 月 23 日 下午 2:02

  13. Don Williams

    所以基本上它是在使用表格进行布局,其中“表格”被重命名为“盒子”,语法变得比表格复杂得多且不直观,所有这些都是为了取悦激进的反表格阵营,他们想要表格,但不想称之为表格,这样他们的激进同伴就不会唠叨他们了。

    2010 年 4 月 23 日 下午 7:12

    1. Paul Rouget

      不,因为表格问题在于在“内容”中包含“设计”。在这里,所有设计工作都在 CSS 端进行。

      2010 年 4 月 24 日 上午 4:24

      1. thinsoldier

        … 理论上(也许)相同的 CSS 可以应用于 table 标签?因此,也许我可以重新设计一个混乱的基于表格的网站,该网站来自 2002 年,而无需费尽脑筋尝试编辑复杂的表格结构……

        2010 年 10 月 13 日 上午 9:25

    2. voracity

      Don,我理解你的感受,但我认为你误解了它的重要性。像你一样,我也是反“反表格阵营”阵营中的一员,但弹性盒子非常符合我的要求。它*可以*使 HTML 代码更简洁,而且它*可以*比表格更强大。但如果你想忽略它,请便。

      事实上,使用 CSS 代替表现性标签的推动是出于好意,但纯粹的 CSS 支持者忽略了 CSS 在布局方面存在绝对惊人的支持 - 并且他们继续忽略了这一点长达 10 年之久!弹性盒子,或类似的东西,应该早得多地引入 - 但话说回来,HTML5 也应该早得多地引入。;)

      注意:这不是对任何个人或团体的批评。谢天谢地,网络并不受一个“仁慈的”或其他任何暴君的统治,因此它将根据自己的条件发展,即使这有时比我们希望的要慢(比如慢 10-15 年)……

      2010 年 4 月 24 日 上午 5:41

    3. Mike

      @Don Williams:你显然不了解网络标准和语义标记。如果有时间,我稍后会回来这里并写一些内容来回应你的评论。

      2010 年 4 月 29 日 上午 5:30

  14. Ryan

    我正在使用 -trunk(具体来说,Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a5pre) Gecko/20100423 Firefox/3.7a1pre),但我没有看到示例页面正确渲染。

    2010 年 4 月 23 日 下午 10:00

    1. Paul Rouget

      你能告诉我哪里出了问题吗?(我也在使用 trunk,没问题)

      2010 年 4 月 24 日 上午 4:26

  15. Shaun

    好东西。如果幸运的话,在 2019 年之前,99% 的用户将使用支持 CSS 3 的浏览器。=) 在此之前……

    2010 年 4 月 23 日 下午 11:06

  16. voracity

    耶,hacks.m.o 上的一篇关于弹性盒的博文!这个布局模型真的需要更广泛地推广。有谁知道是否可以使用 HTC 文件或某种 XAML 技巧等方式在 IE 中实现弹性盒子?

    2010 年 4 月 24 日 上午 5:23

    1. thinsoldier

      同意。在我看来,弹性盒子可能是 CSS 中最有用和最重要的方面。我们应该比过渡、WebGL、hsla、3D 变换等更积极地推动这一点……

      2010 年 10 月 13 日 上午 9:28

  17. discoleo

    所有这些盒子都太... 矩形了。我们什么时候才能让圆形和其他形状参与进来?

    2010 年 4 月 24 日 上午 8:01

    1. 当你开始使用 SVG 格式发布时。

      2010 年 5 月 1 日 上午 3:25

  18. Uman

    IE 用户可以使用 Google Chrome Frame 来尝试一下……

    2010 年 4 月 24 日 上午 8:30

  19. John Haugeland

    这很不错,而且很酷 - CSS 终于提供帧大小模型真是太好了 - 但要让它变得可移植还需要很多年。

    与此同时,用几行 JavaScript 就可以很容易地把它黑掉。

    2010 年 4 月 25 日 上午 10:01

  20. Sergio de la Garza

    这是我们两年前在弹性 CSS 框架中所做的事情:http://elasticss.com

    2010 年 4 月 26 日 上午 8:29

  21. Sergio de la Garza

    这已经做过了,并且适用于所有浏览器,它被称为弹性 CSS 框架

    2010 年 4 月 26 日 上午 9:20

  22. Shay Howe

    我喜欢!标记干净简洁,而且非常灵活。我理解表格的论点,但是这里大部分代码都在 CSS 中,而不是 HTML 中。我真的很期待使用它。

    2010 年 4 月 26 日 下午 12:50

  23. BigAB

    box-lines 属性在任何浏览器中都能工作吗?有没有例子证明它可以工作?

    2010 年 4 月 26 日 下午 12:55

  24. Philip

    我喜欢它,但我更喜欢 CSS 模板布局的规范(http://www.w3.org/TR/2009/WD-css3-layout-20090402/)。

    2010 年 4 月 27 日 上午 7:20

  25. Wes

    box-lines 在 Firefox 中不起作用

    2010 年 4 月 27 日 上午 10:17

  26. denisdeng

    好文章!我从中学到了很多东西。
    Css3弹性盒模型

    2010 年 4 月 29 日 上午 2:29

  27. ren1999

    我尝试过这个弹性盒子模型,个人发现它不必要地复杂,而且没有用。我真的不希望我的单元格过于灵活,以至于每个单词都堆叠在一起。

    此外,没有 rowspan 或 colspan 命令,这使得 table 命令仍然相关。

    我一直很难使用 div 来分割文章。我确实使用 div,但主要使用 Javascript 的 GetElementByID 和 innerHTML。

    我认为应该删除 header、footer 和 section 保留字。

    2010 年 4 月 29 日 上午 6:22

  28. Thomas Gossmann

    我非常希望有类似以下的东西
    width: 100% – 260px; 这将完美地融入弹性盒子模型中 :)

    2010 年 4 月 30 日 上午 8:32

    1. Christopher Blizzard

      @Thomas - 我们绝对会实现它!我们很快就会发布关于 calc() 的博文。

      2010 年 4 月 30 日 上午 09:21

  29. Luke Dorny

    这看起来很有趣,也很有用。
    注意:当视窗水平方向缩小时,演示页面右列会溢出页脚。
    你可以为该列添加 overflow:hidden 属性,强制重排并向下推动页脚。这是一个常用的技巧。

    2010 年 4 月 30 日 下午 13:20

  30. Martin Kliehm

    很棒的解决方案,但我仍然需要使用一些技巧来实现向后兼容,这将持续几年。我经常遇到在创建可访问网站时列顺序的问题,我希望标签顺序是逻辑上的(而不是从左到右到中间列跳跃)。这非常适合这种情况。尽管我想说“box-flex”这个名字不太直观。它确实提供了灵活性,但它也描述了盒子列的大小比例。有可能改变这个名称吗?

    2010 年 5 月 4 日 上午 06:16

  31. Olivier

    终于!这就是我要说的 ;)

    2010 年 5 月 5 日 上午 06:26

  32. stefan

    我对此非常感兴趣。它比 CSS 模板更好地解决了“页脚位于底部”问题。

    不幸的是,示例页面在 Firefox 中运行良好,但当你在 Safari 或 Chrome(4.1.something)中调整浏览器窗口大小时,右列的文字会溢出。
    在 Firefox 中:页脚会被向下推动,并会出现一个滚动条,而在 Chrome 中则不会。页脚始终可见。

    你对此有什么想法吗?或者我是否漏掉了什么?

    2010 年 5 月 6 日 上午 08:03

    1. Zoe Gillenwater

      在我的测试中,将包含元素(在本例中为 #page)从 height:100% 更改为 min-height:100% 可以在 Webkit 中修复问题,而不会改变 Firefox 中的行为。

      2010 年 8 月 3 日 上午 11:51

  33. Matt

    在尝试将 box-flex 与 position absolute 结合使用时,FF 3.5 中似乎存在一个错误。

    基本上,我试图将一个元素相对于一个灵活的 div 进行绝对定位,但它似乎只在 FF 3.6 中正常工作。这是一个测试示例

    http://meta-graphical.com/tests/box-flex.html

    在 FF 3.5 中,尽管 div number 4 被绝对定位,但 div number 3 始终包含它。我根本找不到解决方法。:(

    Matt

    2010 年 5 月 13 日 上午 06:54

  34. Giorgio

    嗨 Matt,在当前的 Mozilla 实现中,盒子内部的定位项目和盒子本身根本无法工作,但我希望在将来它们能够工作。

    对于弹性盒子测试人员:请将你的改进和功能请求提交到 Mozilla 的 Bugzilla

    再见 :)

    2010 年 5 月 13 日 上午 10:44

  35. Emil Ivanov

    我希望 IE 和 Opera 尽快实现它,这样我们就可以开始使用它,这太棒了。

    2010 年 5 月 17 日 下午 18:06

  36. Martin *toi

    很棒的文章,谢谢。这真的激励我终于弄清楚新的盒子模型。简洁明了的描述和示例,我喜欢这样的方式。
    我已经发现了一些错误......很高兴在这里有一个报告链接,你会收到邮件 ;)

    继续努力,伙计们......我一直是 Opera 的粉丝,因为我使用它已经很久了,甚至在我听说 Firefox 之前。但对于工作和所有超越网页浏览的事情,Firefox 领先太多了。

    Martin / 德国

    2010 年 5 月 19 日 上午 11:38

  37. [...] 现在我们都以不同的身份为 Mozilla 工作。Tantek 将帮助我们解决 CSS3 弹性盒子模型的问题,弄清楚如何正确处理可样式化的 HTML5 表单控件,并帮助 [...]

    2010 年 5 月 26 日 上午 06:27

  38. Sam

    我个人更喜欢这个提议:http://www.xanthir.com/:wih 因为它为高度、宽度、边距、填充和边框宽度定义了弹性长度。而不是仅仅使用 box-flex 属性,该属性只针对宽度或高度。它还讨论了多行或多列的换行。总的来说,它更加强大。

    我真的很希望看到 W3 规范改为这个提议。

    2010 年 6 月 7 日 上午 00:31

  39. Mike

    在 Firefox 中不起作用,抱歉......

    2010 年 7 月 17 日 上午 11:26

  40. gonAlonso

    我对这个有点困惑......CSS 应该用于表现,而 XHTML 应该用于内容。
    但这个例子使用了一些技巧让事情正常工作。body 标签中填充了一个 div 元素。正如我所读到的,这纯粹是表现形式。事实上,我所见过的所有XHTML5 模板 都在 body 标签内直接显示了许多特定元素,而不是嵌套 div 来管理边框、额外空间等。

    我认为在某些/许多情况下确实需要表格布局。FF 和 WK 都支持 display: table、display: table-cell......虽然不完整(缺少 colspan、rowspan..),但非常有用。

    2010 年 7 月 20 日 上午 03:59

  41. Zoe Gillenwater

    我一直测试这个,在 Firefox 或 Safari/Chrome 中,box-flex 的工作方式与本文中描述的不同。例如,在 box1 设置为 flex 2、boxes 2 和 3 设置为 flex 1 的示例中,boxes 2 和 3 只有在内容量相同(一个字符)的情况下才会具有相同的宽度。例如,在 box 3 中添加更多内容,它将比 box 2 更大。因此,相等的 box-flex 值并不意味着相等的宽度,因为浏览器现在正在这样实现它。

    2010 年 8 月 10 日 下午 13:08

  42. Geoff Kendall

    我必须说,我对这个感到恐惧——又一个布局模型?我对关于“粘性页脚”问题的讨论有点困惑,因为清除的页脚似乎是 CSS 在所有主要浏览器中都能正确执行的一件事。CSS(在现实世界中的实现方式)最大的问题是,div(即盒子?)既不能保证包含它们自己的内容,也不能排除不是它们自己的内容——在我看来,这是主要的脑筋急转弯(cue 关于 AP、几乎所有内容都浮动、布局、zoom:1 等等的评论)。我知道很多人会说我“只是不理解”某些东西,但当我看到一个简单的页眉/左右列/页脚布局被描述为“圣杯”,以及当几乎任何布局问题都似乎是需要争论的问题时,标准出了很大的问题(正如我们都知道的)。问题是,当大量的 IE6/7/8 用户无法显示你用它制作的网站时,添加新的盒子模型有什么帮助呢?客户希望他们的网站对每个人看起来都一样,所以除了让每个人都更新他们的浏览器这一全球性的命令之外,我们只能忍受目前的混乱,而且我看不出添加任何东西有什么意义。也许我们应该开始为新的浏览器制作网站,并称之为新的“格式”,以便取代旧的 CSS,就像 DVD 取代 VHS 一样?我们必须抛弃旧的浏览器,或者继续为它们编写代码。

    只是大声思考...!

    2010 年 8 月 19 日 上午 11:05

    1. Michael

      “也许我们应该开始为新的浏览器制作网站,并称之为新的“格式”,以便取代旧的 CSS,就像 DVD 取代 VHS 一样?我们必须抛弃旧的浏览器,或者继续为它们编写代码。”

      Geoff,我完全同意你的观点。在我看来,我看到超级强大的跑车在高速公路上只以 30 英里的时速行驶,因为有人 的祖父在前面用一辆占用 4 条车道的汽车慢慢开着,而且不让任何人超车。

      我现在正在设计一个只使用 HTML5/CSS3 的网站,而且我 [大部分情况下] 不在乎 IE。我可能在发布时会遭受潜在的收入损失,但我宁愿给用户提供更现代的体验(并且减少自己的头疼),而不是为了兼容性而降低网站水平。随着人们开始越来越熟悉高级技术,对可能性的吸引力将激励他们发布可能排除能力较低的用户的网站。讨论一下。

      2010 年 11 月 15 日 下午 13:51

  43. Matt

    @Geoff Kendall 我理解你的观点。我曾为一些大型公司做过网站,我绝不可能在他们的任何网站上使用 box-flex。

    但是,我认为我们不能让旧浏览器的使用率阻碍新标准和技术的开发。否则,这个行业将永远无法前进。像这样的东西继续被开发出来,推动创新,这一点很重要。

    此外,我敢肯定,清除的页脚和粘性页脚是两回事。或者也许我只是误解了粘性页脚是什么:http://www.cssstickyfooter.com/

    Matt

    2010 年 8 月 20 日 上午 02:10

  44. Geoff Kendall

    嗨 Matt

    下次我有空闲的一天或需要休息时,我会看一下 box-flex,因为我同意我们至少应该看看如何改进,如果我们现在拥有的方法没有用的话(尽管我可以争辩说 CSS 和浏览器的不兼容性非常有效地让网页设计师保持工作状态!)。至于页脚,我想我不明白为什么页面在页脚之后还要继续向下延伸?如果你想固定一个 min-height:(IE6,height:)到你的主要内容,然后页脚会跟随,页面会在之后结束?在大多数情况下,我都是“几乎所有内容都浮动”的粉丝,但我绝不是布局方面的专家。不过,我的确学到了,固定宽度的布局要容易得多,而且设计原则经常依赖于对齐,而这些对齐在液体或弹性布局中很难保持。我做过可拉伸的网站,但它们可能需要花费很长时间(至少对我来说)才能在所有流行的浏览器中正常工作。事实上,这也是一个令人沮丧的地方——有 20 个网站在线,我应该已经了解布局的所有知识了......

    2010 年 8 月 20 日 上午 04:33

  45. thinsoldier

    那么,这些哪一个是 w3c css 小组的优先事项呢?

    这个弹性盒子模型还是“高级布局模块”
    http://www.w3.org/TR/2007/WD-css3-layout-20070809/
    ?

    我个人喜欢这个弹性盒子。

    他们会投票选择哪一个作为重点吗?

    2010 年 9 月 13 日 上午 10:17

    1. Paul Irish

      这两项工作是不同的人负责的,但据我所知,实施方对添加对 css3-layout 模块的支持兴趣不大。
      它非常以文档为中心,而且没有解决弹性盒子那么多问题。:/

      2010 年 10 月 4 日 下午 17:09

  46. Tim

    还有其他人遇到 -webkit-box-lines:multiple 实现问题吗?它对我来说不起作用,而且在任何地方都找不到任何实时示例......

    2010 年 10 月 7 日 下午 14:57

  47. thinsoldier

    谁想帮我做 css-3-flexible-box-model-zen-garden.com?

    2010 年 10 月 13 日 上午 09:21

  48. thinsoldier

    幸好我在花时间写“严肃的”回复之前查看了你的网站。

    我不是想讨厌你。我也不是专家。而且你的标记非常干净。

    但你的网站让我觉得没有人应该听你的建议。

    2010 年 10 月 13 日 上午 09:35

    1. thinsoldier

      这是对 kira1999 的回复

      2010 年 10 月 13 日 上午 09:36

      1. thinsoldier

        实际上是对 ren1999 的回复

        2010 年 10 月 13 日 上午 09:37

  49. Eugene

    我注意到 Gecko 和 Webkit 在计算盒子大小方面存在差异(至少,在“与盒子方向相反”的方向上)。在这方面,盒子在 Gecko 中就像内联块元素,在 Webkit 中就像“普通”块元素。以防万一,这里是一个测试页面的代码:http://pastie.org/1278958(对于大量的与主题无关的 CSS 和 JavaScript 我表示歉意)。

    2010 年 11 月 7 日 上午 5:19

    1. Eugene

      我把问题想得太复杂了。Gecko 和 Webkit 之间的这种差异与盒子方向无关。参见 http://jsfiddle.net/cpn2u/1/embedded/result/http://pastie.org/1385728

      2010 年 12 月 17 日 下午 1:33

      1. wes

        Gecko 中当前的 flexbox 实现可能是最古老的,它只是一个实验,而 Webkit 中的也是一个实验,有很多未知的行为尚未被规范明确修复,包括与其他盒子模型和 CSS 定位的配合,Mozilla 中的 flexbox 旨在为现在的受限环境(XUL)工作。

        我用 flexbox 来设计 intranet 软件的 GUI,它绝对棒极了。

        去吧,flexbox,去吧!

        2010 年 12 月 18 日 上午 10:36

  50. 所以我现在正在玩这个,它似乎在绝对定位的容器中根本不起作用。我设置了 display: -moz-box、pack center、align center,它工作得很好……然后我添加了 position: absolute,bam,它就不再起作用了。

    这意味着它仍然无法在窗口中垂直居中。天哪,这不应该是一项如此困难的任务。

    2010 年 11 月 21 日 下午 6:36

    1. Michael

      @wrote (2010 年 11 月 21 日 下午 6:36)
      那是因为绝对定位它会消除盒子布局的整个效果。

      2010 年 11 月 22 日 上午 1:33

      1. 没错,但是如果我有一个绝对定位的容器,宽度和高度为 100%,我是否不能在该容器内部使用盒子布局?我不明白为什么父/祖先元素的定位会像它影响容器内的正常流一样影响盒子模型。

        2010 年 11 月 22 日 下午 12:51

  51. Brett Widmann

    这正是我需要的!感谢分享。

    2010 年 12 月 9 日 上午 8:51

  52. rodrigo moraes

    这是我使用 flexbox 创建的一个架构。它可以制作 1 到 3 列布局,并且非常容易定制

    http://www.tipfy.org/static/labs/css/flexbox/3_cols.html

    查看 CSS 文件以了解如何使用它。

    2010 年 12 月 14 日 上午 6:26

  53. κατασκευη ιστοσοσελιδων Websites

    太可惜了,我无法在我的浏览器中看到示例。这是一个非常棒的模型,但是 IE 怎么样?它会工作吗?谢谢

    2011 年 2 月 19 日 上午 2:42

  54. [...] Mozilla 网站上展示的演示似乎可以正常工作,但在现实生活中实际上还没有按预期工作。演示之所以有效,是因为 [...]

    2011 年 2 月 24 日 下午 9:34

  55. Marc Diethelm

    查看 http://flexiejs.com/,它在不兼容的浏览器中实现了该功能。

    它运行得非常完美。从今天起,它也可以在 http://www.cdnjs.com/ 中获得。

    2011 年 3 月 1 日 上午 3:39

  56. Ghigo

    我注意到在 Firefox 中,当在具有 max-height 和 max-width 的 div 中使用 display: -moz-box 时,有一个奇怪的行为。

    你可以查看我刚刚制作的测试页面,它会更加清楚
    http://ghigo.strayorange.com/sandbox/box.html

    希望它能有所帮助。
    感谢您的文章。

    2011 年 3 月 22 日 上午 10:09

  57. Eugene

    看起来像一个 bug。我会提交一个 bug 报告。

    2011 年 3 月 23 日 上午 1:18

  58. [...] CSS 3 Flexible Box Model (Mozilla Hacks - the Web developer blog | 2010 年 4 月 22 日) [...]

    2011 年 5 月 16 日 下午 8:43

  59. [...] box,但在 CSS 3 中我们有灵活的盒子模型。我发现了一个关于 flexi box 的很棒教程。你可以阅读它。发表在 HTML & CSS « 创建一个有吸引力的 Facebook 粉丝页面 你可以留下一个 [...]

    2011 年 7 月 10 日 上午 6:45

  60. [...] CSS 3 Flexible Box Model [...]

    2011 年 7 月 13 日 上午 12:11

  61. [...] https://hacks.mozilla.ac.cn/2010/04/the-css-3-flexible-box-model/ [...]

    2011 年 7 月 26 日 上午 8:02

  62. Laurent

    @rodrigo moraes
    很棒的 CSS。感谢分享它!

    2011 年 11 月 25 日 上午 10:42

  63. JC

    太棒了!现在,对于我们这些在数字媒体和其他广阔的浏览器/设备范围行业的人来说,我们只需要更多的浏览器支持(JS 修复很棒,但如果我们一次使用所有这些,那将是一个臃肿的体验)。

    2011 年 11 月 26 日 上午 6:07

  64. Eugene

    justify 不起作用。帖子已经超过一年了……修复一个 bug 真的需要这么长时间吗?

    2011 年 12 月 8 日 上午 6:12

    1. Wes

      bug 不会被修复,flexbox 将根据新规范(2011 年)重新实现。

      2011 年 12 月 8 日 下午 5:08

      1. Michael C.

        好吧,我宁愿它能正确完成,这样我们才能在同一页上(真的,没有双关语)。

        我只是很高兴其他浏览器(甚至 IE)也实现了这一点。Flexbox 等是自 v1 以来发生在 CSS 上最棒的事情之一。浮动对于以文档为中心的页面来说很好,在这些页面中流动是最重要的。但是,对于 Web 应用程序来说,必须找到和使用其他方法。我正在考虑接手我的一个 Web 应用程序并完全将其转换为使用 flexbox(我已经做了一个快速而粗糙的原型,它工作得很好)。

        Wes,关于新实现的 ETA 有什么想法吗?

        2011 年 12 月 8 日 下午 6:05

        1. Wes

          由于 Mozilla(Firefox、扩展程序)在很大程度上依赖于 flexbox,我认为新实现将会非常晚。

          目前的实现与新规范不兼容,因此 Mozilla 必须让旧实现和新实现一起使用。这是一项艰巨的工作。

          如果 Mozilla 决定删除当前实现以支持新实现,他们可能必须完全重写 XUL 样式声明。

          所以我认为(这是我的推测)这不会很快发生。

          (注:Mozilla 在 XBL 上也遇到了同样的问题,我想。)

          2011 年 12 月 8 日 下午 11:15

          1. Michael C.

            他们可以有两种模式,一种用于扩展程序,另一种用于 HTML 文档。然后根据视窗内容的上下文切换模式。是的,这仍然意味着在代码库中添加一个额外的“腿”。但至少它可以保持可管理。他们也可以弃用旧的界面,这样维护就不再是问题了。我想这就是在不断变化的标准之上构建这么多东西所要付出的代价。

            2011 年 12 月 9 日 上午 1:12

  65. [...] CSS3 Flexible Box Model [...]

    2011 年 12 月 16 日 下午 5:27

  66. φωτοβολταικα

    我使用的是 Mozilla(最新版本),但看不到灵活盒子模型是如何工作的。我只是看了演示,什么都没有……为什么?

    2011 年 12 月 23 日 上午 4:24

  67. pd

    读到这样一篇文章,现在已经超过 18 个月了,但我们仍然无法使用唯一对网络设计有意义的盒子布局模型(它本身已经非常晚,自网络发明以来已经 15 年或更长时间了!)难道不令人沮丧吗?

    如果微软不是试图利用 IE 来鼓励从 XP 升级就好了。唉,即使微软现在强制用户升级到适用于其 Windows 版本的最新 IE 版本,他们决定不将 IE9 及更高版本移植到 XP 上也是一个杀手。

    2012 年 1 月 3 日 上午 6:47

  68. αποκριατικες στολες

    IE 总是比 Mozilla 和 Chrome 落后两到三步。我认为他们不在乎浏览器……

    2012 年 1 月 11 日 上午 5:09

  69. garra rufa fish spa

    如果你想使用真正好的东西,使用 Safari。它就像苹果一样,完美无瑕!

    2012 年 1 月 16 日 上午 11:22

  70. [...] https://hacks.mozilla.ac.cn/2010/04/the-css-3-flexible-box-model/ [...]

    2012 年 3 月 3 日 上午 4:41

  71. Jean-Yves Perrier

    我不知道你在哪里测试这个,但是现代 flexbox 规范使用以 flex-* 开头的属性名称,而不是 box-*。

    如果你试图通过将 -moz 前缀添加到这里描述的 box-* 来实现这一点,你很幸运能够让它正常工作。-moz-box-* 不是这些属性,而是一个 XUL 灵活盒子模型,它与这些属性大不相同(它是在创建 Flexbox 模型时进行的实验之一)。

    在这两种情况下,你都不应该使用这两个过时的模型来构建任何网站,因为它们要么只在 Firefox 中工作(-moz-box-* 的情况),要么在浏览器完成最新规范的实现后突然停止工作。

    2012 年 4 月 25 日 下午 5:05

  72. κατασκευή ιστοσελίδων

    Jean Yves 你学识渊博。你是法国的设计师吗?

    2012 年 6 月 19 日 上午 4:05

  73. sean

    使用 flex 盒子模型时,处理表格的最佳方法是什么?当我尝试使用它时,内容被非常糟糕地分配了,当然,这是因为 flex 默认设置为 box-orient: horizontal。即使你将其更改为 vertical,也没有用,假设所有元素都显示在 flexbox 中。到目前为止,我发现的是,表格应该以表格格式显示,而不是 flex。但即使是普通的表格显示,它似乎也无法正确调整大小。

    2012 年 6 月 22 日 上午 10:36

  74. φωτοβολταικα

    也许我们得等到 IE 11 :)

    2012 年 6 月 26 日 下午 11:17

  75. ashish

    真的,IE 产生了非常大的问题,但这篇文章非常有用,感谢您提供这篇文章。

    2012 年 8 月 12 日 下午 11:26

  76. chrixian

    也许使用一个真正的浏览器

    2012 年 10 月 26 日 下午 11:31

  77. 整形外科医生

    为什么这段简单的代码无法在我的 IE 中播放?我不想这么说,但 IE 太烂了!现在就开始使用 Chrome 吧。

    2012 年 11 月 14 日 下午 3:43

  78. 体外受精

    很棒的 CSS。谢谢!

    2013 年 1 月 30 日 上午 2:00

本文的评论已关闭。