无法在 Safari 和 Chrome (WebKit) 中将 `margin` 添加到 `<legend>` 元素

Posted

技术标签:

【中文标题】无法在 Safari 和 Chrome (WebKit) 中将 `margin` 添加到 `<legend>` 元素【英文标题】:Cannot add `margin` to `<legend>` element in Safari & Chrome (WebKit) 【发布时间】:2011-02-03 20:17:02 【问题描述】:

编辑:截至 2012 年 6 月 11 日,此错误终于得到修复! https://bugs.webkit.org/show_bug.cgi?id=35981#c1

我有一些非常简单的标记:

<form action="">
    <fieldset class="compact">                  
        <legend>Member Tools</legend>
        <label for="username">Username</label>
        <input name="username" id="username" type="text"/>
        <label for="password">Password</label>
        <input name="password" id="password" type="password" />
    </fieldset>
</form>

我试图在 legend 元素的底部添加一个小边距,这在 Firefox 2 和 3 以及 IE 5-8 中都可以正常工作,但是在 Safari 和 Chrome 中添加 margin 没有任何作用.据我所知legend 只是另一个块级元素,Webkit 添加margin 应该没有问题,还是我不正确?

【问题讨论】:

Google 可以让 Quake II 在 Safari 和 Chrome 上以 html 5 运行。然而,我也与 CSS 异常作斗争。客户端世界中的讽刺从未停止让我感到惊讶。 googlewebtoolkit.blogspot.com/2010/04/look-ma-no-plugin.html 两年多仍未解决! bugs.webkit.org/show_bug.cgi?id=35981 这个问题在 2012 年 5 月发布的最新 Windows 版本 (5.1.7) 中仍然存在。Apple 不再继续为 Windows 开发 Safari - 所以永远不要期待修复。跨度> 【参考方案1】:

嗯,&lt;legend&gt; 真的不是“只是另一个块级元素。”也许应该是这样,但事实是它本质上将具有布局特性,因为它应该做一些非常奇怪的事情,随着元素的变化。在 IE 和 Firefox 之间,margin 和 padding 对&lt;legend&gt; 元素的影响有很大不同。

您只想将 &lt;fieldset&gt; 内容与框顶部分开吗?如果是这样,我会尝试使用字段集本身的padding-top

【讨论】:

感谢您的回复。回去尝试在规范中找到它,我实际上无法说出它应该是什么,无论我将显示设置为什么都没有效果。我会尝试调整字段集的填充,但我希望增加图例底部和第一个标签之间的距离。 嗯,&lt;legend&gt; 是对昔日的回归之一。您可以完全设置它的样式有点令人惊奇:-) 我在自己的应用程序中有一些样式化的字段集,我计划用普通的旧&lt;div&gt; 块重新做那些某个点,以便我可以清理一些浏览器差异(主要是关于水平定位,但这是同一类问题)。【参考方案2】:

经过一番研究,我找到了一种解决方法,我认为这是解决它的最不“hacky”的方法。使用讨厌的 webkit 定位黑客确实不是一种选择,但我发现 -webkit-margin-collapse: separate 属性似乎可以阻止元素的边距折叠,就像它描述的那样。

所以在我的场景中,下面通过在字段集中的第一个标签元素的顶部(图例正下方)添加边距来解决问题:

fieldset > label:first-of-type

-webkit-margin-top-collapse: separate;
margin-top: 3px;

不完美,但总比没有好,其他浏览器应该只是正常折叠边距。

如果有人好奇,确实有人确实提交了关于这个 #35981 的错误报告

https://bugs.webkit.org/show_bug.cgi?id=35981

感谢大家的意见。

【讨论】:

你觉得这个解决方案怎么样? legend + label -webkit-margin-top-collapse: separate; margin-top: 3px; 它应该更通用,并且有更广泛的浏览器支持(CSS2 而不是 CSS3)【参考方案3】:

我刚刚发现向字段集添加 1 像素的填充似乎让它突然意识到它包含的边距(创建的间距超过 1 像素)。

【讨论】:

【参考方案4】:

很抱歉为这样一个旧线程发布答案,但实际上有一个非常简单的解决方案,不需要任何黑客。您需要做的就是在 fieldset 元素的顶部添加填充。

fieldset  padding: 10px 0 0; 

这可能会让我想说的更清楚一点:http://jsfiddle.net/8fyvY/

【讨论】:

此填充在 IE8 和 7 中的工作方式不同。它将填充放在图例上方。 太奇怪了。鉴于图例在字段集中,将填充应用于图例上方是否更有意义,就像 ie7 和 8 一样? 理论上是个好主意,但是如果&lt;fieldset&gt; 中有多个&lt;legend&gt; 标签,那么您仍然不会得到想要的结果。 一个&lt;fieldset&gt;元素不应该最多只有一个&lt;legend&gt;吗? @Nic:HTML 4 DTD 和 HTML 5 spec 更加严格:&lt;legend&gt; 可以作为&lt;fieldset&gt; 的第一个子元素存在,仅此而已(尽管@987654332 的 HTML5 描述@ 声明“组的名称由作为 fieldset 元素的子元素的第一个图例元素(如果有)给出”,这可以理解为后面的 &lt;legend&gt;s 被忽略)。【参考方案5】:

我遇到了这个问题,在 chrome 上一切看起来都很好,但是 safari 出了问题。 在那种情况下,如果我添加此代码

fieldset > legend:first-of-type

-webkit-margin-top-collapse: separate;
margin-bottom: 3px;

我在 Chrome 上获得双倍边距。然后就决定执行以下操作

fieldset > legend + *
    padding-top:3px;

希望有所帮助。干杯!

【讨论】:

【参考方案6】:

为了让图例在所有浏览器中使用底部边框和边距,我在图例中插入一个跨度,将边框放在跨度上,将图例边距设置为 0,然后在图例底部添加填充。

例如

legend 
  border: 0;
  margin-bottom: 0;
  padding-bottom: 20px;


legend span 
  display: block;
  border-bottom: 2px solid #f0ebe6;

【讨论】:

以上是关于无法在 Safari 和 Chrome (WebKit) 中将 `margin` 添加到 `<legend>` 元素的主要内容,如果未能解决你的问题,请参考以下文章

Graphiql (GraphQL UI) 无法在 Chrome 中加载,但在 Firefox 和 Safari 中有效

Flexbox 在 Firefox 上无法正常工作,但在 Chrome 和 Safari 上正常

jQuery .animate( 'width' : 'show' ) 在 Chrome/Safari 中无法正常工作?

无法在 Firefox 和 IE9 中获取数据,但在 Chrome 和 Safari 中运行良好

无法在 Safari 和 Chrome (WebKit) 中将 `margin` 添加到 `<legend>` 元素

Safari/Chrome (Webkit) - 无法隐藏 iframe 垂直滚动条