Pourquoi display:block;width:auto;
ma saisie de texte ne se comporte-t-elle pas comme un div et ne remplit-elle pas la largeur du conteneur?
J'avais l'impression qu'un div est simplement un élément de bloc avec une largeur automatique. Dans le code suivant, le div et l'entrée ne devraient-ils pas avoir des dimensions identiques?
Comment puis-je obtenir l'entrée pour remplir la largeur? Une largeur de 100% ne fonctionnera pas, car l'entrée a un remplissage et une bordure (ce qui entraîne une largeur finale de 1 pixel + 5 pixels + 100% + 5 pixels + 1 pixels). Les largeurs fixes ne sont pas une option, et je recherche quelque chose de plus flexible.
Je préférerais une réponse directe à une solution de contournement. Cela semble être une bizarrerie CSS et le comprendre peut être utile plus tard.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>width:auto</title>
<style>
div, input {
border: 1px solid red;
height: 5px;
padding: 5px;
}
input, form {
display: block;
width: auto;
}
</style>
</head>
<body>
<div></div>
<form>
<input type="text" name="foo" />
</form>
</body>
</html>
Je dois souligner que je peux déjà le faire avec des solutions de contournement. En dehors de ce vissage avec la sémantique de la page et les relations de sélecteur CSS, j'essaie de comprendre la nature du problème et s'il peut être surmonté en changeant la nature de l'INPUT lui-même.
Ok, c'est VRAIMENT étrange! J'ai trouvé que la solution consiste simplement à ajouter max-width:100%
à une entrée avec width:100%;padding:5px;
. Cependant, cela soulève encore plus de questions (que je poserai dans une question distincte), mais il semble que width utilise le modèle de boîte CSS normal et que max-width utilise le modèle de border-box d'Internet Explorer. Comme c'est étrange.
Ok, ce dernier semble être un bogue dans Firefox 3. Internet Explorer 8 et Safari 4 limitent la largeur maximale à 100% + padding + border, ce que la spécification dit de faire. Enfin, Internet Explorer a fait quelque chose de bien.
Oh mon dieu, c'est génial! En jouant avec cela, et avec beaucoup d'aide des vénérables gourous Dean Edwards et Erik Arvidsson , j'ai réussi à rassembler trois solutions distinctes pour créer un véritable cross-browser 100% largeur sur des éléments avec un rembourrage et des bordures arbitraires. Voir la réponse ci-dessous. Cette solution ne nécessite aucun balisage HTML supplémentaire, juste une classe (ou un sélecteur) et un comportement facultatif pour Internet Explorer hérité.
input
éléments apparemment non conformes à la spécification CSS 2.1, tandis que la question à laquelle vous avez lié demande comment éviter le débordement des boîtes qui se produit parfaitement dans les limites de la spécification CSS 2.1. Les questions et leurs solutions se chevauchent, mais les appeler des doubles exacts est tout simplement faux.Réponses:
Découvrez ce que j'ai trouvé, une solution utilisant le
box-sizing:border-box
style relativement inconnu de CSS 3. Cela permet une largeur «vraie» de 100% sur n'importe quel élément indépendamment du remplissage et / ou des bordures de ces éléments.Cette solution prend en charge Internet Explorer 6 et Internet Explorer 7 via un comportement écrit par Erik Arvidsson avec quelques ajustements de Dean Edwards pour prendre en charge le pourcentage et d'autres largeurs non-pixels.
Exemple de travail
Behavior (boxsizing.htc)
la source
width:100%
mais ce n'est pas le cas si vous utilisezwidth:auto
, voir ici: jsfiddle.net/hGuzELa raison pour laquelle cela se produit est que la taille d'une entrée de texte est déterminée par son attribut size. ajoutez size = "50" dans la balise <input>. Puis changez-le en size = "100" - voyez ce que je veux dire?
Je soupçonne qu'il existe une meilleure solution, mais la seule qui me vient à l'esprit est quelque chose que j'ai trouvé sur la question "Fonctionnalités cachées du HTML" sur SO: Utilisez un div modifiable par le contenu, au lieu d'une entrée. Passer l'entrée utilisateur au formulaire englobant (si c'est ce dont vous avez besoin) peut être un peu délicat.
Fonctionnalités cachées du HTML
la source
button
de même pour qui n'a pas d'size
attribut?input
c'est un élément remplacé.Votre meilleur pari est d'envelopper l'entrée dans un div avec votre bordure, vos marges, etc., et d'avoir l'entrée à l'intérieur avec une largeur de 100% et sans bordure, sans marges, etc.
Par exemple,
la source
Vous pouvez le simuler, comme ceci:
la source
Essaye ça:
la source
Vous pouvez également le simuler, comme ceci:
la source
Ajoutez ceci à votre style:
la source