【发布时间】:2018-06-28 07:11:21
【问题描述】:
根据我数十年的手工编写 HTML 的经验,我了解到 <form>、<fieldset> 只是 block 级别的元素,例如 <div>。在 CSS 方面,它们在定位和大小方面的行为完全相同。 (请耐心等待,我在这里忽略了像 IE6 这样的旧浏览器。)....或者我是这么认为的....
*在我继续之前,我必须声明我大部分时间都使用 Firefox 进行开发和测试。
我在一个项目中到处都是<form> 和<fieldset>。为了简化我的问题,我有类似的内容:
<form>
<fieldset>
<div class="gridChild">...</div>
<div class="gridChild">...</div>
<div class="gridChild">...</div>
</fieldset>
</form>
我想让gridChilddivs 在各个列的布局中。所以我有类似的CSS:
fieldset {
display: grid;
grid-template-columns: 50px 2fr 6fr 6fr auto ....;
}
它奏效了。它在我的屏幕上完美地显示了这些列......它适用于 Firefox、Android 甚至 Edge。截止日期已过期。我很着急,我没有在 Chrome 上测试它。我认为如果 Firefox 和 Edge 运行良好,那么 Chrome 也应该可以运行,对吧?或者我是这么想的…… 后来,我发现这在 Chrome 上不起作用。 Chrome 上完全忽略了网格布局。我花了几天时间来调试问题。
在几个不眠之夜之后,我发现display:grid 不适用于<fieldset>。它必须应用于<div> 才能使 Chrome 正常工作。这对我来说是一个惊喜,因为我一直在使用 <form> 和 <fieldset> 以跨浏览器的方式进行很多 CSS 定位,比如浮动、绝对定位等,它们的行为就像 <div>每时每刻。但是为什么不是网格布局呢?这是 Chrome 的一个错误,还是这种行为是这样设计的?因为我看到这对于 Firefox、Edge 和 Android 来说都不是问题。
我能想到的一个简单解决方法是将<div> 包裹在<fieldset> 中,如下所示:
<form>
<fieldset><div class="gridParent">
<div class="gridChild">...</div>
<div class="gridChild">...</div>
<div class="gridChild">...</div>
</div></fieldset>
</form>
但正如我之前所说,我到处都有<form> 和<fieldset>。如果我可以避免更改 HTML 结构,那将是最好的。我写这里是为了寻求 CSS 解决方案/hack,所以我不必经历和重写数百行 HTML。
【问题讨论】:
-
根据我数十年的手工编写 HTML 的经验,我了解到
<form>、<fieldset>只是像<div>这样的块级元素。 。 .. 很抱歉,that is not entirely correct. -
这个问题是在gridbugs 上提出的,就像@Michael_B 提到的一样,它与同一个 flexbox 问题有关。解决方法 - 正如您已经解决的那样 - 是添加一个包装器元素。
-
@Michael_B 对我来说,flexbox 和网格布局是类似的动物品种。如果一个不工作,我不会指望另一个工作。不过还是谢谢你的信息。
-
@user2526586 AFAICT 您自己提出的解决方法应该是公认的答案。您可以考虑回答自己的问题并接受它。
-
相同,我想知道它是否也已修复
标签: css google-chrome grid-layout css-grid