185 votes

Puis-je empêcher les zones de texte d'une largeur de 100 % de s'étendre au-delà de leur conteneur ?

Disons que j'ai une zone de texte que je veux remplir sur une ligne entière. Je lui donnerais un style comme celui-ci :

input.wide {display:block; width: 100%}

Cela pose des problèmes car la largeur est basée sur le contenu de la zone de texte. Les zones de texte ont une marge, des bordures et un remplissage par défaut, ce qui fait qu'une zone de texte de 100 % de largeur est plus grande que son conteneur.

Par exemple, ici à droite :

enter image description here

Existe-t-il un moyen de faire en sorte qu'une zone de texte remplisse la largeur de son conteneur sans s'étendre au-delà ?

Voici un exemple de HTML pour montrer ce que je veux dire :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <style type="text/css">
        #outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
        #inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
        input.wide {display:block; margin: 0px}
        input.normal {display:block; float: right}
    </style>
</head>
<body>
    <div id="outer">
        <div id="inner">
            <input type="text" class="wide" />
            <input type="text" class="normal" />
            <div style="clear:both;"></div>
        </div>
    </div>
</body>
</html>

Si cette opération est exécutée, vous pouvez voir en regardant la zone de texte "normale" que la zone de texte "large" dépasse du conteneur. La zone de texte "normale" flotte jusqu'au bord du conteneur. J'essaie de faire en sorte que la zone de texte "large" remplisse son conteneur, sans s'étendre au-delà du bord comme le fait la zone de texte "normale".

282voto

bobince Points 270740

Existe-t-il un moyen de faire en sorte qu'une zone de texte remplisse la largeur de son conteneur sans s'étendre au-delà ?

Oui : en utilisant la propriété CSS3 "box-sizing : border-box", vous pouvez redéfinir ce que signifie "largeur" pour inclure le remplissage et la bordure externes.

Malheureusement, comme il s'agit de CSS3, le support n'est pas très mature, et comme le processus de spécification n'est pas encore terminé, il a des noms temporaires différents dans les navigateurs en attendant. Donc :

input.wide {
    width: 100%;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

L'alternative de la vieille école consiste simplement à mettre une quantité de " padding-right " sur l'élément <div> ou <td> englobant égale à peu près à la quantité supplémentaire de padding/border gauche et droite en " px " que vous pensez que les navigateurs donneront à l'entrée. (Typiquement 6px pour IE<8.)

0 votes

Cela fonctionnerait parfaitement, mais je ne peux pas l'utiliser car je vise les appareils mobiles, qui ne seront probablement pas pris en charge avant des années :-\.

20 votes

Je pense que les appareils mobiles auront un support HTML5 complet avant les ordinateurs.

4 votes

@Kindred : certainement pas si vous incluez IEMobile et Blackberry dans cette liste.

91voto

Hilbrand Bouwkamp Points 11496

Ce que vous pourriez faire, c'est de supprimer les "extras" par défaut sur la input :

input.wide {display:block; width:100%;padding:0;border-width:0}

Cela permettra de garder le input à l'intérieur de son conteneur. Maintenant, si vous voulez les bordures, enveloppez le fichier input dans un div avec les frontières fixées sur le div (de cette façon, vous pouvez retirer le display:block de la input aussi). Quelque chose comme :

<div style="border:1px solid gray;">
 <input type="text" class="wide" />
</div>

Edit : Une autre option consiste à, au lieu de supprimer le style du fichier input compenser dans l'enveloppe div :

input.wide {width:100%;}

<div style="padding-right:4px;padding-left:1px;margin-right:2px">
  <input type="text" class="wide" />
</div>

Vous obtiendrez ainsi des résultats quelque peu différents selon les navigateurs, mais ils ne chevaucheront pas le conteneur. Les valeurs dans le div dépendent de la taille de la bordure de l'élément input et l'espace que vous souhaitez entre les input et la frontière.

3 votes

C'est une solution très créative. Le seul problème que j'ai avec elle est que je ne peux pas définir un contour sur la zone de texte lorsqu'elle obtient le focus, à moins que je n'utilise JavaScript pour modifier la bordure de la div enveloppante.

0 votes

@DanHerbert, vous avez raison, c'est un défaut majeur de cette méthode.

10voto

Tobias Cohen Points 14390

Je viens de rencontrer ce problème moi-même, et la seule solution que j'ai trouvée et qui a fonctionné dans tous mes navigateurs de test (IE6, IE7, Firefox) est la suivante :

  1. Encadrer le champ de saisie dans deux DIV distincts
  2. Définissez la largeur du DIV externe à 100 %, afin d'éviter que notre conteneur ne déborde du document.
  3. Mettez du rembourrage dans le DIV interne de la quantité exacte pour compenser le débordement horizontal de l'entrée.
  4. Définir le rembourrage personnalisé sur l'entrée afin qu'il déborde de la même quantité que celle que j'ai autorisée dans le DIV interne.

Le code :

<div style="width: 100%">
    <div style="padding-right: 6px;">
        <input type="text" style="width: 100%; padding: 2px; margin: 0;
                                  border : solid 1px #999" />
    </div>
</div>

Ici, le débordement horizontal total de l'élément d'entrée est de 6px - 2x(padding + border) - nous définissons donc un padding-right de 6px pour le DIV interne.

0 votes

Ajouter à l'élément d'entrée un padding de 8px et ça ne fonctionne plus

7voto

jdvauguet Points 829

La prise en charge de la taille des boîtes est assez bonne en fait : http://caniuse.com/#search=box-sizing

Ainsi, à moins que vous ne cibliez IE7, vous devriez être en mesure de résoudre ce type de problèmes en utilisant cette propriété. Une couche telle que sass ou less facilite la gestion des règles préfixées de ce genre, btw.

3voto

Lawrence Dol Points 27976

En fait, c'est parce que CSS définit 100% par rapport à la largeur totale du conteneur, y compris ses marges, ses bordures et son rembourrage ; cela signifie que l'espace disponible pour son contenu est inférieur à 100%, sauf si le conteneur n'a pas de marges, de bordures ou de rembourrage.

C'est contre-intuitif et beaucoup considèrent que c'est une erreur avec laquelle nous sommes maintenant coincés. . Cela signifie effectivement que les dimensions en % ne sont bonnes que pour un conteneur de niveau supérieur, et même dans ce cas, seulement s'il n'a pas de marges, de bordures ou de rembourrage.

Notez que les marges, les bordures et le remplissage du champ de texte son inclus dans la taille CSS spécifiée pour lui - c'est le conteneur qui perturbe les choses.

J'ai réussi à contourner ce problème en utilisant 98 %, mais cette solution est loin d'être parfaite, car les champs de saisie ont tendance à être plus courts au fur et à mesure que le conteneur s'agrandit.


EDIT : Je suis tombé sur ceci question similaire - Je n'ai jamais essayé le responder donné, et je ne sais pas avec certitude si cela s'applique à votre problème, mais il semble que ce soit le cas.

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