60 votes

Textarea remplissant exactement le conteneur parent, avec remplissage

Je veux un <textarea> pour remplir complètement un conteneur parent de taille absolue, avec un remplissage dans la zone de texte. Cela fonctionne pour Chrome en utilisant le code suivant :

<div id="wrap"><textarea>hello stack overflow world</textarea></div>

/* Color and border CSS omitted for simplicity */
#wrap    { position:absolute; top:10%; left:20%; right:30%; bottom:60%      }
textarea { position:absolute; top:0; left:0; right:0; bottom:0; padding:1em }

enter image description here

Malheureusement, Firefox (v5) ne respecte pas correctement la position droite/basse, ce qui produit ces résultats :

Firefox's rendering of the markup; the textarea does not fill the container.

Voici un truc qui montre le problème en action : http://jsfiddle.net/ZEhwR/

Comment puis-je obtenir le résultat indiqué dans la première phrase avec Chrome et FF (et idéalement avec IE9) ?

111voto

Marc B Points 195501

Utilisation width: 100%; height: 100%; pour faire de la <textarea> remplir l'emballage <div> . Malheureusement, vous ne pourrez pas ajouter de marges/encadrement, car ils s'ajoutent aux 100 %, de sorte que les bords droit et inférieur déborderont.

Editer : A utiliser width: 100%; ainsi que le rembourrage, vous pouvez modifier le modèle de dimensionnement de la boîte :

    width: 100%;
    height: 100%; 
    box-sizing: border-box;

Avec cette modification, 100% fait désormais référence à la distance entre les côtés extérieurs des bordures, au lieu de la distance entre les côtés extérieurs du contenu.

1 votes

J'apprécie votre réponse, mais le besoin de rembourrage est précisément la raison pour laquelle je n'ai pas utilisé la fonction width:100% et l'a mentionné à la fois dans le titre et dans la question. (Néanmoins, il s'agit d'une bonne réponse qui devrait rester sur le site au cas où quelqu'un qui trouverait cette question n'aurait pas exactement les mêmes contraintes que moi).

3 votes

Hrm... mais peut-être que je pourrait à utiliser avec box-sizing:border-box . Oui, cela fonctionne parfaitement . Je vais vous donner la note d'acceptation pour l'inspiration, merci ! Je suggère que vous ou moi modifiions votre réponse pour mentionner l'utilisation de box-sizing et -moz-box-sizing pour la correction.

0 votes

D'après la réputation que vous avez tous les deux, je suppose que c'est incorrect, mais je ne pense pas non plus que cela mérite une question à part entière. Pourquoi overflow:hidden ne corrigerait-il pas le débordement du bord droit/bas ?

8voto

ShadyKiller Points 382

J'ai une solution qui permet d'avoir une largeur et une hauteur de 100 % avec un rembourrage dans la zone de texte. J'utilise des marges négatives pour obtenir l'effet désiré.

HTML :

<div class="container">
    <textarea class="text"/></textarea>
</div>

CSS :

.container{
  padding: 10px
  border: 1px solid silver
}

.container .text{
  resize: none;
  outline: none;
  width: 100%;
  padding: 10px;
  border: none;
  height: 100%;
  margin: -10px;
}

Testé sur Google Chrome et Firefox

2voto

zzzzBov Points 62084

C'est un cas où je recommande vivement de modifier le balisage (cela ne nuira même pas à la sémantique) :

HTML

<div id="wrap">
  <label class="textarea-label">
    <textarea></textarea>
  </label>
</div>

CSS

.textarea-label
{
  display: block;
  /* border, padding, and other styles go here,
  don't set the height, and don't use floats or positioning */
}

.textarea-label textarea
{
  border: 0 none;
  margin: 0;
  outline: 0 none;
  padding: 0;
  width: 100%;
}

Vous devriez pouvoir redimensionner la zone de texte verticalement sans problème. Si vous utilisez inline-block pour l'étiquette, vous devriez pouvoir la redimensionner horizontalement également.

L'avantage de l'utilisation de l'étiquette est qu'en cliquant sur l'étiquette, le champ de texte reste activé comme si vous aviez cliqué sur le champ de texte. De plus, en utilisant le sélecteur descendant, vous conserverez vos styles de zone de texte par défaut lorsque vous aurez simplement besoin d'une zone de texte ordinaire.

1 votes

Malheureusement, bien qu'il s'agisse d'une astuce intéressante pour mettre au point la zone de texte, l'anneau de mise au point se dessine maintenant de manière évidente à l'intérieur de l'enveloppe et contre le texte en cours d'édition.

0 votes

Et pour mon prochain tour : si vous besoin pour que le contour apparaisse lorsque l'on se concentre sur le sujet, et besoin pour que cela fonctionne sans javascript, il faut que le padding du textarea soit identique à celui de l'élément .textarea-label et définir le textarea's marge à la valeur négative de l'espacement. C'est un peu une imposture, mais cela devrait fonctionner. En général, j'évite de faire en sorte que les zones de texte remplissent leur conteneur, mais c'est possible.

1voto

Yacoub Oweis Points 101

Si le seul problème auquel vous êtes confronté est que le rembourrage sera ajouté à la largeur et à la hauteur de 100 %, vous pouvez envisager l'utilisation de la propriété CSS3 "box-sizing".

.box {
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  width: 100px;
  padding: 10px;
}

Dans ce cas, la boîte aura une largeur totale de 100px au lieu de 120px.

Pour en savoir plus sur la valeur des biens immobiliers, consultez le site suivant lien

1 votes

Notez que seul Firefox prend en charge padding-box ; pour IE, Chrome et Safari border-box est une valeur supportée (et généralement plus utile). Voir cette page de test (quelque peu énigmatique) .

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