Estoy tratando de centrar los elementos internos de una <button>
etiqueta con flexbox justify-content: center
. Pero Safari no los centra. Puedo aplicar el mismo estilo a cualquier otra etiqueta y funciona según lo previsto (consulte la <p>
etiqueta -etiqueta). Solo el botón está alineado a la izquierda.
Pruebe Firefox o Chrome y verá la diferencia.
¿Hay algún estilo de agente de usuario que deba sobrescribir? ¿O alguna otra solución a este problema?
div {
display: flex;
flex-direction: column;
width: 100%;
}
button, p {
display: flex;
flex-direction: row;
justify-content: center;
}
<div>
<button>
<span>Test</span>
<span>Test</span>
</button>
<p>
<span>Test</span>
<span>Test</span>
</p>
</div>
Y un jsfiddle: http://jsfiddle.net/z3sfwtn2/2/
Respuestas:
El problema
En algunos navegadores, el
<button>
elemento no acepta cambios en sudisplay
valor, más allá de cambiar entreblock
yinline-block
. Esto significa que un<button>
elemento no puede ser un contenedor flexible o de cuadrícula, ni<table>
tampoco un elemento.Además de
<button>
los elementos, es posible que esta limitación se aplica a<fieldset>
, y<legend>
los elementos, también.Consulte los informes de errores a continuación para obtener más detalles.
Nota: Aunque no pueden ser contenedores flexibles, los
<button>
elementos pueden ser elementos flexibles.La solución
Existe una solución sencilla y sencilla para varios navegadores para solucionar este problema:
Envuelva el contenido del
button
en aspan
y haga elspan
contenedor flexible.HTML ajustado (
button
contenido envuelto en aspan
)<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>
CSS ajustado (dirigido
span
)button > span, p { display: flex; flex-direction: row; justify-content: center; }
Demo revisada
Referencias / informes de errores
Flexbox en un
<button>
bloquea el contenido pero no establece un contexto de formato flexibleAgregue soporte para visualización: diseño flexible / cuadrícula y conjunto de columnas dentro de
<button>
elementosVer también:
fuente
<button>
s, pero ¿por qué diablos tampoco funciona<fieldset>
? ¿No debería ese elemento considerarse un elemento de nivel de bloque regular que es válido para un contenedor flexible?div
no puede ser hijo de abutton
porque, si lo piensa en HTML de la vieja escuela, un elemento de nivel de bloque no puede ser hijo de un elemento de nivel en línea. Pero hoy, con HTML5, la respuesta técnicamente correcta es que unbutton
elemento solo puede aceptar contenido de redacción . Aspan
representa contenido de redacción , pero adiv
no. Adiv
representa contenido de flujo . Más detallesAquí está mi truco más simple.
button::before, button::after { content: ''; flex: 1 0 auto; }
fuente
Iniciando Chrome 83,
button
ahora funciona comoinline-grid/grid/inline-flex/flex
, puedes ver más sobre esta nueva función aquíAquí hay un fragmento (para aquellos que usan Chrome 83 y versiones posteriores)
button { display: inline-flex; height: 2rem; align-items: flex-end; width: 4rem; -webkit-appearance: none; justify-content: flex-end; }
<!-- The align-items keyword should fail in Chrome 81 or earlier, but work in Chrome 83 or later. To see the error, the button needs styles that make it more of an extrinsic container. In other words, it needs a height or width set. --> <button>Hi</button> <input type="button" value="Hi">
fuente