282

我的问题

  1. 专业网页设计师是否喜欢这些方法中的任何一种?

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

  3. 这一切都只是个人喜好吗?

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

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


向左飘浮;

http://jsfiddle.net/CDe6a/

浮动:左图

这是我在创建列布局时经常使用的方法,它似乎工作得很好。父母确实会自行崩溃,因此您只需要clear:both;事后记住即可。我刚刚发现的另一个问题是无法垂直对齐文本。

显示:内联;

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

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

显示:内嵌图像

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

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

没有 html 空白图像

显示:内联块;

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

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

显示:内联块图像

显示:表格单元格;

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

显示:表格单元格图像

完美运行。

我的想法:

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

4

6 回答 6

202

在您询问的选项中:

  • 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 功能。然而,它不是最受支持的功能(即使在 IE9 中,IE 也不支持,并且所有其他浏览器都需要供应商前缀),因此您可能不想使用它。但这是另一种选择,你确实问过。

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

希望有帮助。

于 2012-08-06T06:46:23.547 回答
35

我通常使用float: left;and addoverflow: auto;解决折叠父级问题(至于为什么这样做,overflow: auto如果你不给它明确的高度,它将扩展父级而不是添加滚动条,overflow: hidden也可以)。我的大部分垂直对齐需求都是针对菜单栏中的一行文本,可以使用line-height属性来解决。如果我真的需要垂直对齐一个块元素,我会在父元素和垂直对齐的项目上设置一个明确的高度、绝对位置、前 50% 和负边距。

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

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

在此处输入图像描述

于 2012-08-06T06:13:43.647 回答
9

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

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

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

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

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

于 2012-08-06T05:16:40.347 回答
4

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

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

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

您可以用来消除空白的一种技术是将 a 设置font-size为 0 给父级,然后将其font-size返回给子级,尽管这很麻烦,而且很恶心。

于 2012-08-04T02:39:18.233 回答
4

仅作记录,添加到 Spudley 的答案中,position: absolute如果您知道列宽,还可以使用和边距。

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

于 2013-10-07T09:25:02.913 回答
1

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

在此处输入图像描述

于 2017-06-13T10:43:01.187 回答