Il y avait un autre fil à ce sujet , que j'ai essayé. Mais il y a un problème: le textarea
ne rétrécit pas si vous supprimez le contenu. Je ne trouve aucun moyen de le réduire à la bonne taille - la clientHeight
valeur revient en tant que taille réelle de textarea
, pas son contenu.
Le code de cette page est ci-dessous:
function FitToContent(id, maxHeight)
{
var text = id && id.style ? id : document.getElementById(id);
if ( !text )
return;
var adjustedHeight = text.clientHeight;
if ( !maxHeight || maxHeight > adjustedHeight )
{
adjustedHeight = Math.max(text.scrollHeight, adjustedHeight);
if ( maxHeight )
adjustedHeight = Math.min(maxHeight, adjustedHeight);
if ( adjustedHeight > text.clientHeight )
text.style.height = adjustedHeight + "px";
}
}
window.onload = function() {
document.getElementById("ta").onkeyup = function() {
FitToContent( this, 500 )
};
}
Réponses:
Cela fonctionne pour moi (Firefox 3.6 / 4.0 et Chrome 10/11):
Si vous voulez l'essayer sur jsfiddle Il commence par une seule ligne et ne fait croître que la quantité exacte nécessaire. C'est correct pour un single
textarea
, mais je voulais écrire quelque chose où j'aurais beaucoup beaucoup de telstextarea
(environ autant que l'on aurait normalement des lignes dans un grand document texte). Dans ce cas, c'est vraiment lent. (Dans Firefox, c'est incroyablement lent.) Je voudrais donc vraiment une approche qui utilise du CSS pur. Cela serait possible aveccontenteditable
, mais je veux que ce soit en clair uniquement.la source
style.height='auto'
. Je soupçonne que la solution consiste à ajouter un frère caché utilisé uniquement pour la mesure.UNE SOLUTION COMPLÈTE ET SIMPLE
Mise à jour 2020-05-14 ( Prise en charge améliorée du navigateur pour les mobiles et les tablettes)
Le code suivant fonctionnera:
OPTION 1 (Avec jQuery)
Cette option nécessite jQuery et a été testée et fonctionne avec 1.7.2 - 3.3.1
Simple (ajoutez ce code jquery à votre fichier de script principal et oubliez-le.)
Test on jsfiddle
OPTION 2 (JavaScript pur)
Simple (Ajoutez ce JavaScript à votre fichier de script principal et oubliez-le.)
Test on jsfiddle
OPTION 3 (extension jQuery)
Utile si vous souhaitez appliquer un chaînage supplémentaire aux zones de texte que vous souhaitez redimensionner automatiquement.
Invoquer avec
$('textarea').autoHeight()
MISE À JOUR DE TEXTAREA VIA JAVASCRIPT
Lors de l'injection de contenu dans une zone de texte via JavaScript, ajoutez le code suivant pour appeler la fonction de l'option 1.
PRESET TEXTAREA HEIGHT
Pour fixer la hauteur initiale de la zone de texte, vous devrez ajouter une condition supplémentaire:
la source
this.style.height = 'auto';
la correction magique du comportement. J'étais tellement frustré pourquoi le scrollHeight était si bizarre dans son comportement. La hauteur en auto, puis en faisant correspondre le scrollHeight dans le même cycle de rendu me fait toujours remarquer comment cela «résout» ce problème, même s'il ne devrait être techniquement que la deuxième hauteur.this.style.height = 'auto';
corrige le comportement de scrollHeight? C'est juste magique.La solution jQuery ajuste le CSS pour l'adapter à vos besoins
css ...
javascript ...
OU alternative pour jQuery 1.7 + ...
J'ai créé un violon avec le style minimum absolu comme point de départ pour vos expériences ... http://jsfiddle.net/53eAy/951/
la source
overflow-y: hidden;
au CSS pour empêcher la barre de défilement de clignoter brièvement lors du redimensionnement.$('textarea.auto-resize').on('change cut paste drop keyup', function(){...})
Testé dans Firefox 14 et Chromium 18. Les nombres 24 et 12 sont arbitraires, testez pour voir ce qui vous convient le mieux.
Vous pourriez vous passer du style et des balises de script, mais cela devient un peu désordonné (c'est du HTML + JS à l'ancienne et ce n'est pas recommandé).
Edit: code modernisé. Attribut onkeyup modifié en addEventListener.
Edit: keydown fonctionne mieux que keyup
Edit: declare function avant d'utiliser
Edit: input fonctionne mieux que keydown (thnx @ WASD42 & @ MA-Maddin)
jsfiddle
la source
input
événement à la place. Voir stackoverflow.com/a/14029861/1951524textarea
prise en charge multiple en une ligne:document.querySelectorAll('textarea').forEach(function(te){ te.addEventListener("input", function() { this.style.height='24px'; this.style.height=this.scrollHeight+12+'px'; }); });
removeEventListener
et de nettoyer vos auditeurs d'événements. Ceci est particulièrement important lors de la création d'écouteurs d'événements partout dans une boucle forEach. De plus, à mon avis, la lisibilité est beaucoup plus importante que la concision.box-sizing: border-box;
propriété est définie, sinon la zone de texte explose de 4 pixels pour chaque événement onInput. J'ai passé environ 3 heures jusqu'à ce que je comprenne que c'était le problème.La meilleure solution (qui fonctionne et est courte) pour moi est:
Il fonctionne comme un charme sans aucun clignement de pâte (avec la souris également), coupe, entre et rétrécit à la bonne taille.
Veuillez jeter un œil à jsFiddle .
la source
Vous utilisez la valeur plus élevée du clientHeight actuel et du scrollHeight de contenu. Lorsque vous réduisez le scrollHeight en supprimant le contenu, la zone calculée ne peut pas devenir plus petite car le clientHeight, précédemment défini par style.height, le maintient ouvert. Vous pouvez plutôt prendre un max () de scrollHeight et une valeur de hauteur minimale que vous avez prédéfinie ou calculée à partir de textarea.rows.
En général, vous ne devriez probablement pas vraiment compter sur scrollHeight sur les contrôles de formulaire. À part que scrollHeight est traditionnellement moins largement pris en charge que certaines des autres extensions IE, HTML / CSS ne dit rien sur la façon dont les contrôles de formulaire sont implémentés en interne et vous n'êtes pas assuré que scrollHeight sera significatif. (Traditionnellement, certains navigateurs ont utilisé des widgets de système d'exploitation pour la tâche, rendant impossible l'interaction CSS et DOM sur leurs internes.) Au moins, reniflez l'existence de scrollHeight / clientHeight avant d'essayer d'activer l'effet.
Une autre approche alternative possible pour éviter le problème s'il est important que cela fonctionne plus largement pourrait être d'utiliser une div masquée de la même largeur que la zone de texte et définie dans la même police. Lors de la manipulation, vous copiez le texte de la zone de texte vers un nœud de texte dans div masqué (en vous souvenant de remplacer '\ n' par un saut de ligne et d'échapper '<' / '&' correctement si vous utilisez innerHTML). Il suffit ensuite de mesurer l'offset du div. La hauteur vous donnera la hauteur dont vous avez besoin.
la source
scrollHeight
zones de texte? Fonctionne très bien avec les versions actuelles d'IE, Firefox et Opera ...Si vous n'avez pas besoin de prendre en charge IE8, vous pouvez utiliser l'
input
événement:Maintenant, il vous suffit d'ajouter du CSS et vous avez terminé:
Usage:
Vous pouvez en savoir plus sur son fonctionnement sur mon article de blog .
la source
input
événement lors de l'initialisation dans chaque cycle.redimensionnement automatique
https://github.com/jackmoore/autosize
Just works, autonome, est populaire (3.0k + étoiles GitHub en octobre 2018), disponible sur cdnjs ) et léger (~ 3.5k). Démo:
BTW, si vous utilisez l'éditeur ACE, utilisez
maxLines: Infinity
: Ajuster automatiquement la hauteur au contenu dans l'éditeur Ace Cloud 9la source
autosize
plugin ne permet pas de redimensionner manuellement en utilisant l'icône de redimensionnement dans la zone de texte.J'ai trouvé un paquebot d' ici ;
la source
Quelqu'un a-t-il considéré que le contenu pouvait être modifié? Pas de problème avec le défilement, et le seul JS que j'aime à ce sujet est si vous prévoyez d'enregistrer les données sur le flou ... et apparemment, il est compatible avec tous les navigateurs populaires: http://caniuse.com/#feat = contenteditable
Il suffit de le styliser pour qu'il ressemble à une zone de texte, et il se redimensionne automatiquement ... Définissez sa hauteur minimale comme la hauteur de texte préférée et définissez-la.
Ce qui est cool avec cette approche, c'est que vous pouvez enregistrer et étiqueter sur certains navigateurs.
http://jsfiddle.net/gbutiri/v31o8xfo/
la source
contenteditable
est bon, mais si vous voulez du texte en clair, il a besoin d'un tas d'options comme-webkit-user-modify: read-write-plaintext-only
etwhite-space: pre-wrap
.[dom-element].innerText
. @WebmasterG À mon humble avis, il serait bien d'omettre jquery (pour la transparence) et d'inclure l'exemple sur cette page via un extrait de code exécutable au lieu de jsfiddle.J'ai utilisé le code suivant pour plusieurs zones de texte. Fonctionne très bien dans Chrome 12, Firefox 5 et IE 9, même avec des actions de suppression, de couper-coller effectuées dans les zones de texte.
la source
Il existe une approche légèrement différente.
L'idée est de copier le texte de
textarea
danspre
et de laisser CSS s'assurer qu'ils ont la même taille.L'avantage est que les frameworks présentent des outils simples pour déplacer du texte sans toucher à aucun événement. À savoir, dans AngularJS, vous ajouteriez un
ng-model="foo" ng-trim="false"
autextarea
etng-bind="foo + '\n'"
aupre
. Voir un violon .Assurez-vous simplement qu'il
pre
a la même taille de police que letextarea
.la source
pre
a la même taille de police que letextarea
" - Ils ont besoin du mêmeline-height
, et d'une quantité égale depadding
et / ouborder
trop. C'est la meilleure solution pour Angular.Les travaux suivants permettent de couper, coller, etc., indépendamment du fait que ces actions proviennent de la souris, d'un raccourci clavier, de la sélection d'une option dans une barre de menus ... plusieurs réponses adoptent une approche similaire mais ne tiennent pas compte de la boîte - dimensionnement, c'est pourquoi ils appliquent incorrectement le style
overflow: hidden
.Je fais ce qui suit, qui fonctionne également bien avec
max-height
etrows
pour une hauteur minimale et maximale.Pour être complet, vous devez appeler la
adjust
fonction dans quelques circonstances supplémentaires:textarea
modifications avec le redimensionnement de la fenêtre ou d'autres événements qui modifient la largeur de la zone de textetextarea
'sdisplay
change, par exemple quand il passe denone
(caché) àblock
textarea
est modifiée par programmeNotez que l'utilisation
window.getComputedStyle
ou l'obtentioncurrentStyle
peut être quelque peu coûteuse en termes de calcul, vous pouvez donc vouloir mettre le résultat en cache à la place.Fonctionne pour IE6, donc j'espère vraiment que ce support est assez bon.
la source
Comme approche différente, vous pouvez utiliser un
<span>
qui ajuste automatiquement sa taille. Vous devrez la rendre modifiable en ajoutant lacontenteditable="true"
propriété et vous avez terminé:Le seul problème avec cette approche est que si vous souhaitez soumettre la valeur dans le cadre du formulaire, vous devrez le faire vous-même en JavaScript. Cela est relativement facile. Par exemple, vous pouvez ajouter un champ masqué et dans le
onsubmit
cas du formulaire attribuer la valeur de laspan
au champ masqué qui sera ensuite automatiquement soumis avec le formulaire.la source
Un peu de corrections. Fonctionne parfaitement dans Opera
la source
Je connais un moyen court et correct de l'implémenter avec jquery.Aucun div caché supplémentaire n'est nécessaire et fonctionne dans la plupart des navigateurs
la source
.live()
est obsolète. api.jquery.com/live Vous voudrez généralement utiliser à la.on()
place.Je ne sais pas si quelqu'un mentionne cette façon, mais dans certains cas, il est possible de redimensionner la hauteur avec des lignes Attribut
Démo
la source
white-space: nowrap;
. Lorsqu'une ligne passe à une autre ligne sans saut de ligne, la zone de texte ne sera plus ajustée correctement.Voici une directive angularjs pour la réponse de panzi.
HTML:
la source
Vous pouvez utiliser JQuery pour développer le
textarea
tout en tapant:la source
${textarea.scrollHeight}px
;});Ceux qui veulent obtenir le même résultat dans les nouvelles versions d'Angular.
Saisissez l'élément textAreaRef.
J'ajoute également un autre cas d'utilisation qui peut être utile pour certains utilisateurs qui lisent le fil, lorsque l'utilisateur souhaite augmenter la hauteur de la zone de texte à une certaine hauteur, puis l'afficher
overflow:scroll
, la méthode ci-dessus peut être étendue pour atteindre le cas d'utilisation mentionné.la source
Certaines des réponses ici ne tiennent pas compte du remplissage.
En supposant que vous avez un maxHeight que vous ne voulez pas dépasser, cela a fonctionné pour moi:
la source
Une approche encore plus simple et plus propre est la suivante:
// et le CSS
Il suffit d'ajouter la
.auto-height
classe à touttextarea
suffit vous souhaitez cibler.Testé dans FF, Chrome et Safari. Faites-moi savoir si cela ne fonctionne pas pour vous, pour quelque raison que ce soit. Mais, c'est la manière la plus propre et la plus simple que j'ai trouvée que cela fonctionne. Et ça marche très bien! :RÉ
la source
Ce code fonctionne pour coller et sélectionnez supprimer également.
Voici le JSFiddle
la source
Je recommande la bibliothèque javascript de http://javierjulio.github.io/textarea-autosize .
Par commentaires, ajoutez un exemple de bloc de code sur l'utilisation du plugin:
CSS minimum requis:
la source
MakeTextAreaResisable qui utilise qQuery
la source
Aucune des réponses ne semble fonctionner. Mais celui-ci fonctionne pour moi: https://coderwall.com/p/imkqoq/resize-textarea-to-fit-content
la source
mon implémentation est très simple, comptez le nombre de lignes en entrée (et minimum 2 lignes pour montrer que c'est une zone de texte):
exemple de travail complet avec stimulus: https://jsbin.com/kajosolini/1/edit?html,js,output
(et cela fonctionne avec la poignée de redimensionnement manuel du navigateur par exemple)
la source
La réponse acceptée fonctionne bien. Mais c'est beaucoup de code pour cette fonctionnalité simple. Le code ci-dessous fera l'affaire.
la source
Voici ce que j'ai fait en utilisant MVC HTML Helper pour TextArea. J'avais pas mal d'éléments de zone de texte, j'ai donc dû les distinguer à l'aide de l'ID de modèle.
et dans le script a ajouté ceci:
Je l'ai testé sur IE10 et Firefox23
la source
Vous pouvez utiliser ce code:
Coffescript:
Javascript
la source