Flexbox无法处理按钮或字段集元素

Ing*_*mar 78 html css safari css3 flexbox

我试图<button>用flexbox的中心元素的中心元素justify-content: center.但Safari并不以它们为中心.我可以将相同的样式应用于任何其他标记,并且它按预期工作(请参阅<p>-tag).只有按钮左对齐.

尝试Firefox或Chrome,您可以看到差异.

是否有任何用户代理样式我必须覆盖?或者这个问题的任何其他解决方案?

div {
  display: flex;
  flex-direction: column;
  width: 100%;
}
button, p {
  display: flex;
  flex-direction: row;
  justify-content: center;
}
Run Code Online (Sandbox Code Playgroud)
<div>
  <button>
    <span>Test</span>
    <span>Test</span>
  </button>
  <p>
    <span>Test</span>
    <span>Test</span>
  </p>
</div>
Run Code Online (Sandbox Code Playgroud)

还有一个jsfiddle:http: //jsfiddle.net/z3sfwtn2/2/

Mic*_*l_B 117

问题是<button>元素不是设计为flex(或网格)容器.

在撰写本文时,基于Webkit的浏览器(Chrome和Safari)遵循这一设计原则.Firefox和Edge没有.我没有测试其他浏览器.

因此,display在Firefox和Edge中将元素设置为flex(或网格)容器应该没有问题.但不要指望它可以在Chrome或Safari中使用.

此行为目前适用于至少三个元素:

  • block
  • inline-block
  • <button>

我是理论化的,但我相信这个想法是在设计HTML元素时保持一定的常识.例如,HTML神想要阻止作者将按钮变成表格.

但是,至少在这种情况下,有一个简单易行的解决方法:

包裹的内容<table><button>,使<fieldset>柔性容器.

调整后的HTML(包装<legend>内容在a中<button>)

<div>
    <button>
        <span><!-- using a div also works but is not valid HTML -->
            <span>Test</span>
            <span>Test</span>
        </span>
    </button>
    <p>
        <span>Test</span>
        <span>Test</span>
    </p>
</div>
Run Code Online (Sandbox Code Playgroud)

调整后的CSS(目标button)

button > span, p {
    display: flex;
    flex-direction: row;
    justify-content: center;
}
Run Code Online (Sandbox Code Playgroud)

修订演示

注意:虽然它们不能是弹性容器,但span元素可以是弹性项目.

参考文献:

  • 我明白为什么它可能不适用于`<button>,但为什么它本身不适用于`<fieldset>`?该元素不应被视为对Flex容器有效的常规块级元素吗? (3认同)
  • @fritzmg.同意.规则可能预先存在CSS3技术,例如Flex和Grid,应该重新评估. (3认同)
  • `div` 不能是 `button` 的子元素,因为如果你用老式 HTML 来思考的话,块级元素不能是内联级元素的子元素。但如今,对于 HTML5,技术上正确的答案是[“button”元素只能接受*短语内容*](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button )。“span”代表*短语内容*,但“div”则不然。“div”代表*流内容*。[更多详细信息](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories) (2认同)

小智 12

这是我最简单的黑客攻击.

button::before,
button::after {
    content: '';
    flex: 1 0 auto;
}
Run Code Online (Sandbox Code Playgroud)