向左飘浮; vs display:inline; vs display:inline-block; vs display:table-cell;


281

我的问题

  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
看看html5boilerplate和Twitter Bootstrap上的家伙使用并坚持使用它们
Robert Niestroj 2012年

1
关于在css-tricks上与空间搏斗有一篇很棒的文章:css-tricks.com/fighting-the-space-between-inline-block-elements
Lea Rosema 2015年

我尝试使用该display: inline属性,但发现该属性无法正确处理子元素的填充。但是,如果使用display: inline-block此选项,则会自动注意。请参阅链接- codepen.io/prashdeep/pen/rVOyvd请让我知道你在相同的输入
zilcuanu

Answers:


200

在您询问的选项中:

  • float:left;
    我不喜欢浮动元素,因为需要附加标记来清除浮动元素。就我而言,整个float概念在CSS规范中设计欠佳。不过,我们现在对此无能为力。但是重要的是它确实可以工作,并且可以在所有浏览器(甚至是IE6 / 7)中工作,因此,请根据需要使用它。

如果使用:after选择器清除浮点数,则可能不需要附加的清除标记,但是如果要支持IE6或IE7,则不是可选的。

  • display:inline;
    除了IE6 / 7以外,不应将其用于布局,在IE6 / 7中,这display:inline; zoom:1是对的不完整支持的后备hack inline-block

  • display:inline-block;
    这是我最喜欢的选项。它在所有浏览器上均能很好且始终如一地运行,并警告IE6 / 7,它支持某些元素。但是请参阅上面的针对此问题的解决方案。

另一个需要注意的inline-block是,由于内联方面,元素之间的空白与文本单词之间的空白被视为相同,因此您可以在元素之间出现空白。有一些解决方法,但是都不是理想的选择。(最好只是在元素之间不留任何空格)

  • display:table-cell;
    另一个浏览器兼容性问题。较旧的IE根本无法使用。但是,即使对于其他浏览器,也值得注意的是,该table-cell设计用于在样式为tableand table-row;的元素内部的上下文中使用。table-cell隔离使用并不是实现此目的的预期方式,因此您可能会遇到不同的浏览器将其区别对待的情况。

您可能错过了其他技术吗?是。

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

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

希望能有所帮助。


2
您不需要额外的标记即可清除浮动信息,请参见我的回答。
Lie Ryan

3
最可靠的响应=答案。
EGHDK

2
我一直使用inline-block它,因为它完全适合这些情况。
拉普利·安德拉斯

1
删除display:inline-block创建的空白的一种好方法,可以在容器元素上将font-size设置为0,然后为inline元素本身设置所需的大小。这避免了需要删除html中的空格
AlexMorley-Finch 2014年

1
@ AlexMorley-Finch:确实,这是一个很好的解决方案。请注意,但是,如果您在中使用字体大小,则无法使用em。这意味着它可能不适用于所有情况。您可能还希望看到我单独发布的答案,其中涵盖了这一点以及其他处理空白问题的选项。
Spudley

34

我通常使用float: left;和添加overflow: auto;解决折叠的父级问题(关于它为什么起作用的原因,overflow: auto如果您不给它明确的高度,它将展开父级而不是添加滚动条overflow: hidden也可以)。我最需要的垂直对齐方式是菜单栏中的一行文本,可以使用line-heightproperty 来解决。如果确实需要垂直对齐块元素,则可以在父对象和垂直对齐的项目上设置显式高度,绝对位置,最高50%和负边距。

我不使用的原因display: table-cell是,当您有更多的项目超出站点的宽度可以处理时,它会溢出。table-cell将迫使用户水平滚动,而float将包裹溢出菜单,使其无需水平滚动即可使用。

关于float:左溢出:auto的最好之处在于,它可以一直回溯到IE6,而且不会被黑客入侵,甚至可能更进一步。

在此处输入图片说明


这点很不错,很多流行的教程中都没有提到。几个问题:这实际上在不同的浏览器中测试过吗?在导航和内容之类的两个块之间绘制分隔符的选择方法是什么?我问的原因是,如果以上div的高度不同,那将是困难的。
Shital Shah 2013年

@ShitalShah:我不太确定“ this”是什么意思,但是我已经实现了无数的水平菜单,并且浮动和溢出是IMO在所有不同的旧浏览器中实现水平菜单的最干净,最可靠的方法新。对于添加分隔符,我通常会使用左边框(或背景图片用于更高级的分隔符,如果您不需要关心旧的浏览器,那么也可以使用CSS3边框图像)。我不太了解您所说的不同身高是什么意思,想进一步说明或添加小提琴吗?
Lie Ryan

这清除了很多有关清除的内容,我不知道溢出可以做到这一点。我习惯于:after方法,在其中添加内容:“。” 和可见性:隐藏。谢谢你
Nils_e 15-4-26

9

我会说这取决于您需要什么:

  1. 如果您只需要3列布局,建议使用float

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

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

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


+1链接到Chris Coyier的文章。他列表中的一个附加功能是YUI的纯CSS网格使用的方法:github.com/yui/pure/blob/master/src/grids/css/grids-core.css
Web_Designer 2013年

4

我更喜欢内联块,尽管float也很有用。旧的IE无法正确显示表格单元(内联块也不正确,但是zoom: 1; *display: inline我经常使用这种技巧)。如果您的孩子的身高小于父母的身高,则漂浮物会将他们带到顶部,而内嵌式挡块有时会弄糟。

在大多数情况下,浏览器会正确解释所有内容,当然,除非是IE。您始终必须检查以确保IE不会吸引人-例如,表单元格概念。

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

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


如果“您总是要检查IE不会烂”,那么您将永远感到失望。呵呵。(从另一方面来说,他说的很对,您应该始终检查您的代码不会在您要支持的每个版本的IE中都吸收)
Spudley 2012年

4

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

对我而言,选择一种方法的主要问题是是否需要用列填充整个高度(相等的高度),而表格单元格是最简单的方法(如果您不太关心较旧的浏览器)。


0

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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.