CSS run-in 显示值

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费额度!

CSS 对于 display 属性有一个名为run-in的值。 就像这样

h3 {
  display: run-in;
}

目的是允许标题运行到其下方的文本中,而不会牺牲语义或遇到使用其他布局技术强制执行时可能遇到的问题。

让我们仔细看看。

但是为什么不 __________?

但是为什么不将其浮动到左侧? 嗯,标题的字体大小通常大于正文类型。 因此,如果您将标题浮动到左侧,则可能会捕获多于一行。

但是为什么不将其设为内联元素? 因为后面的文本可能(实际上,很可能)位于段落标签内。 段落标签是块级标签,因此如果它们跟随内联元素,则会换行,并且效果将无法实现。 您可以将<h3>标签插入到<p>标签,但这会带来语义问题,更重要的是,会带来长期维护问题。 如果这种效果过时了怎么办?

但是为什么不使用内联块? 与上面相同的问题。 除非您将标题塞入下面的段落中,否则效果将无法实现,这存在问题。

那它是怎么工作的呢?

如果一个 run-in 元素在块级元素之前,则 run-in 元素在结构上表现得好像它已成为块级元素的第一个内联子元素。

浏览器支持

没怎么听说过这个? 嗯,这可能是因为浏览器支持有点奇怪。

有传言说 Mozilla 规范 不满意。 Firefox 完全不支持它,包括版本 4 测试版。

WebKit 系列(Safari 和 Chrome)以及 Opera 和 IE 8 都支持它。 不过,这些浏览器处理方式存在一些差异。 据报道,较旧版本的 WebKit 和 Konqueror 允许 run-in 元素运行到后续的内联元素中,这是不正确的。

规范中的问题?

在我自己阅读规范的过程中,我发现它有点不清楚。

如果一个兄弟块框(不浮动且未绝对定位)跟随 run-in 框,则 run-in 框在结构上变为块框的第一个内联框。

这很有道理,并且似乎就是这样工作的,但是“成为第一个内联框”是否意味着 run-in 框应该成为块框的后代? 在 WebKit 中,run-in 元素保持其独立性

run-in 不能运行到已经以 run-in 开头或本身是 run-in 的块中。

这是否意味着不能有两个标题,都是 run-in,运行到下面的段落中? 这就是我阅读的方式,但我认为 WebKit 的实现,其中它们都位于内部,更有意义。 Opera 和 IE 8 遵循规范,即第一个 run-in 变成块,第二个变成内联。

然后它说

否则,run-in 框变为块框。

否则是一个很大的词,但实现在这里一直都很好。 在父级中连续三个 run-in? 它们都变成块。 夹在两个内联元素之间的 run-in? 它变成块。 run-in > 绝对定位 > 块,run-in 变为块。 我知道这让人难以理解,但当前的现代浏览器在这里做得很好。

如果 run-in 元素包含任何块级内容,则它将变为块级。 所有浏览器似乎都同意这一点。

演示

这是我自己的简单演示页面。 还有一个超级硬核演示(已有 10 多年的历史)。