問題
一部のブラウザでは、<button>
要素はとのdisplay
切り替え以外に、値の変更を受け入れません。これは、要素がフレックスまたはグリッドコンテナ、あるいはのいずれにもなり得ないことを意味します。block
inline-block
<button>
<table>
加え<button>
要素は、これに適用する制約見つけること<fieldset>
と<legend>
同様に、要素を。
詳細については、以下のバグレポートを参照してください。
注:フレックスコンテナにすることはできませんが、<button>
要素はフレックスアイテムにすることができます。
ソリューション
この問題には、シンプルで簡単なクロスブラウザーの回避策があります。
内容ラップbutton
ではspan
、と作るspan
フレックスコンテナを。
調整されたHTML(でラップされたbutton
コンテンツspan
)
<div>
<button>
<span>
<span>Test</span>
<span>Test</span>
</span>
</button>
<p>
<span>Test</span>
<span>Test</span>
</p>
</div>
調整されたCSS(ターゲットspan
)
button > span, p {
display: flex;
flex-direction: row;
justify-content: center;
}
改訂されたデモ
参考資料/バグレポート
ブロック上の<button>
Flexboxはコンテンツをブロックしますが、フレックスフォーマットコンテキストを確立しません
ユーザー(Oriol Brufau):フレックスボックスの仕様に応じて、の子<button>
はブロックされます。ただし、は<button>
フレックスコンテキストではなくブロックフォーマットコンテキストを確立しているようです。
ユーザー(Daniel Holbert):それは事実上HTML仕様が要求するものです。いくつかのHTMLコンテナ要素は「特別」でありdisplay
、GeckoでのCSS値を事実上無視します[インラインレベルかブロックレベルかは別として]。<button>
これらの1つです。<fieldset>
&<legend>
も同様です。
<button>
要素内のdisplay:flex / gridおよびcolumnsetレイアウトのサポートを追加します
ユーザー(Daniel Holbert):
<button>
純粋なCSSでは(ブラウザーでは)実装できないため、CSSの観点からは少しブラックボックスになっています。これは、彼らが必ずしも同じように反応するとは限らないことを意味し<div>
ます。
これはフレックスボックスに固有のものではありません。たとえばoverflow:scroll
、ボタンを配置した場合はスクロールバーをレンダリングせず、ボタンを配置した場合はテーブルとしてレンダリングしませんdisplay:table
。
さらに一歩下がると、これはに固有のものではありません<button>
。考えてみましょう<fieldset>
と<table>
これも特殊なレンダリング挙動を有します。
など古いtimey HTML要素<button>
と<table>
し、<fieldset>
単にカスタムサポートしていないdisplay
要素の周りに他のコンテンツを流すため、「この要素をブロックレベルやインラインレベルである」のは非常に高レベルの質問に答えるの目的以外の値を、 。
参照: