2009-09-04 5 views
93

Ok, nous savons donc que le fait de définir un remplissage à un objet entraîne une modification de sa largeur même s'il est défini explicitement. Bien que l'on puisse argumenter sur la logique derrière cela, cela cause des problèmes avec certains éléments.Rembourrage à l'intérieur des ruptures des ruptures 100%

Dans la plupart des cas, vous ajoutez simplement un élément enfant et ajoutez un remplissage à celui-ci au lieu de 100%, mais pour les entrées de formulaire, ce n'est pas une étape possible.

Jetez un oeil à ceci: http://sandman.net/test/formcss.html

La deuxième entrée a son rembourrage réglé sur 5px que je préfère de beaucoup le réglage par défaut. Mais malheureusement, cela fait croître l'entrée de 10px dans toutes les directions, y compris en ajoutant 10px à la largeur de 100%.

Le problème ici est que je ne peux pas ajouter un élément enfant à l'intérieur de l'entrée, donc je ne peux pas le réparer. Donc la question est:

Y at-il un moyen d'ajouter un rembourrage à l'intérieur de l'entrée tout en gardant la largeur de 100%? Il faut être à 100% puisque les formes seront rendues en parents de largeur différente donc je ne connais pas la largeur du parent à l'avance.

+3

Voir http://stackoverflow.com/questions/628500/can-i-stop-100-width-text-boxes-from-extending-beyond-their-containers/628912#628912 pour savoir comment utiliser le CSS3 ' Attribut box-sizing' –

+11

Il suffit de dire merci d'avoir gardé votre page d'exemple tout le temps. Me rend fou quand quelqu'un publie une URL dans la question et il est en panne après la réponse est répondue ou ils n'utilisent pas quelque chose comme jsfiddle. –

+0

Concernant l'utilisation de l'attribut box-sizing; mon problème était le même problème, mais avec la hauteur de mise en hauteur à 100% seul signifie hauteur + bordure + remplissage = hauteur du conteneur. Pour obtenir l'entrée pour avoir la hauteur réelle du conteneur, j'ai simplement besoin d'utiliser la taille de boîte : boîte de contenu. – Skychan

Répondre

7

Je ne sais pas comment il est (cela fonctionne dans Firefox et Safari) compatible croix navigateur, mais vous pouvez essayer cette solution:

DIV.formvalue { 
padding: 15px; 
} 
input.input { 
margin: -5px; 
} 

(seulement affiché les valeurs que j'ai changé)

+1

Il provoque un problème dans IE. – Tarik

+1

Je préfère utiliser le code standard pour une chose si "simple" ... – Sandman

+0

Eh bien, cela ne me surprend pas beaucoup :) Ne pensez pas qu'il existe une solution de navigation croisée facile sans changer le balisage. – michaelk

-1

Tout ce que je sais pour éviter cela, c'est d'assigner des valeurs comme 100% -10. Mais il a quelques problèmes de compatibilité.

1

Peut-être prendre la bordure + arrière-plan du input, et à la place, l'inclure dans un div avec bordure + arrière-plan et la largeur: 100%, et définir une marge sur le input?

+0

Voilà le genre de piratage que j'ai J'utilise actuellement pour ce problème, mais je préfère utiliser border sur l'entrée pour "raisons de style" ou autres joyeusetés. Mais oui, c'est ce que je fais actuellement c'est donc une solution viable – Sandman

7

Une option consiste à envelopper le INPUT dans un DIV qui a le remplissage.

CSS:

div.formvalue { 
    background-color: #eee; 
    border: 1px solid red; 
    padding: 10px; 
    margin: 0px; 
} 

div.paddedInput { 
    padding: 5px; 
    border: 1px solid black; 
    background-color: white; 
} 

div.paddedInput input { 
    border: 0px; 
    width: 100%; 
} 

HTML:

<div class="formvalue"> 
    <div class="paddedInput"><input type="text" value="Padded!" /></div> 
</div> 
+8

Le remplissage d'un conteneur div produit des résultats non identiques à l'ajout d'un remplissage dans un champ de saisie. –

+0

