Disons que j'ai une zone de texte que je veux remplir 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 rend une zone de texte de 100% de largeur plus grande que son conteneur.
Par exemple, ici à droite:
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 cela est exécuté, 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 réel 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 la zone de texte "normale" l'est.
Oui: en utilisant la propriété CSS3 'box-sizing: border-box', vous pouvez redéfinir ce que signifie 'width' pour inclure le remplissage et la bordure externes.
Malheureusement, parce qu'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 entre-temps différents noms temporaires dans les navigateurs. Alors:
L'alternative à l'ancienne est simplement de mettre une quantité de 'padding-right' sur l'élément englobant <div> ou <td> égale à environ combien de marge / bordure supplémentaire à gauche et à droite dans 'px' vous pensez que les navigateurs vont donnez votre avis. (Généralement 6px pour IE <8.)
la source
Cela a résolu le problème pour moi!
Sans avoir besoin d'un div externe. Appliquez-le simplement à votre zone de texte donnée.
Avec cette propriété "Les propriétés de largeur et de hauteur (et les propriétés min / max) incluent le contenu, le remplissage et la bordure, mais pas la marge"
Voir la description de la propriété à w3schools .
J'espère que cela aide quelqu'un!
la source
Je viens de rencontrer ce problème moi-même, et la seule solution que j'ai pu trouver qui fonctionnait dans tous mes navigateurs de test (IE6, IE7, Firefox) était la suivante:
Le code:
Ici, le débordement horizontal total pour l'élément d'entrée est de 6px - 2x (padding + border) - nous définissons donc un padding-right pour le DIV interne de 6px.
la source
La prise en charge du dimensionnement des boîtes est plutôt bonne en fait: http://caniuse.com/#search=box-sizing
Donc, à moins que vous ne cibliez IE7, vous devriez être en mesure de résoudre ce type de problèmes en utilisant cette propriété. Un calque tel que sass ou moins facilite la gestion des règles préfixées comme ça, btw.
la source
En fait, c'est parce que CSS définit 100% par rapport à toute la largeur du conteneur, y compris ses marges, ses bordures et son remplissage; cela signifie que l'espace disponible. à son contenu est une quantité inférieure à 100%, sauf si le conteneur n'a pas de marges, de bordures ou de remplissage.
Ceci est contre-intuitif et largement considéré par beaucoup comme une erreur avec laquelle nous sommes maintenant coincés . Cela signifie effectivement que les dimensions% ne conviennent à rien d'autre qu'un conteneur de niveau supérieur, et même dans ce cas, uniquement s'il n'a pas de marges, de bordures ou de remplissage.
Notez que les marges, les bordures et le remplissage du champ de texte sont inclus dans la taille CSS spécifiée pour lui - c'est le conteneur qui gâche les choses.
J'ai assez bien contourné ce problème en utilisant 98%, mais c'est une solution loin d'être parfaite, car les champs d'entrée ont tendance à être encore plus courts à mesure que le conteneur s'agrandit.
EDIT: Je suis tombé sur cette question similaire - je n'ai jamais essayé la réponse donnée, et je ne sais pas avec certitude si cela s'applique à votre problème, mais il semble que ce sera le cas.
la source
Une solution qui peut fonctionner (cela fonctionne pour moi) est d'appliquer une marge négative à l'entrée (zone de texte) ... ou une largeur fixe pour ie7 ou de supprimer le support ie7. Cela donne une largeur de pixel parfaite .. Pour moi, c'est 7, donc j'ai ajouté 3 et 4 mais c'est toujours parfait.
J'ai eu le même problème et j'ai détesté avoir des div supplémentaires pour la frontière, etc.
Voici donc ma solution qui semble fonctionner!
Vous devez utiliser une feuille de style ie7 uniquement pour éviter les starhacks.
la source
Si vous ne pouvez pas utiliser,
box-sizing:border-box
vous pouvez essayer de supprimer lewidth:100%
et de mettre un très grandsize
attribut dans l'<input>
élément, l'inconvénient est cependant que vous devez modifier le html, et ne pouvez pas le faire avec CSS uniquement:la source
Si vous n'avez pas besoin de le faire de manière dynamique (par exemple, votre formulaire a une largeur fixe), vous pouvez simplement définir la largeur des
<input>
éléments enfants sur la largeur de leur conteneur moins les décorations telles que le remplissage, la marge, la bordure, etc.:la source
Si vous ne pouvez pas utiliser le dimensionnement de la boîte (par exemple, lorsque vous convertissez du HTML en PDF à l'aide d'iText). Essaye ça:
CSS
HTML
la source
Cela marche:
La première «largeur» est une règle de secours pour les anciens navigateurs.
la source
Stylez simplement l'entrée pour qu'elle soit décalée pour le remplissage supplémentaire. Dans l'exemple suivant, le remplissage de l'entrée serait de 10 pixels à gauche et à droite pour un décalage de remplissage total de 20 pixels:
la source