<button>
J'essaye de centrer les éléments internes d'un -tag avec flexbox justify-content: center
. Mais Safari ne les centre pas. Je peux appliquer le même style à toutes les autres balises et cela fonctionne comme prévu (voir le <p>
-tag). Seul le bouton est aligné à gauche.
Essayez Firefox ou Chrome et vous verrez la différence.
Dois-je remplacer un style d'agent utilisateur? Ou toute autre solution à ce problème?
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>
Et un jsfiddle: http://jsfiddle.net/z3sfwtn2/2/
Réponses:
Le problème
Dans certains navigateurs, l'
<button>
élément n'accepte pas les modifications de sadisplay
valeur, au-delà du basculement entreblock
etinline-block
. Cela signifie qu'un<button>
élément ne peut pas être un conteneur flex ou grid, ou a<table>
, non plus.En plus des
<button>
éléments, vous trouverez peut - être cette contrainte à appliquer<fieldset>
et les<legend>
éléments, aussi bien.Voir les rapports de bogue ci-dessous pour plus de détails.
Remarque: bien qu'ils ne puissent pas être des conteneurs flexibles, les
<button>
éléments peuvent être des éléments flexibles.La solution
Il existe une solution de contournement simple et facile entre les navigateurs à ce problème:
Enveloppez le contenu du
button
dans unspan
et créez lespan
conteneur flexible.HTML ajusté (
button
contenu enveloppé dans unspan
)<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 ajusté (ciblé
span
)button > span, p { display: flex; flex-direction: row; justify-content: center; }
Démo révisée
Références / rapports de bogues
Flexbox sur un
<button>
bloque le contenu mais n'établit pas de contexte de formatage flexibleAjout de la prise en charge de l'affichage: disposition flex / grille et jeu de colonnes à l'intérieur
<button>
élémentsRegarde aussi:
la source
<button>
s, mais pourquoi diable ne fonctionne-t-il pas pour l'un<fieldset>
ou l'autre? Cet élément ne devrait-il pas être considéré comme un élément de niveau bloc régulier qui est valide pour un conteneur flex?div
ne peut pas être un enfant de abutton
car, si vous y pensez en HTML à l'ancienne, un élément de niveau bloc ne peut pas être un enfant d'un élément de niveau en ligne. Mais aujourd'hui, avec HTML5, la réponse techniquement correcte est que unbutton
élément ne peut accepter que le contenu Phrasing . Aspan
représente le contenu de phrasé , maisdiv
pas a. Adiv
représente le contenu du flux . Plus de détailsVoici mon hack le plus simple.
button::before, button::after { content: ''; flex: 1 0 auto; }
la source
À partir de Chrome 83, le
button
fonctionne maintenant commeinline-grid/grid/inline-flex/flex
, vous pouvez en savoir plus sur cette nouvelle fonctionnalité iciVoici un extrait (pour ceux qui utilisent Chrome 83 et plus)
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">
la source