Impossible d'ajouter 'margin' à '' élément dans Safari et Chrome (WebKit)

EDIT : à partir du 2012-06-11, ce bug a finalement été corrigé! https://bugs.webkit.org/show_bug.cgi?id=35981#c1

J'ai un balisage assez simple:

<form action="">
    <fieldset class="compact">                  
        <legend>Member Tools</legend>
        <label for="username">Username</label>
        <input name="username" id="username" type="text"/>
        <label for="password">Password</label>
        <input name="password" id="password" type="password" />
    </fieldset>
</form>

J'essaie d'ajouter une petite marge au bas de l'élément legend, cela fonctionne très bien dans Firefox 2 et 3 ainsi que IE 5-8, mais dans Safari et Chrome, l'ajout d'un margin ne fait rien. Pour autant que je sache legend est juste un autre élément de niveau de bloc et Webkit ne devrait pas avoir de problème en ajoutant un margin à lui, ou suis-je incorrect?

23
demandé sur Volker E. 2010-04-02 23:05:41

6 réponses

Après un peu de recherche, j'ai trouvé une solution pour cela que je crois être la méthode la moins "hacky" pour le résoudre. L'utilisation des hacks de ciblage nasty webkit n'était vraiment pas une option, mais j'ai trouvé que la propriété -webkit-margin-collapse: separate semble fonctionner pour empêcher les marges sur les éléments de s'effondrer comme elle le décrit.

Donc, dans mon scénario, ce qui suit résout le problème en ajoutant une marge en haut du premier élément label (juste en dessous de la légende) dans le fieldset:

fieldset > label:first-of-type
{
-webkit-margin-top-collapse: separate;
margin-top: 3px;
}

Pas parfait, mais mieux que rien, les autres navigateurs devraient simplement réduire les marges normalement.

Si quelqu'un est curieux, quelqu'un a effectivement déposé un rapport de bogue à ce sujet # 35981

Https://bugs.webkit.org/show_bug.cgi?id=35981

Merci pour la contribution de tout le monde.

16
répondu Graham Conzett 2010-04-09 17:08:29

Eh bien, <legend>vraiment n'est pas " juste un autre élément de niveau bloc."Peut-être que ça devrait l'être, mais le fait est qu'il va intrinsèquement avoir des particularités de mise en page en ce sens qu'il est censé faire quelque chose d'assez bizarre, comme les éléments vont . Entre IE et Firefox, les effets de la marge et du remplissage sur les éléments <legend> sont très différents.

Voulez-vous simplement séparer le contenu <fieldset> du haut de la boîte? Si c'est le cas, j'essaierais de jouer avec padding-top du fieldset lui-même.

5
répondu Pointy 2010-04-02 19:39:49

Désolé de poster une réponse à un si vieux fil, mais il y a en fait une solution assez facile pour cela qui ne nécessite aucun hacks. Tout ce que vous devez faire est d'ajouter un remplissage en haut de votre élément fieldset.

fieldset { padding: 10px 0 0; }

Cela pourrait faire ce que j'essaie de dire un peu plus clair: http://jsfiddle.net/8fyvY/

5
répondu Wex 2011-09-10 01:42:46

Je viens de trouver que l'ajout d'un remplissage 1px au fieldset semble le rendre soudainement conscient des marges qu'il contient (l'espacement créé est supérieur à 1 px).

4
répondu Evans 2011-07-14 15:15:55

Je rencontre ce problème et tout semble bien sur chrome mais safari fait le problème. Dans ce cas, si j'ajoute ce code

fieldset > legend:first-of-type
{
-webkit-margin-top-collapse: separate;
margin-bottom: 3px;
}

J'obtiens une double marge sur Chrome. Ensuite, décidez simplement de faire ce qui suit

fieldset > legend + *{
    padding-top:3px;
}

Espérons que l'aide. À votre santé!

1
répondu Kaloyan Stamatov 2013-01-10 13:17:56

Pour obtenir une légende fonctionnant avec la bordure inférieure et la marge dans tous les navigateurs, j'insère une portée dans la légende, place la bordure sur la portée, définit la marge de la légende sur 0 et ajoute un remplissage au bas de la légende.

Par exemple

legend {
  border: 0;
  margin-bottom: 0;
  padding-bottom: 20px;
}

legend span {
  display: block;
  border-bottom: 2px solid #f0ebe6;
}
1
répondu harimau 2013-06-19 04:47:04