162 votes

largeur: auto pour <input> des champs

Newbie CSS question. J'ai pensé width:auto d'un display:block élément le sens de "remplir l'espace disponible'. Toutefois, pour une <input> élément, cela ne semble pas être le cas. Par exemple:

<body>
<form style='background-color:red'>
<input type='text' style='background-color:green;display:block;width:auto'>
</form>
</body>

Deux questions:

  1. Est-il une définition exacte de ce qui width:auto signifie? Le CSS semble vague pour moi, mais peut-être que j'ai raté la section correspondante.

  2. Est-il un moyen pour atteindre mon comportement attendu pour un champ de saisie - ie. occuper l'espace disponible à l'instar des autres éléments de niveau bloc?

Merci!

112voto

Steve Points 10623

Un <input>'s largeur est généré à partir de son size d'attribut. La valeur par défaut size est quel est le moteur de l'auto de largeur.

Vous pourriez essayer d' width:100% , comme illustré dans l'exemple ci-dessous.

Ne pas remplir la largeur:

<form action='' method='post' style='width:200px;background:khaki'>
  <input style='width:auto' />
</form>

Remplit largeur:

<form action='' method='post' style='width:200px;background:khaki'>
  <input style='width:100%' />
</form>

Taille plus petite, la plus petite largeur:

<form action='' method='post' style='width:200px;background:khaki'>
  <input size='5' />
</form>

Mise à JOUR

Voici le mieux que je puisse faire après quelques minutes. C'est 1px off de FF, Chrome et Safari, et parfait dans IE. (Le problème est #^&* IE s'applique frontières différemment de tout le monde donc il n'est pas compatible.)

<div style='padding:30px;width:200px;background:red'>
  <form action='' method='post' style='width:200px;background:blue;padding:3px'>
    <input size='' style='width:100%;margin:-3px;border:2px inset #eee' />
    <br /><br />
    <input size='' style='width:100%' />
  </form>
</div>

36voto

response Points 51

"Est-il une définition exacte de ce qui width:auto signifie? Le CSS spec semble vague pour moi, mais peut-être que j'ai raté la section pertinente."

Personne n'a répondu au-dessus de la partie de l'affiche originale de la question.

Voici la réponse: http://www.456bereastreet.com/archive/201112/the_difference_between_widthauto_and_width100/

Tant que la valeur de la largeur est automatique, l'élément peut avoir horizontale margin, padding et border sans devenir plus large que le contenant...

D'autre part, si vous spécifiez width:100% de l'élément total la largeur sera de 100% de son bloc contenant plus aucune marge horizontale, rembourrage et de la frontière... c'est peut être Ce que vous voulez, mais le plus probable, il n'est pas.

Pour visualiser la différence, j'ai fait un exemple: http://www.456bereastreet.com/lab/width-auto/

11voto

Jon Raasch Points 872

Comme indiqué dans l'autre réponse, largeur: automatique ne fonctionne pas en raison de la largeur étant généré par l'entrée de l'attribut de taille, qui ne peut pas être réglé sur "auto" ou quelque chose de semblable.

Il ya quelques solutions de contournement que vous pouvez utiliser pour l'obliger à jouer gentiment avec le modèle de boîte, mais rien de fantastique autant que je sache.

D'abord, vous pouvez définir le rembourrage dans le domaine à l'aide de pourcentages, faire en sorte que la largeur ajoute jusqu'à 100%, par exemple:

input {
  width: 98%;
  padding: 1%;
}

Une autre chose que vous pourriez faire est d'essayer en utilisant le positionnement absolu, à gauche et à droite à 0. En utilisant cette syntaxe:

<fieldset>
    <input type="text" />
</fieldset>

Et ce CSS:

fieldset {
  position: relative;
}

input {
    position: absolute;
    left: 0;
    right: 0;
}

Ce positionnement absolu sera la cause de l'entrée de remplir le parent fieldset à l'horizontale, quelle que soit l'entrée de rembourrage ou de marge. Cependant un énorme inconvénient de cette est que vous avez à traiter avec la hauteur de la fieldset, qui sera de 0, à moins que vous la définissez. Si vos contributions sont toutes de la même hauteur que cela fonctionnera pour vous, il suffit de définir le fieldset la hauteur de ce que l'entrée de hauteur doit être.

Autre que cela, il ya quelques JS solutions, mais je n'aime pas l'application de base de style avec JS.

6voto

mwilcox Points 2091

Ce n’est peut-être pas exactement ce que vous voulez, mais ma solution consiste à appliquer le style autowidth à une division wrapper, puis à définir votre entrée à 100%.

0voto

Mészáros Lajos Points 620

La seule option à laquelle je peux penser utilise width:100% . Si vous souhaitez également insérer un remplissage dans le champ de saisie, placez simplement un conteneur label autour de celui-ci, déplacez la mise en forme sur cette étiquette, tout en spécifiant le remplissage de l'étiquette. Les champs d'entrée sont rigides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X