最近我在 Twitter 上看到这个问题出现了几次,然后 一个有趣的 Dabblet,所以我认为记录下来很重要。
问题是这样的:一系列按照正常 HTML 格式编写的 inline-block
元素之间会有空格。
换句话说
<nav>
<a href="#">One</a>
<a href="#">Two</a>
<a href="#">Three</a>
</nav>
nav a {
display: inline-block;
padding: 5px;
background: red;
}
将导致

我们通常希望元素紧挨着彼此。在导航的情况下,这意味着避免了尴尬的小型不可点击的间隙。
这不是一个“错误”(我认为)。这只是在同一行设置元素的工作方式。您希望在键入的单词之间有空格,对吧?这些块之间的空格就像单词之间的空格一样。这并不是说规范不能更新为说明内联块元素之间的空格应该为空,但我相当肯定这是一个巨大的麻烦,不太可能发生。
以下是一些解决间隙并使内联块元素紧挨着彼此的方法。
移除空格
出现空格的原因是,您在元素之间有空格(换行符和一些制表符算作空格,需要明确这一点)。最小化的 HTML 将解决此问题,或者以下技巧之一
<ul>
<li>
one</li><li>
two</li><li>
three</li>
</ul>
或者
<ul>
<li>one</li
><li>two</li
><li>three</li>
</ul>
或者使用注释…
<ul>
<li>one</li><!--
--><li>two</li><!--
--><li>three</li>
</ul>
它们都非常奇特,但确实有效。
负边距
您可以使用 -4px 的负边距将元素移回原位(可能需要根据父元素的字体大小进行调整)。显然,这在旧版 IE(6 和 7)中存在问题,但如果您不关心这些浏览器,至少可以保持代码格式整洁。
nav a {
display: inline-block;
margin-right: -4px;
}
跳过闭合标签
HTML5 无所谓。虽然你必须承认,这感觉很奇怪。
<ul>
<li>one
<li>two
<li>three
</ul>
将字体大小设置为零
字体大小为零的空格…宽度为零。
nav {
font-size: 0;
}
nav a {
font-size: 16px;
}
font-size
来将其恢复。直接使用浮动
也许它们根本不需要是内联块,也许它们可以被以某种方式浮动。这允许您设置它们的宽度、高度和填充等。您只是不能像使用 text-align: center;
对 inline-block
元素的父元素那样进行居中。好吧……您可以做到,但 它很奇怪。
直接使用 Flexbox
如果 浏览器支持 对您来说是可以接受的,并且您需要从内联块中获得的是居中,您可以使用 Flexbox。它们并不是完全可以互换的布局模型,但您可能会从中获得所需的内容。
查看
示例 在 CodePen 上
我总是使用负边距方法,但浮动方法,尽管很简单,对我来说却很有帮助。
我也是,负边距.. 很酷,谢谢。
@Landis 和 @Julian:你们可能需要重新考虑负边距技术。 这是一个例子,说明为什么。最好使用不依赖于零空白的设计。如果必须这样做,请使用注释方法或不要在元素之间使用回车符。
我也使用负边距,认为这是最好的,因为您实际上是在调整元素的位置。使用 left: -5px; 可能是个好主意,但当然,这会带来各种可怕的风险。
在一行中使用所有 li,那么神奇的边距就不会出现,实际上,当你编写 html 代码并在每个 li 之后回车时,新行就会产生神奇的边距
谢谢
Shaban Khan
UI/UX 工程师
我也是……总是负边距。
那个 0px 字体大小的技巧看起来很酷…
省略闭合标签就像在海滩上裸奔一样。哇!我也使用负边距
我不知道在海滩上裸奔会不会很有趣
我也一直使用负边距方法,但我可能会开始使用字体大小技术——它看起来太简单了,不容错过。
负边距一直是我使用的方式——它保持语义、代码结构并使“修复”与对象直接相关。
所有其他技术要么修改底层代码,要么创建我(或使用我的代码的其他开发人员)需要注意的关联。
YUI 3 CSS 网格 在其网格容器上使用
letter-spacing
和word-spacing
来折叠网格单元之间的空白。http://yui.yahooapis.com/3.5.0/build/cssgrids/grids.css
我也使用这个技巧,我发现它迄今为止是最好的。
如果你想在任何子元素中使用
ems
或%
,那么font-size: 0
是一个完全不可用的解决方案。它在Safari 5.0中也不起作用。浮动也不是理想的方案,因为当尝试对齐不同行高的内联块元素时,它们会弄乱垂直基线。此外,你还需要清除它们。
Bootstrap可能也有同样的问题。并且它运行良好……
不,bootstrap 使用浮动
Firefox 中的浮动存在此错误,因此最好将字母间距分离到仅限 Webkit 的浏览器中。
附言:我已于 2011 年 9 月向 webkit bugzilla 提交了错误报告。我希望他们最终能修复它。
此解决方案并非万无一失,因为它依赖于三个假设:空格的宽度等于 0.31em(对于 Arial/Helvetica 几乎正确,但对于 Times New Roman 等则不正确),防止单词重叠的负字间距限制(对于 FF 和 IE8+ 为真,Opera 几乎为真,但 WebKit 和 IE7- 为假)以及WebKit 错误,即字间距对于内联块完全被忽略。当此错误被修复时,内联块将被稍微“压缩”,因为字间距过大,并且第二个假设在 WebKit 中失效。
只是说...我已经使用 YUI 网格系统一年多了,并且没有遇到任何问题。我已经测试过市面上几乎所有的网格系统,而 YUI 系统因其轻量级、可靠性和响应性(经过修改)而脱颖而出。这是我的版本...用于响应式布局...使用速记...转换为公分母。基本上,您可以省略类名中的“yui-3-”部分,网格单位为“基数 24”,例如:.u-4-24、.u-6-24、.u-18-24 等...或者如果您喜欢使用计算器,您仍然可以使用雅虎的原始名称。
我们也可以在父元素上使用“word-spacing: -4px;”,效果就像在 li 元素上设置负边距一样。
Sreejesh KV,这样的解决方案肯定比负边距好 :) 特别是在需要将元素左对齐的情况下,负边距方法会将第一个列表项也进行偏移。
我过去处理此问题的方法是,不使用
:first-child
选择器对第一个元素应用偏移。浮动,这里很多人建议使用,会使元素变为块级,那么它们就不再是内联块了)。这是一种作弊))))
是的,你说得对。这就是我更喜欢“word-spacing”方法的原因。
是的,这就是关键。干得好。
如果是导航栏,只需将这些东西浮动起来。至少在所有浏览器中都能正常工作,并且不会使用疯狂的字体大小技巧或不神圣的未闭合标签等。也许我只是老派了……
这正是我想说的。
我所知道的唯一一种执行居中导航(在不知道最终宽度的情况下)的方法是使用
ul { text-align: center; }
和li { display: inline-block; }
所以像这样的技巧非常必要。
很棒的技巧,我也使用负边距技术
我总是使用浮动方法。这样,你就可以绝对控制你的 HTML。
我使用浮动,因为我找到的所有关于制作导航栏的教程都使用了浮动,它很简单并且有意义。我甚至不知道还有其他方法,并且认为浮动是正确的方法。
在处理其他人的代码并且他们以其他方式完成时,了解其他选项很有趣。
我只是不喜欢省略闭合标签的想法,并且不希望处理省略闭合标签的代码,仅仅因为它们可以被省略。我并不是为了浏览器而添加这些闭合标签,它们是为了我阅读代码时使用 :-)
所以这个问题被称为“自行车棚”,并且在 CSS3 中将有一个属性来修复此问题,因为规范要求这样做。所以归根结底,正如 Chris 所说,是元素之间的空格。所以你可以这样做
<ul><li>one</li><li>two</li><li>three</li></ul>
但这使得代码难以管理。我的发现导致了我认为Geert De Deckere发布的是解决此问题的最佳方法。
据我所知,此属性已重命名为“white-space-collapse”
负边距在这里不起作用(Linux 上的 Firefox 13)
元素之间仍然存在一个像素的空白。
(你是如何确定在我的字体中空格恰好为 4px 的?)
我在 Linux 上的 Firefox 11 上也看到了同样的情况。
负边距方法*非常*不可靠:-4px 仅适用于一个特定系统上的一个特定字体大小。使用 em 值似乎可以在系统之间工作,尽管我现在忘记了确切的值……
很棒的文章..我偶然发现了这种类型的列表,但不知道原因..现在我知道了 :) 希望你不介意我在我的博客中写下这个技巧..更不用说,我将有一个反向链接到这篇文章 ;) 太棒了
感谢你的解释。我经常遇到这个问题,但直到现在才找到任何关于此的文章。我确实使用了浮动元素,它可以工作,但本文中提到的其他解决方案听起来也很棒。
谢谢。
我使用浮动而不是内联块,原因与 Daniel 和 ian 完全相同。为什么要使事情变得比必要时更复杂呢?
但是,对于那些需要它们的人来说,这些解决方法仍然很棒!
当我在同一行上放置一堆东西时,我通常也会将代码放在同一行上。从技术上讲,它可能没有那么语义化,但它适合我的思维方式。
只要我的链接不太长,它仍然很容易阅读,但它也解决了空格问题,并且由于它无论如何都会水平显示,所以我实际上更喜欢水平编写它。也许我只是很奇怪。
不错的帖子,Chris。
过去,我在父
ul
上使用font-size: 0;
并在li
上设置正确的字体大小方面取得了巨大的成功。不过,我只在列表项需要居中时才使用此方法。对于其他所有内容,我都使用浮动块。对于那些说你们只使用浮动的人,你们如何处理居中可变数量的可变宽度块?内联块对于这种情况非常方便,但如果有一种方法可以用浮动来做到这一点,我很想知道如何做到。
如何将 UL 设置为内联块,并在其父元素上设置文本对齐居中,然后在 UL 内部浮动 LI?
nav {
width: 100%;
text-align: center;
}
ul {
display: inline-block;
}
li { float: left; }
foo
bar
它在 JSFiddle 中
http://jsfiddle.net/kpadx/
这比我的解决方案好多了
http://jsfiddle.net/kpadx/27/
Tom,那个方法看起来很棒!
我认为将字体大小设置为 0 是这里最优的解决方案,也是最简洁的。
不幸的是,Windows 版 Safari 存在一个问题,即
font-size:0
不尊重空格,导致在父元素上设置字体大小的原本最简单的解决方案失效。Css 将是
只要你不关心对 Windows Safari 的支持,这种方法就可以工作,并且在所有其他当前支持内联块的浏览器版本中都将得到支持。
正确的方法是移除 HTML 标记中的空白字符,无论你认为哪种方法看起来最好。
我更喜欢
我不能说我知道任何关于移除代码中空白字符的好标准,所以我不认为这是对或错。
由于这不是一个错误,而是浏览器将块级元素渲染为内联元素,因此它们正确地解释了代码中的空白字符。
哇,哈哈,这篇文章引起了很多关注。我的收件箱里收到了 100 封电子邮件通知。给你一个笑脸 :-)
感谢你的精彩文章!
省略标签的想法从 2008 年就开始流行了……
http://meiert.com/en/blog/20080601/optional-tags-in-html-4/
Paul Irish 最近也提到了这一点……
http://paulirish.com/2011/primitives-html5-video/
在 15 年来一直痴迷于关闭所有标签后,省略闭合标签的想法让我有点不安 :) 但这种不安很快消失了。
对我来说,代码越少越好。而且它还可以追溯到 IE6。
也就是说,做让你和你的团队最开心的事情。
根据我的经验,这种方法在跨浏览器方面效果很好,无需设置绝对像素的字体大小。
我在 jsfiddle 上的一个内联块布局演示中使用了此技术。
我使用过负边距,但由于它在 IE 6 和 7 中会失效,并且可能对右侧的内容造成问题。
字体大小看起来很酷,可能不会中断。
这太棒了,非常感谢。
我个人总是使用浮动元素来移除空白字符,尽管如果由于某种原因无法实现这一点……我会烦躁我的吹毛求疵,并简单地将所有 LI 标签放在一行上,HTML 注释似乎是一种更好的方法。
我一直想知道其他人是如何处理这个“错误”的。
很久以前做过太多 IE6 的样式支持,所以从未熟悉内联块。一直使用浮动,并且静态主块(页眉/导航/页脚)始终单行/最小化。
另外:使用 HTML 注释时,注意重复字符错误http://www.positioniseverything.net/explorer/dup-characters.html
那些日子真是令人怀念!
感谢你记录下这些,Chris。
我用 `display: table` 尝试过,并想出了一个解决方法,你可以在这里查看。
基本上,你对父元素定义 `display: table`(在你的第一个示例中,这是 `nav`)。如果你想将子元素居中对齐,你需要为父元素定义宽度,但这并非在所有情况下都可行。
也许这在某些时候会派上用场。
Pete B,你的想法绝对值得一试!
有趣的是,我多年来一直都在使用内联块方法,而且很少担心空白字符问题。我只是不设计依赖于元素之间零间距的布局。
当我确实需要担心它时,我会使用注释方法或根本不在元素之间换行。无论哪种方式,修复方法都比大家想象的要容易得多。
我避免使用所有 CSS 方法,因为浏览器之间存在不一致性。我也不确定 Chrome 是否允许零字体大小,至少以前不允许。负边距也应该会带来问题,因为并非所有浏览器都以完全相同的方式计算空白字符。
在我看来,长期使用内联块后,最好避免依赖于零空白字符的设计(这比你想象的要容易),或者只使用注释方法或不换行。
我也认为最好使用 HTML 方法(不换行或 HTML 注释),因为每种 CSS 方法都依赖于浏览器的不一致性,这众所周知,不是非常可靠。
虽然我从未遇到过这样的问题,但我猜我会使用不换行的方式。似乎不太麻烦。
负边距方法本质上不是像素完美的。
浮动受到限制(不能像内联元素一样换行,也不能轻松居中)。
注释会造成垃圾代码,并在 IE7 中导致 `:first-child` 伪类和相邻同级组合器出现问题(不过有一个JS 解决方法)。
省略闭合标签在某种程度上是非语义化的,因此不适合一些完美主义者(像我这样 ;-)。
零字体大小技巧目前可能是最实用的。顺便说一句,使用它时,为子元素使用 `rem` 单位字体大小以保持布局对 em 敏感是有意义的。`rem` 表示文档根元素(HTML 文档中的 `html` 元素)的字体大小,并且所有浏览器的当前版本都支持此单位(包括 IE9)。像素字体大小值可以同时使用(在 `rem` 单位值之前)作为旧浏览器的回退。
它在语义上与在下一个同级元素的开始标签或父元素的结束标签之前直接放置结束标签完全相同。它生成相同的 DOM 树(在项目之间没有文本节点)。当然,第一个选项与 XML 不兼容,但这仅仅是语法问题,而不是语义问题 :)
补充说明:非常感谢你提出使用 rem 单位来恢复在零字体大小技巧后调整内联块字体大小的能力的想法!
另一个有趣的选项是使用自定义字体,其中常规空格字符的宽度为零(如建议在关于此主题的优秀的俄罗斯文章的评论中)。
@SelenIT:是的,在 HTML5 中省略闭合标签在形式上是有效的,但对我来说是不可接受的,因为我认为 HTML 语法的这部分在其设计中是一个很大的错误,因此我无论如何都不会使用此“功能”。我更希望 HTML 文档在语法上是独立的,通常无需任何标签名称字典来解析它。如果你不是像我这样的完美主义者,那也没关系。 ;-)
如果你使用 HAML 或其他类型的 HTML 预处理器,你可以在编译时对其进行最小化。然后你的 HTML 将被最小化,这始终是好的。
我正要这么说!压缩/最小化 HTML 不是最佳实践吗?
我只是将它们浮动,将它们放在一个 div 中,并将 div 的位置设置为相对,设置其宽度并设置边距为自动(以便它们可以居中)。
建议使用 `margin-right: -.25em;` 而不是 `4px`。
你从哪里知道单个空格的大小是 0.25em?
在哪里可以找到关于这方面的参考?
@Taurif 我几乎可以肯定,间距取决于使用的字体以及浏览器如何显示该字体。由于这种不确定性,负边距方法不太可靠。
我建议使用注释方法,避免元素之间的换行符,或者只是避免设计依赖于零空白字符的元素——这比你想象的要容易。
哦,所以如果我将字体大小设置为 `1em`(例如),则单个空格的大小为 `0.25em`,因此当我将字体大小更改为 `2em` 时,则单个空格的大小可以近似为 `0.5em`。
当然,我更愿意使用注释或拆分标签方法。我只是想了解更多 :)
@Taufix 我不认为这是完全正确的。当某种类型的字体在元素之间触发一个大小为 0.25em 的空格时,那么即使字体大小增加,它也*应该*保持 0.25em。Em 是相对度量,它们随字体大小缩放。
问题在于它实际上并不是这样工作的。不同的字体可能有不同的间距规范,所以对于一种字体它可能是 0.25em,而对于另一种字体它可能是 0.2em。当你放大字体时,情况会更糟。然后,原本完美的布局可能会被破坏。
我做了一个演示,你可以在这里查看:jsFiddle负边距技巧。你也可以在这里看到 Firefox 与 Chrome 的区别:Chrome 与 Firefox 的空格渲染。
是的。等宽字体解释了一切!!!
非常感谢!
我会避免使用像素 (PX) 单位进行测量,因为空格是基于单个空格字符的。我使用以下方法来轻松解决整个问题。
它非常棒,几乎完美无缺。
我就是不明白。为什么要处理所有这些 CSS 技巧?你知道什么方法是 100% 万无一失的吗?使用注释方法或在列表项之间不使用回车符。其他任何方法都是对浏览器不一致性和大量变量的徒劳抗争。或者,也许我只是疯了 :P
负边距解决方案实际上并不准确,确切的数值取决于字体大小和字体系列。有些字体系列确实有精确的空格,比如 Courier New。我之前写过关于这方面的内容,尽管我不推荐我当时提出的解决方案,它太复杂了。现在我使用负边距(但出于显而易见的原因,我使用 em 而不是 px),并且我不太关心像素的完美性。这是我的复杂解决方案:http://nerd.vasilis.nl/remove-whitespace-inline-block/
做导航栏的时候,我过去经常遇到这个问题,意识到问题所在后,我真是懊恼不已……
负边距技巧可能取自我的 CSS Box 框架 https://github.com/vladocar/Box-CSS-Framework/blob/master/box.css,至少我认为我是第一个“发明”这个技巧的人。
负边距不是万无一失的解决方案,但在构建 CSS 框架时,它可能是最简单、最优雅的技巧。
通过双倍字体大小调整可以获得更好的效果,但这种解决方案更难实现,并且是代码特定的。
在我看来,删除关闭的
</li>
标签不应该解决此问题(即,空格不应该消失)。由于 HTML5 允许省略关闭列表项标签,则应保留空格。省略关闭标签应该与包含它们的结果完全相同。我想它假设元素彼此紧挨着,但这似乎不对,特别是如果新的列表项从下一行开始。我认为这是所有浏览器的错误,应该报告。也许我错了,但我的反应是,空格应该与包含关闭标签时相同。
空格确实保留了,但作为元素中的单个空格。
当出现下一个 (或元素时,该元素将关闭。
因此(尤其是在有较大填充的情况下),这并不(容易)可见。
抱歉发布了乱七八糟的内容。
“当出现下一个 <li> 或 </ul> 元素时,该元素将关闭。”
哇,我今天早上才遇到这个问题,我通过给 设置 102% 的宽度来解决它
但这个解决方案让人不太舒服!
我现在要尝试你们的建议了
谢谢!
这非常有用,谢谢
负边距方法在 Firefox 中无法正常工作。两个 li 之间存在 1px 的间隙。
对我来说,`font-size: 0` 似乎是最好的。其次是奇怪的 HTML 格式,因为即使它看起来很奇怪,它仍然是完全正确的,并且不会添加任何额外的标记或样式技巧。
非常有用的文章,谢谢!
修复它的技巧非常简单!我喜欢 HTML 5 选项的简洁性,
很棒的文章!
对我来说,浮动 (Float) 是最好的选择。
顺便问一下,内联块 (inline-block) 不建议使用吗?
多年来,我一直专门使用内联块方法,从未遇到任何问题。大多数人没有意识到,你花费的大部分跨浏览器调试时间都是*因为*浮动。
使用内联块,可能会出现两个问题(本文解决了其中一个),它们是可以预测的,并且它们的解决方案很容易。这应该是不言而喻的。
浮动从未设计用于页面布局。出于此目的使用浮动是一种技巧。内联块是*页面布局的*方法。
一个很好的解释。谢谢 Justin。
我一直避免使用内联块,因为 IE 浏览器的问题,并且讨厌使用缩放修复。
奇怪的是,Facebook、Youtube、Twitter 在这篇文章中使用了浮动,而 Twitter 使用浮动来布局页面。Google 几乎在所有地方都使用内联块。
你说得对。几乎所有开发人员都使用浮动而不是内联块。这让我很长时间都感到困扰。我认为这只是习惯使然,没有人站出来,踢他们屁股,告诉他们打破它。
我已经尝试多年宣传这个观点。我甚至对此感到厌烦,我写了一个 jsFiddle,试图提供一个链接,我可以将其放入类似这样的评论中:http://jsfiddle.net/Cerebrl/ZkQnD/
如果你的主要抱怨是使用缩放,那么别担心!只需将其放入一个正式的 IE 条件语句中,你就完成了(请参阅我的 Fiddle)!这个非常非常简单的解决方法可以使内联块一直工作到 IE6,并且仅呈现给需要它的浏览器。对于其他所有浏览器,它只是一个注释。
当我切换到内联块时,我的开发时间大大减少了。我的跨浏览器测试非常容易,一切都按预期进行,世界是正确的。
空格问题并不像人们想象的那么糟糕。只需尝试避免需要零空格的设计;这比你想象的要容易。如果你确实遇到了需要零空格的情况,只需使用注释方法或不要在元素之间放置换行符。
最坏的情况,只需使用浮动,但我会告诉你,我很少使用浮动,以至于我几乎忘记了如何清除它们 :)
一项公益服务公告!=D 太棒了!因此,我将在我的下一个项目中尝试完全放弃浮动。
在其他情况下,没有结束标签的 HTML5?W3C 和 WHATWG 的一个愚蠢的举动。
“犯了错误?忘记关闭标签?不用担心!HTML5 会为你关闭它们!”
除了这件事,他们还有其他事情要做吗?
可选的结束标签不是新发明。它们是 HTML2-4 长期支持的功能,已在所有现有的浏览器引擎中实现。WHATWG 和 W3C 只需要在新标准中记录这一现实,因为其设计原则如“铺平牛道”以及需要向后兼容现有内容和浏览器。
事实上,可选标签是 HTML 的一大优势,因为它们只是提供了几种正确的方法来标记相同的健壮且可预测的 DOM 结构。例如,你可以始终确保任何
TABLE
元素至少有一个TBODY
子元素,任何其他选项在设计上都是不可能的。使用“严格”的 XML 解析,情况并非如此,在 XHTML 中,我们可以有table
没有tbody
以及有tbody
。那么什么才是真正“更严格”的呢?由于这个“错误”,我几乎总是使用浮动而不是内联块(还有一点是因为 IE7),但前者感觉“不对”。浮动不是为了导航或类似的东西而设计的,内联块绝对是应该走的路。关于间隙,我将来肯定会看看字体大小的技巧。看起来相当不错。
我更喜欢关闭标签之间的空格。它并不总是很漂亮,但它最接近所需的行为——没有空格。负边距总是在某种程度上感觉不对,边距在定位所有布局方面有很多作用,我从未将它们视为非常优雅的解决方案。我认为字间距/字母间距将成为最佳选择。
我喜欢字体大小的技巧
非常感谢这个,它澄清了我过去的一些困惑时刻。您可能应该使用em而不是px作为负边距选项。
这篇法语帖子关于不需要的空格主题非常好。
谈论rem、字母间距、空白和未来:text-space-collapse。
我总是使用字体大小技巧,它简短有效。
http://www.alsacreations.com/astuce/lire/1432-display-inline-block-espaces-indesirables.html
*忘记链接了!
还有以下CSS属性
white-space-collapse: discard;
但是我认为没有任何浏览器真正实现它:(
我更喜欢jQuery方法,因为它与字体无关。最近在网上看到过。不知道是否有人已经提到了这一点。
例如,如果某个容器内部包含内联块元素
$(‘#container’).contents().filter(function() { return this.nodeType === 3; }).remove();
仅当文本节点仅包含空白字符时才删除它们
底线:您有很多技巧,但没有合适的解决方案。字体修复还不错,其他修复可能以后会适得其反。
我不介意这类文章,但最好警告人们在使用某些“修复”时会遇到的麻烦。
我总是使用内联块,非常有用,我可以使用text-align属性确定子元素的对齐方式,居中、左、右
这个小空格是唯一的问题,我使用缩进方法来解决这个问题。
PS:请原谅我的英语语法
我尽量总是使用内联块,因为它在某种意义上比浮动更语义化,而且它不会破坏任何流程,也不需要添加clearfix之类的东西。
因为我通常在框架中开发,或者至少不是纯HTML,让我的代码输出内联,因为它不会输出标签之间的空格或换行符,并且它也“压缩”了一点=D
对于那些说我的代码变得难以阅读的人,我通常使用任何可用的开发工具(通常在Chrome中,但也可以在Firefox中使用firebug),它会自动转换和清理HTML。而且我的输出HTML的代码格式非常好。
所以对我来说这是最好的解决方案,我并不太关心不支持内联块的浏览器。=P
对于提到的方法
– 打破标签:我真的很讨厌这个..对我来说像是损坏的HTML…我甚至因为这个原因不使用自动换行
– 负边距(或字间距):如果您注意您的字体和字体大小,效果还可以
– 浮动:如果可能,最好不要使用(我甚至尝试在可能的情况下将CSS框架更改为内联块)
– 注释:它适用于纯HTML,任何其他生成HTML的方式都难以编写/维护
很棒的文章,Chris
我很少制作任何依赖于无间距的东西,但当我这样做时,我只是不在列表标签之间放置空格。
在我看来,这是最可靠的方法。
我不喜欢在多行上拆分标签,我更喜欢这种语法
或者这个
第一个正是我所做的!它运行良好且易于阅读。
这就是我一直在做的
…但我认为我更喜欢你的第一个!它看起来更简洁,而且更容易阅读。
顺便说一句,Justin,我完全同意你所有的评论!几个月前我进行了切换,现在我几乎不使用浮动。它太容易了。此外,通过使用上面的HTML语法,我不必处理浏览器不一致性和疯狂的技巧。它只是起作用!与LESS一起使用时,它甚至更容易。我只是这样做
回应上面一位发帖者的话,
如果它是一个导航,只需将这些东西浮动起来……哎呀,为什么在不需要的时候还要增加工作量呢?
我称之为网络创意人员中的“这似乎太容易了,感觉就像我在作弊……”现象。
就像你能想象一下,如果您可以简单地将**border-box**设置为所有内容,而不必像计算填充和边距那样诉诸像素完美的军事精度计算……
不,那太容易了,无法安然入睡……
哈哈,我只是说说而已。但有一些很棒的替代解决方案。我以前没有遇到过负边距。
不关闭LI标签怎么样?
如果您使用的是html(不是XHTML – 重要),那么LI元素(谷歌搜索更多此类元素)将自动关闭并且没有间距(没有空文本节点)
查看http://jsfiddle.net/stryju/6S5N8/以获取解释
嗯…我使用浮动技术…它很简单…
相信我,内联块更简单。我将假设您几乎只使用浮动,很少(或从未)使用内联块,因此,浮动看起来很简单,因为它对您来说很熟悉,很舒适。
内联块优于浮动,并且在几乎所有布局配置中都简单得多。浮动始终需要清除浮动(对于不同的浏览器,我们需要多少个?),并且会导致大多数跨浏览器不一致。这听起来不像“很容易”。
如果您设计正确,大多数时候您根本不必担心空白字符,而当您遇到问题时,它是一个非常简单的修复。Chris上面使用的示例空白字符问题非常容易修复,甚至不必担心空白字符——只需将红色背景放在ul上即可。
就像我说的,只要考虑一下设计,您就可以毫无顾虑地使用内联块。一旦您“转换”过来,您的开发时间将显着减少。
@Justin,如果我们将父元素设置为overflow hidden,则不需要清除浮动,因此不需要清除浮动。我认为有一种设计需要像素完美,那就是我发现浮动更好的地方。对我来说也可能更容易,因为我使用了多年的浮动,所以或多或少地了解它在大多数浏览器中的行为。
也就是说,内联块对于不需要像素完美的设计来说是一个非常简单的解决方案,我只在这种情况下使用它。我通常不设计网站(有设计师,我是前端开发人员),所以我只选择最适合他们设计的任何东西。 :)
@Jeffri 我仍然不明白这个论点。像素完美(我假设你的意思是零间距)可以使用内联块来实现。我一直在这样做。只需去除元素之间的空格(要么直接去除,要么使用注释),就完成了。就是这样。
此外,浮动的overflow: hidden方法看起来像一个技巧,因为它肯定不是CSS的逻辑行为。这样做的危险是浏览器很容易将其视为错误并修复它,然后您的布局就消失了。它也不能成为所有/旧浏览器的万无一失的方法。
我使用
font-size: 0px;
LESS 使此方法成为最有效的方法,恕我直言,因为使用 LESS,您无需担心可能出现的相对字体大小问题。
我们使用不同的东西,直到我们开始“HTML压缩”,它会删除所有空格以缩小HTML文件的大小,因此我们不再担心这些额外的空格。
使用
* {
margin: 0;
padding: 0;
}
省略结束标签看起来对我来说是最优雅的解决方案(尽管我甚至没有意识到它被允许!)。奇特的格式和多余的CSS感觉很笨拙。
谢谢Justin。我一直是浮动派,我想我确实需要切换。我相信使用媒体查询完成的填充/手机网站是通过内联块成功完成的。
不客气。很高兴能帮上忙!是的,考虑到网页设计中现在存在的大量变量,不再仅仅是桌面端的Webkit、Mozilla和IE,还有大量移动浏览器,我们需要万无一失的方法来确保我们的设计不会出现问题。
由于浮动元素本质上是有问题的,因为它们被移出了文档流,不同的浏览器必须决定如何渲染它们以及它们与其他元素的交互方式。使用遵循传统文档流顺序的内容更有意义,这样解释的成本就会低很多。希望这能帮助你未来的开发工作。
Justin干得好:) 我喜欢这部分“跳过结束标签”
我正在使用以下代码。
ul {
word-spacing: -1em;
display: table;
display: block\9; /* IE8、9的悬停bug */
width: 600px;
}
li {
word-spacing: normal;
display: inline-block;
vertical-align: top;
/display: inline;
/zoom: 1;
width: 100px;
}
最简单的解决方案是将所有内容都设置为内联。
为什么人们害怕“移除空格”技术?我们不应该压缩HTML来移除不必要的空白吗?
我无法阅读所有回复(太多了!),但负边距修复在Chrome上也不起作用!!(Chrome 18.0.1025,Mac OS X 10.7.3)
我知道负空间和浮动方法。但是,我学到了字体大小为零的方法。
正如你之前所说,使用负空间会在IE中导致问题。使用浮动,我们可能需要使用一些额外的、不必要的HTML来清除浮动,例如
<div class="clear"></div>
。但是,使用字体大小为0,只需要做一件事。
谢谢Chris
值得一试……
好吧,我只是更改了HTML标记。
如果设置为display: inline-block,就会出现空格,但是,我的代码中没有空格,所以屏幕上也没有空格。
我最近经常使用inline-block,所以我在所有地方都使用这种代码结构,比CSS hack或其他方法更有帮助。
如果你不希望单词之间有空格,只需在HTML中移除它们即可。内联块之间的空格没有什么不同。负边距只是一个可能会在以后导致问题的hack。
如果你的视图只回显HTML并且没有前导或尾随空白,那么在HTML中移除空格非常简单。这就是我的做法。
很棒的话题。内联块元素有点棘手,很高兴看到移除空格的不同方法。
但是,内联块根本不复杂。这就是我发现整个争论如此奇怪的原因。它们再简单不过了。如果你不想要空白,就在标记中移除它。就这么简单。
http://jsfiddle.net/mJjCc/
相关代码
虽然0=0rem,但在这种情况下使用后缀可以保护不支持rem的浏览器。虽然负的字间距无法修复所有浏览器,但它似乎也没有造成任何损害。通过组合这些规则,我们应该能够消除许多现代浏览器中不需要的空格,以及一些旧的浏览器。
正如你从我之前的评论中看到的,我最近开始着手解决完全相同的问题。我今天有时间对我的代码进行了一些跨浏览器测试。我编写内联块折叠空白修复的代码参数是
– 不重置字体的像素。
– 不针对不同的字体和/或浏览器计算负边距。
– 应用内联块,但普遍、不显眼地跨浏览器和平台移除它们之间的空白。
我相信我在这个jsFiddle中成功地满足了这些要求
http://jsfiddle.net/jTSnd/
以下浏览器经过测试并按预期执行
– IE 6、7、8
– Opera 11.01 Windows
– Opera 11.64 Ubuntu
– Chrome 19 Windows
– Chrome 19 Ubuntu
– Safari 5.1.7 Windows
– Firefox 12 Ubuntu
– Firefox 10 Windows
以下是相关的CSS
我总是使用负边距方法,但浮动方法也很简单。感谢你的分享。
如果你想要一个元素在左边,一个元素在右边,那么浮动更好——除非你知道它们之间的宽度来添加边距。
内联很棒,但有时你需要内联块,而IE6和7可能难以处理它,即使使用zoom,zoom在当时可能也不合适。
如果字体大小发生变化并且你需要像素完美,那么使用任何类型的负边距都将在未来造成麻烦。而且在我的经验中,添加的间距是在上下面。
字体大小看起来是一个不错的解决方案,但我想知道如果Google看到font-size:0会怎么做?
很想能够使用浮动但仍然将内容居中对齐。除非我误解了,否则示例http://jsfiddle.net/kpadx/只是使用填充来实现效果,而这依赖于知道宽度?
使用内联块时,将元素左对齐、右对齐或居中对齐非常容易。只需使用text-align!内联块的行为与文本字符相同,因此text-align可以完美地操作它们的位置。
我甚至展示了如何使用一个左对齐,一个右对齐。请参见此处:jsFiddle
IE6和IE7可以完美地使用内联块,但你必须同时使用display: inline;和zoom: 1; 最简单、最不hack的方式是使用IE7及以下版本的条件注释,并将所有内联元素复制到一个style标签中,并赋予它们必要的属性。
我在这里有一个示例,只需查看HTML:jsFiddle
希望这有帮助。内联块是一个非常棒的东西,但由于我们长期以来一直沉迷于浮动,许多人对这个属性不够熟悉以至于无法欣赏它。
如果我不得不修改你的代码,Justin,以修复或更改你的元素,我会非常恼火。我不想一遍又一遍地搜索下一个开始/结束标签在哪里——更不用说处理动态生成的代码了,在动态生成的代码中调整空白可能比其他任何事情都更像一场噩梦。
那些不停地喊着“只需使用浮动!”的人显然从未尝试过居中对齐文本。
在阅读了所有评论后,我认为可以肯定地说,如果没有各种不一致的hack,就没有干净的方法来实现这一点。
@Nick
哈哈,我多年来一直在与其他开发人员团队一起使用内联块,并且从未因我的代码风格而收到任何投诉(他们通常很喜欢它)。
以下是重点:我很少遇到此处讨论的空白问题,这是因为设计不需要元素之间没有空白的界面很容易。这整个事情实际上是一个伪问题。
如果你在设计时知道将使用内联块,你可以轻松地更改设计方式,以无缝地创建界面,而无需处理不需要的空白问题。我每天都在最复杂的网络应用程序中这样做。
当遇到这个问题时,我只需使用注释方法。而且,它几乎总是在涉及从未动态操作的布局的大部分区域内,因此它从来都不是真正的问题。一旦我开始设计网页或应用程序的内部元素,我几乎总是希望元素之间有填充。
无论如何,感谢你的评论,但我认为你的论点站不住脚。保重。
@Justin,
糟糕的开发者比优秀的开发者多,所以没有人提出这一点并不代表“站得住脚”。我查看了你提供的代码,我已经对它感到恼火了,更不用说在更大的网络应用程序环境中了。
你提到在设计时知道将使用内联块:我当然希望你的意思不是说你正在根据内联块的使用来进行设计,而不是根据UX/品牌/设计的要求来进行设计。
我很想看看你设计“知道将使用内联块”的一些网站示例。
现在有很多开发水平不佳的开发者,所以请原谅我质疑一个技巧的有效性,因为那些走在这些规范前沿的人根本不会浪费时间去使用它。
@Nick
“糟糕的开发者比优秀的开发者多……”
我明白,而且我不和他们一起工作。
“我当然希望你的设计不是基于使用内联块,而是基于UX/品牌/设计的要求。”
我完全没有暗示这一点。我举个例子。许多设计师在构建水平导航栏时,会在li元素上设置背景,因此他们需要零空白来防止出现间隙。为什么不直接在ul元素上设置背景呢?这样,你的导航就不需要零空白了。如果一个li需要悬停状态,只需给该li一个不同的背景,而其他li则不设置背景。
我还看到很多设计师仅仅因为浮动允许他们这样做,就使用浮动,而不是因为这是正确的方法或最佳的方法,仅仅是因为他们可以这样做。这更多的是关于改变你解决设计问题的方式。我*不是*在谈论改变界面的美学或品牌以允许内联块,我是在谈论改变你解决设计带来的问题的方式。
“我很想看看你设计时‘知道会使用内联块’的一些网站示例。”
嗯,我做的很多东西都在保密协议和防火墙后面,但你非常欢迎访问Ka-Prow Bistro查看我为数不多的公开客户之一。
你也可以访问我的Dribbble 账户,查看我的一些作品的快照;访问我的Forrst 账户,查看我的一些设计和开发贡献;在Quora上查看我关于应用开发、UX、神经科学和心理学方面的讨论。
希望这有帮助。
我正在使用
有时,不兼容的浏览器中的字体大小会出现问题。例如,在IE 7-9中
我的朋友们,还有什么替代方案?
这应该可以解决问题
我使用内联块,并将其开始和结束标签紧挨在一起。你仍然可以很好地格式化你的HTML代码,并且它不使用任何技巧。我所做的就是在if语句中,在一个ie6-7文件中包含所有内联块规则作为内联样式。
我讨厌使用浮动进行布局。即使是“浮动”这个名字也暗示着缺乏元素的真正位置和控制。
“你想把这两张沙发放在哪里,伙计?”
“哦,如果你能把它们‘浮动’放在一起就好了。别担心。我会在它们下面放一些无意义且不可见的东西,以便地板知道它们的存在。”
“嗯?什么鬼?!”
是的,又一个理性的声音!谢谢!
有一种简单但不太为人所知的方法可以避免内联块之间的空格,那就是
是的,我知道这很糟糕,但它是目前最快的解决方案。
我知道这一点是因为我遇到了相反的问题,我在服务器端有一个HTML压缩器,它会压缩我的HTML代码。问题是,我需要空格,否则
text-align: justify
将无法工作(在规范中阅读过)!所以是的,删除标签之间的空格可以立即解决问题。
字体大小解决方案,不会丢失父元素的字体大小
负边距在跨浏览器的兼容性方面存在一些问题。
感谢“注释解决方案”和“零字体大小”,你救了我。
我只是想为我的white-space 项目做个不要脸的宣传。有了它,你可以在外部CSS中编写
white-space: none;
。README中有很多信息,所以我在这里就不详细介绍了。简而言之;它修复了你的空白问题。
感谢这些提示。我将我的span元素设置为浮动
感谢这篇文章。
这种格式看起来足够好(特别是如果你有链接而不是纯文本),并且可以完成工作。
实际上,有一种非常简单的方法可以删除空白,既简单又语义化。它被称为自定义字体,其中包含零宽空格。然后你只需更改容器的字体,瞧!这里有一个我刚用font-forge制作的字体的下载链接,其中包含css @font-face声明。根据需要调整。压缩的零宽空格字体(点击文件 > 下载将其保存到你的电脑)
这可能是我见过的解决空白问题的最简单方法。我会在我的当前项目中尝试一下。
好吧,这是一个很好的答案,我等了两个小时才找到空白来自哪里,并且拒绝使用浮动。
谢谢!
哦,天哪!感谢这个话题!!
我从未想过问题出在HTML标签之间的(\n)或(空格)上。
从现在开始我将使用()解决方案=)
天啊,CSS真是一个令人沮丧的媒介。到处都是糟糕的实现和陷阱。
大家好,
有人可以发邮件给我关于如何在Dreamweaver中避免新闻块之间出现空白的链接吗?我知道我使用绝对定位的AP Divs来做这件事是错误的,每次有新故事进来时,我都要向下移动它们。基本上,我选择所有AP divs并移动每个元素,这在页面上有超过10个故事时就显得过于繁琐了。
我使用一个封装在AP divs中的背景图像。有没有办法(CSS或其他)将所有以前的故事向下滑动?希望得到**解决方案**,而不是关于AP divs有多过时的讨论。我还没有找到完美的CSS解决方案。
这是链接 - http://liep2vsk.edu.lv/Aktualitates.php
我建议你首先完全放弃Dreamweaver(它已经不再有用,只是浪费电脑资源)。绝对定位的div并没有什么不好,即使它们很老也没有问题。
但是,你的代码对人类来说是不可读的,考虑到它是用Dreamweaver构建的,它充满了“非人类”的名称,我对此毫无办法。
我从未想过代码中的换行符在渲染时会被算作空白。由于我不能为我特定的标记使用浮动,所以我使用了DRaev的解决方案,因为它看起来很简洁而且非常易读。
感谢这些提示。我将我的span元素设置为浮动
我认为我们应该合作,找到最佳的解决方案,而无需更改代码风格。
据我所知,至少有两种方法
一种是使用自定义字体,其中空格字符的宽度为零;应该可以正常工作,我认为我们可以轻松地添加自定义空白,如果我们已经在通过@font-face使用字体的话。这样,字体就定义了UI的一部分……
另一种是white-space: none; 的polyfill。从未尝试过,但polyfill是解决棘手问题的常见解决方案。
对它们进行一些严肃的、广泛的测试会很酷。
这位仁兄太棒了!移除空格是一个既聪明又愚蠢地简单(至少对我来说)的方法。
我至少欠你一杯啤酒!
谢谢,朋友!你拯救了我的一天 :)
这很简单
我创建了一个用于Jekyll的压缩器。它是一个布局,其中包含大量Liquid代码,在渲染过程中会移除所有不必要的空白字符。它无需外部插件即可运行,因此您可以在Github Pages上使用它。
你太棒了!谢谢。
我注意到“移除空格”下的所有解决方案都会导致html压缩器破坏修复。因此,如果您正在寻找生产就绪的解决方案,则需要考虑这一点。
如果您使用html压缩器,则不会有任何空白字符问题。只有当您的源代码中有换行符时,才会出现问题。