【问题标题】:float:left; vs display:inline; vs display:inline-block; vs display:table-cell;向左飘浮;与显示:内联;与显示:内联块;与显示:表格单元格;
【发布时间】:2012-08-02 01:41:43
【问题描述】:

我的问题

  1. 专业网页设计师是否喜欢这些方法?

  2. 在绘制网站时,Web 浏览器是否首选这些方法?

  3. 这只是个人喜好吗?

  4. 我还缺少其他技术吗?

注意:以上问题与设计多列布局有关


浮动:左;

http://jsfiddle.net/CDe6a/

这是我在创建列布局时经常使用的方法,它似乎工作得很好。不过,父母确实会自行崩溃,所以你只需要记住clear:both;。我刚刚发现的另一个缺点是无法垂直对齐文本。

显示:内联;

这似乎纠正了折叠父级的问题,但增加了空格。

http://jsfiddle.net/CDe6a/1/

从 html 中删除空格似乎是解决此问题的最简单方法,但如果您对 html 真的很挑剔,则不需要。

http://jsfiddle.net/CDe6a/2/

显示:内联块;

似乎表现得和display:inline;一模一样。

http://jsfiddle.net/CDe6a/3/

显示:表格单元格;

http://jsfiddle.net/CDe6a/4/

完美运行。

我的想法:

我确定我遗漏了很多东西,比如某些会破坏布局的例外情况,但display:table-cell; 似乎效果最好,我想我会开始替换float:left;,因为我似乎总是这样搞砸clear:both;。我在网上阅读了很多关于这方面的文章和博客,但没有一篇给出明确的答案,告诉我在布局我的网站时应该使用什么。

【问题讨论】:

标签: html css css-float


【解决方案1】:

我更喜欢 inline-block,虽然 float 也很有用。旧 IE 无法正确呈现表格单元格(内联块也不正确,但我经常使用 zoom: 1; *display: inline hack)。如果你的孩子的身高比他们的父母小,浮动会把他们带到顶部,而内联块有时会搞砸。

大多数时候,浏览器会正确解释所有内容,当然,除非是 IE。您总是需要检查以确保 IE 不糟糕——例如,表格单元的概念。

实际上,是的,这归结为个人喜好。

您可以用来消除空白的一种技术是将 font-size 设置为 0 给父级,然后将 font-size 还给子级,尽管这既麻烦又恶心。

【讨论】:

  • 如果“你总是必须检查 IE 是否不糟糕”,那么你总是会感到失望。呵呵。 (另一方面,他说你应该经常检查你的代码不会在你想要支持的每个版本的 IE 中都被吸收是非常正确的)
【解决方案2】:

我会说这取决于您需要它:

  1. 如果您只需要它来获得 3 列布局,我建议您使用 float。

  2. 如果需要菜单,可以使用inline-block。对于空格问题,您可以使用 Chris Coyier 在此处http://css-tricks.com/fighting-the-space-between-inline-block-elements/ 描述的一些技巧。

  3. 如果您需要进行多项选择,并且宽度需要在指定的框内均匀分布,那么我更喜欢display: table。这在某些浏览器中无法正常工作,因此取决于您的浏览器支持。

最后,最好的方法是使用flexbox。这个规范已经改变了几次,所以它还不稳定。但是一旦最终确定,这将是我认为最好的方法。

【讨论】:

【解决方案3】:

我通常使用float: left; 并将overflow: auto; 添加到solve the collapsing parent problem (至于为什么这样做,overflow: auto 将扩展父级而不是添加滚动条,如果你不给它明确的高度,overflow: hidden 的作用是好吧)。我的大部分垂直对齐需求都是针对one-line of text in menu bars,可以使用line-height 属性来解决。如果我真的需要垂直对齐块元素,我会在父元素和垂直对齐的项目上设置显式高度、绝对位置、顶部 50% 和负边距。

我不使用display: table-cell 的原因是当您拥有的项目超出网站宽度可以处理的范围时,它会溢出。 table-cell 将强制用户水平滚动,而浮动将包裹溢出菜单,使其无需水平滚动仍可使用。

float:left 和 overflow:auto 最好的一点是它可以在没有 hack 的情况下一直运行到 IE6,甚至可能更远。

