在CSS中使用display:inline-block与float:left的优点


127

通常,当我们想DIVs连续拥有多个时,可以使用float: left,但是现在我发现了display:inline-block

示例链接在这里。在我看来,这display:inline-block是一种更好align DIVs的连续方式,但是有什么缺点吗?为什么这种方法不那么流行float呢?


@Moak特定问题inline不是inline-block。但在第一个相关的好:stackoverflow.com/a/11823622/918414
ThinkingStiff


2
示例链接已失效
information_interchange

Answers:


156

3个字:inline-block更好。

内联块

到唯一的缺点display: inline-block的方法是,在IE7和元素下面只能显示inline-block,如果它已经inline默认。这意味着不必使用<div>元素,而必须使用<span>元素。这根本不是一个很大的缺点,因为语义a <div>是用于划分页面,而a <span>仅是用于覆盖页面的跨度,因此在语义上没有很大的区别。这样做的一个巨大好处display:inline-block是,当其他开发人员在稍后维护您的代码时,display:inline-block与or 语句text-align:right 相比,显而易见并且正在尝试完成什么。我最喜欢的方法好处是易于使用,并且float:leftfloat:rightinline-blockvertical-align: middleline-heighttext-align: center以直观的方式完美地将元素居中。我在Mozilla博客上找到了一篇很棒的博客文章,介绍如何实现跨浏览器的内联块。这是浏览器的兼容性

浮动

使用该float方法不适合页面布局的原因是因为floatCSS属性最初仅打算将文本换成图片(杂志样式),并且设计上也不适合用于常规页面布局。以后更改浮动元素时,有时会遇到定位问题,因为它们不在页面流中。另一个缺点是,它通常需要一个clearfix,否则可能会破坏页面的某些方面。clearfix要求在浮动元素之后添加一个元素,以防止其父元素折叠起来,这越过了将样式与内容分离的语义线,因此是Web开发中的反模式

上面链接中提到的任何空白问题都可以通过white-spaceCSS属性轻松解决。

编辑:

SitePoint是网站设计建议的非常可靠的来源,他们似乎与我有相同的看法:

如果您不熟悉CSS布局,那么您会以为以想象力的方式使用CSS浮点数是技巧的高度,这是可以原谅的。如果您花了太多的CSS布局教程,那么您可能会认为掌握浮动知识是一种习惯。当您最终了解花车的工作原理时,您会被其独创性,复杂性所震惊,并会获得成就感。

不要上当。你被洗脑了。

http://www.sitepoint.com/give-floats-the-flick-in-css-layouts/

2015年更新-Flexbox是现代浏览器的不错选择

.container {
  display: flex; /* or inline-flex */
}

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

更多信息

2016年12月21日更新

Bootstrap 4取消了对IE9的支持,因此摆脱了行中的浮点数,并使Flexbox完整化。

拉取请求#21389


4
“ clearfix”只是一个名字;“修正”表示修正了错误的期望值和/或错误的浏览器实现。我(高兴地)同意浮动/清算有替代方法,但是没有内在的缺陷固定方法。
Tim Medora

10
@Alex-是否有一种非hacky,跨浏览器兼容的方法来删除位于单独行中的行内块元素之间的空格?我希望能够停止使用浮点数,但是我可以找到的关于此问题的最佳链接(此处此处)并不令人满意。您提到了white-space物业-您能解释一下吗?
antinome

3
@Alex-谢谢,这非常酷,但是我仍然发现float-with-modern-clearfix方法更具可维护性,因为如果有一天我碰巧letter-spacing在CSS的其他地方进行自定义,它不会中断。
antinome

1
为什么引导程序仍将float用于其网格系统?那些不是布局吗?
AzDesign 2014年

2
请记住,内联块会在元素周围添加空白。如果您将其用于网格,或者不希望有此空白,则必须添加额外的样式/ HTML技巧来解决此问题。请参阅:css-tricks.com/fighting-the-space-between-inline-block-elements/...
kretzm

23

虽然我同意总体上inline-block会更好,但是如果您使用百分比宽度创建响应式网格(或者如果您想要像素完美的宽度),则需要考虑一件事:

如果您要使用inline-block总宽度为100%或接近100%的网格,则需要确保HTML标记的column之间没有空格

使用浮点数时,您无需担心-列浮于列之间的任何空白或其他内容上。该问题的答案提供了一些在不使代码变得丑陋的情况下删除HTML空白的好技巧

如果由于某种原因您无法控制HTML标记(例如,限制性CMS),则可以尝试此处介绍的技巧,或者您可能需要妥协并使用浮点数而不是内联块。还有一些丑陋的CSS技巧,仅应在极端情况下使用,例如font-size:0;在列容器上,然后在每列内重新应用字体大小

例如:


有没有可能的解决办法,可能div+(whitespace) {display:none}是什么之间的无空格?
NoBugs 2015年

1
请参阅第一句后的第三段...尤其请参见链接的问题
user56reinstatemonica8 2015年

@NoBugs只需应用font-size:0; 到包含的元素,只要注意是否在行内块中的元素上设置了特定的字体大小!
2015年

@Jai确实,由于样式/视图应与创建html / model的过程脱节,所以这是一个不好的做法。(如果您使用提供给您的服务怎么<div class="inlinething">hi</div> <div class="inlinething">there</div> more content here... 办?)
NoBugs 2015年

4

如果要div精确地将其与像素对齐,请使用float。inline-block似乎总是要求您切掉一些像素(至少在IE中)


6
是的,这是因为您必须避免在元素之间使用空格,因为内联块与内联元素的考虑方式相同。保持内嵌广告代码彼此紧紧相连,并且像素没有问题。
Ben Sinclair 2014年

同样,这也可能是浏览器的不同,在元素上使用默认的填充/边距。.至少在过去,我一直这样做,* {padding:0px; margin:0px; }因为这有助于平衡我的编码
Angry 84

这是Bootstrap(也许是其他人)使用它而不是内联阻止的原因吗?
NoBugs 2015年

1

您可以在这里找到详细的答案。

但总的来说,float您需要了解并照顾周围的元素和inline-block简单的元素标注方式。

谢谢


1

关于内联块,有一个特征可能并不直接。那就是CSS中垂直对齐的默认值为基线。这可能会导致某些意外的对齐行为。看这篇文章。

http://www.brunildo.org/test/inline-block.html

相反,当您执行float:left时,div彼此独立,您可以轻松地使用margin对齐它们。

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.