Ajouter à ce que Felix Fung a dit - Vous perdez la possibilité de cliquer avec la souris dans la zone de remplissage et de le faire se concentrer sur le champ de saisie - parmi d'autres problèmes plus notables. Je voulais juste souligner ce problème moins connu/connu - Il m'ennuie de ne pas finir lorsque vous utilisez des pages Web qui utilisent ce hack. – eselk

4

J'ai eu quelques problèmes avec quelque chose de semblable à cela. J'ai tds avec des entrées de 100% et un petit rembourrage. Ce que je faisais était de compenser le rembourrage sur le td comme suit:

.form td { 
    padding-right:8px; 
} 

.form input, .form textarea { 
    border: 1px solid black; 
    padding:3px; 
    width:100%; 
} 

rembourrage de 8px pour inclure la frontière et le rembourrage de l'entrée/textarea. J'espère que cela aide!

+0

Cette technique fonctionne très bien pour aligner la largeur des cellules qui contiennent des entrées matelassées avec des cellules qui ne le font pas. Il suffit d'appliquer le padding droit à tout TD qui contient une entrée de 100% de largeur. –

1

Une solution que j'ai trouvée fonctionne est de positionner absolument l'entrée avec une étiquette parente relativement positionnée.

<p class="full-width-input"> 
    <input type="text" class="text /> 
</p> 

L'appliquer le style:

p.full-width-input { 
    position: relative; 
    height: 35px; 
} 

p.full-width-input input.text { 
    position: absolute; 
    top: 0; 
    left: 0; 
    right: 0; 
    padding: 5px; 
} 

La seule chose à prendre en compte est que l'étiquette de paragraphe a besoin d'une hauteur définissant comme ses enfants en position absolue n'élargiront pas sa hauteur. Cela évite de devoir définir width: 100% en le verrouillant sur les côtés gauche et droit de l'élément parent.

+1

testé .. cela ne fonctionne pas ... pourriez-vous s'il vous plaît poster une démo? – mrdaliri

211

En utilisant CSS3 vous pouvez utiliser la propriété box-sizing pour modifier la façon dont le navigateur calculer la avec de l'entrée .

input.input { 
    width: 100%; 
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ 
    -moz-box-sizing: border-box; /* Firefox, other Gecko */ 
    box-sizing: border-box;   /* Opera/IE 8+ */ 
    } 

Vous pouvez en lire davantage ici: http://css-tricks.com/box-sizing/

+3

+1 et si mon patron a finalement décidé que nous pouvons abandonner le support pour IE7, il ne doit pas être utilisé du tout .. il est super old-school. – eselk

+0

@ Víctor Dieppa Garriga Merci, C'est une excellente solution. – sinanakyazici

+1

La prise en charge est la suivante: Chrome (tous): taille de boîte Opera 8.5+: taille de boîte Firefox (tous): -moz-box-sizing Safari 3: -webkit-box-sizing (non préfixé dans les versions 5.1+) IE8 +: taille de boîte. Aussi, je recommande ceci pour la réponse acceptée, c'est une solution plus élégante. – Baconbeastnz

0

Essayez d'utiliser des pourcentages pour votre padding:

.input { 

    // remove border completely 
    border: none; 

    // don't forget to use the browser prefixes 
    box-shadow: 0 0 0 1px silver; 

    // Use PERCENTAGES for at least the horizontal padding 
    padding: 5%; 

    // 100% - (2 * 5%) 
    width: 90%; 

} 

Si vous êtes inquiet au sujet des utilisateurs sur les anciens navigateurs qui ne peuvent pas voir la box-shadow, donne juste une couleur d'arrière-plan subtile à l'entrée comme sauvegarde. Si vous utilisez des pixels pour ce genre de chose, il y a de fortes chances que vous les utilisiez ailleurs, ce qui pourrait présenter quelques défis supplémentaires, faites-moi savoir si vous les rencontrez.

2

L'souvent oubliée calc peut venir à la rescousse ici:

input { 
    width: calc(100% - 1em); 
    padding: 0.5em; 
} 

Puisque nous savons le rembourrage ajoutera à la largeur de l'élément, on retranche simplement le rembourrage de la largeur totale. Il est pris en charge par tous les principaux navigateurs, est réactif et ne nécessite pas de divs wrapper malpropres.

Questions connexes