【讨论】:

  • 这一点很好,在许多流行的教程中都没有提到。几个问题:这实际上是在不同的浏览器中测试的吗?您选择在导航和内容等两个块之间绘制分隔符的方法是什么?我问的原因是因为如果上面的 div 的高度不同,那会很困难。
  • @ShitalShah:我不太清楚你所说的“这个”是什么意思,但我已经实现了无数的水平菜单,并且向左浮动和溢出是 IMO 实现水平的最干净和最可靠的方式跨许多不同浏览器的菜单,无论新旧。对于添加分隔符,我通常会使用左边框(或者更高级的分隔符的背景图像,如果您不需要关心旧浏览器,那么您也可以使用 CSS3 边框图像)。我不太明白你所说的不同高度是什么意思,想要解释更多或添加小提琴?
  • 这清除了很多关于清除的问题,我不知道溢出可以做到这一点。我习惯了 :after 方法,你在其中添加内容:“。”和可见性:隐藏。谢谢你
【解决方案4】:

您询问的选项中:

  • float:left;
    我不喜欢浮动,因为需要有额外的标记来清除浮动。就我而言,整个float 概念在CSS 规范中设计得很糟糕。不过,我们现在对此无能为力。但重要的是它确实有效,并且适用于所有浏览器(甚至 IE6/7),所以如果您喜欢它,请使用它。

如果您使用:after 选择器来清除浮动,则可能不需要额外的清除标记,但如果您想支持 IE6 或 IE7,则这不是一个选项。

  • display:inline;
    这不应该用于布局,除了 IE6/7,其中 display:inline; zoom:1 是对 inline-block 的破坏支持的后备黑客。

  • display:inline-block;
    这是我最喜欢的选择。它在所有浏览器中都运行良好且始终如一,但需要注意的是 IE6/7,它支持某些元素。但是请参阅上面的 hacky 解决方案来解决这个问题。

inline-block 的另一个重要警告是,由于内联方面,元素之间的空白被视为与文本单词之间的空白相同,因此您可以在元素之间出现间隙。有解决方法,但没有一个是理想的。 (最好的就是元素之间不要有任何空格)

  • display:table-cell;
    另一个您会遇到浏览器兼容性问题的问题。较旧的 IE 根本无法使用它。但即使对于其他浏览器,值得注意的是table-cell 设计用于在样式为table 和table-row 的元素内部的上下文中使用;单独使用 table-cell 并不是预期的方式,因此您可能会遇到不同的浏览器以不同的方式处理它。

您可能错过的其他技巧?是的。

  • 既然您说这是用于多列布局,那么您可能想知道CSS Columns feature。但是,它不是最受支持的功能(即使在 IE9 中,IE 也不支持,并且所有其他浏览器都需要供应商前缀),因此您可能不想使用它。但这是另一种选择,你确实问过了。

  • 还有 CSS FlexBox 功能,旨在让您的文本在框之间流动。这是一个令人兴奋的功能,它允许一些复杂的布局,但这仍处于开发阶段——请参阅http://html5please.com/#flexbox

希望对您有所帮助。

【讨论】:

  • 您不需要额外的标记来清除浮动,请参阅我的回答。
  • IE6/7 的inline-block 警告仅适用于默认为display: block 的元素,例如<div> 元素。它适用于以 inline 开头的元素,例如 <span>。
  • 我总是使用inline-block,因为它是专门为这些情况设计的。
  • 删除 display:inline-block 创建的空白的好方法,您可以在容器元素上将 font-size 设置为 0,然后为内联元素本身设置所需的值。这避免了需要删除 html 中的空格
  • @AlexMorley-Finch:确实,这是一个很好的解决方案。但是请注意,如果您在 ems 中使用字体大小,则它不起作用。这意味着它可能不是适用于所有情况的解决方案。您可能还想查看我单独发布的this answer,其中涵盖了这一点以及处理空白问题的其他选项。
【解决方案5】:

仅作为记录,为了补充 Spudley 的答案,如果您知道列宽,还可以使用 position: absolute 和边距。

对我来说,选择方法时的主要问题是您是否需要列填充整个高度(等高),其中 table-cell 是最简单的方法(如果您不太关心旧浏览器)。

【讨论】:

    【解决方案6】:

    我更喜欢 inline-block,但 float 仍然是组合 HTML 元素的有用方法,特别是当我们有一个应该粘在左边和一个应该粘在右边的元素时,浮动在写更少的行时效果更好,而inline-block 在许多其他情况下工作得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 2012-02-29
      • 2013-03-09
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多