Es gab einen anderen Thread darüber , den ich ausprobiert habe. Es gibt jedoch ein Problem: Das textarea
wird nicht kleiner, wenn Sie den Inhalt löschen. Ich kann keine Möglichkeit finden, es auf die richtige Größe zu verkleinern - der clientHeight
Wert wird als volle Größe des zurückgegeben textarea
, nicht als Inhalt.
Der Code von dieser Seite ist unten:
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 )
};
}
Antworten:
Dies funktioniert bei mir (Firefox 3.6 / 4.0 und Chrome 10/11):
Wenn Sie es auf jsfiddle ausprobieren möchten, beginnt es mit einer einzelnen Zeile und vergrößert nur die genau erforderliche Menge. Es ist in Ordnung für eine einzelne
textarea
, aber ich wollte etwas schreiben, wo ich viele, viele solchertextarea
s haben würde (ungefähr so viel, wie man normalerweise Zeilen in einem großen Textdokument haben würde). In diesem Fall ist es sehr langsam. (In Firefox ist es wahnsinnig langsam.) Ich hätte wirklich gerne einen Ansatz, der reines CSS verwendet. Dies wäre mit möglichcontenteditable
, aber ich möchte, dass es nur Klartext ist.quelle
style.height='auto'
. Ich vermute, die Lösung besteht darin, ein verstecktes Geschwister hinzuzufügen, das nur zur Messung verwendet wird.EINE KOMPLETTE NOCH EINFACHE LÖSUNG
Aktualisiert 14.05.2020 (Verbesserte Browserunterstützung für Handys und Tablets)
Der folgende Code funktioniert:
OPTION 1 (Mit jQuery)
Diese Option erfordert jQuery und wurde getestet und funktioniert mit 1.7.2 - 3.3.1
Einfach (Fügen Sie diesen Abfragecode zu Ihrer Master-Skriptdatei hinzu und vergessen Sie ihn.)
Test on jsfiddle
OPTION 2 (reines JavaScript)
Einfach (Fügen Sie dieses JavaScript zu Ihrer Master-Skriptdatei hinzu und vergessen Sie es.)
Test on jsfiddle
OPTION 3 (jQuery-Erweiterung)
Nützlich, wenn Sie die Textbereiche, deren Größe automatisch angepasst werden soll, weiter verketten möchten.
Rufen Sie mit auf
$('textarea').autoHeight()
AKTUALISIERUNG VON TEXTAREA ÜBER JAVASCRIPT
Wenn Sie Inhalte über JavaScript in einen Textbereich einfügen, fügen Sie den folgenden Code hinzu, um die Funktion in Option 1 aufzurufen.
PRESET TEXTAREA HÖHE
Um die Anfangshöhe des Textbereichs festzulegen, müssen Sie eine zusätzliche Bedingung hinzufügen:
quelle
this.style.height = 'auto';
ist die magische Verhaltensbehebung. Ich war so frustriert, warum sich die scrollHeight so komisch verhielt. Die Höhe auf Auto und dann die Anpassung an die scrollHeight im selben Renderzyklus beeindruckt mich immer noch davon, wie dieses Problem behoben wird, obwohl nur die zweite Höhe technisch gezeichnet werden sollte.this.style.height = 'auto';
das Verhalten von scrollHeight behoben wird? Es ist nur Magie.Die jQuery-Lösung passt das CSS an Ihre Anforderungen an
CSS ...
Javascript ...
ODER Alternative für jQuery 1.7 + ...
Ich habe eine Geige mit dem absoluten Minimum an Styling als Ausgangspunkt für Ihre Experimente erstellt ... http://jsfiddle.net/53eAy/951/
quelle
overflow-y: hidden;
dem CSS hinzufügen, um zu verhindern, dass die Bildlaufleiste kurz blinkt, wenn die Größe geändert wird.$('textarea.auto-resize').on('change cut paste drop keyup', function(){...})
Getestet in Firefox 14 und Chrom 18. Die Nummern 24 und 12 sind willkürlich. Testen Sie, was am besten zu Ihnen passt.
Sie könnten auf die Stil- und Skript-Tags verzichten, aber es wird imho etwas chaotisch (dies ist HTML + JS im alten Stil und wird nicht empfohlen).
Bearbeiten: modernisierter Code. Das onkeyup-Attribut wurde in addEventListener geändert.
Bearbeiten: Keydown funktioniert besser als Keyup
Bearbeiten: Deklarieren der Funktion vor Verwendung von
Bearbeiten: Eingabe funktioniert besser als Keydown (thnx @ WASD42 & @ MA-Maddin)
jsfiddle
quelle
input
stattdessen einfach das Ereignis. Siehe stackoverflow.com/a/14029861/1951524textarea
Unterstützung alsdocument.querySelectorAll('textarea').forEach(function(te){ te.addEventListener("input", function() { this.style.height='24px'; this.style.height=this.scrollHeight+12+'px'; }); });
removeEventListener
können Sie Ihre Ereignis-Listener nicht aufrufen und bereinigen. Dies ist besonders wichtig, wenn Sie überall in einer forEach-Schleife Ereignis-Listener erstellen. Außerdem ist aus meiner Sicht die Lesbarkeit weitaus wichtiger als die Prägnanz.box-sizing: border-box;
Stellen Sie für andere und zukünftige Personen sicher, dass die Eigenschaft festgelegt ist. Andernfalls wird der Textbereich für jedes onInput-Ereignis um 4 Pixel erweitert. Ich verbrachte ungefähr 3 Stunden, bis ich herausfand, dass dies das Problem war.Die beste Lösung (funktioniert und ist kurz) für mich ist:
Es funktioniert wie ein Zauber, ohne mit Paste zu blinken (auch mit der Maus), zu schneiden, einzutreten und auf die richtige Größe zu schrumpfen.
Bitte werfen Sie einen Blick auf jsFiddle .
quelle
Sie verwenden den höheren Wert der aktuellen clientHeight und des Inhalts scrollHeight. Wenn Sie die scrollHeight durch Entfernen von Inhalten verkleinern, kann der berechnete Bereich nicht kleiner werden, da die zuvor durch style.height festgelegte clientHeight sie offen hält. Sie können stattdessen ein Maximum () von scrollHeight und einen minimalen Höhenwert verwenden, den Sie aus textarea.rows vordefiniert oder berechnet haben.
Im Allgemeinen sollten Sie sich bei Formularsteuerelementen wahrscheinlich nicht wirklich auf scrollHeight verlassen. Abgesehen davon, dass scrollHeight traditionell weniger weit verbreitet ist als einige der anderen IE-Erweiterungen, sagt HTML / CSS nichts darüber aus, wie Formularsteuerelemente intern implementiert werden, und Sie können nicht garantieren, dass scrollHeight von Bedeutung ist. (Traditionell haben einige Browser Betriebssystem-Widgets für die Aufgabe verwendet, wodurch eine CSS- und DOM-Interaktion auf ihren Interna unmöglich wird.) Überprüfen Sie zumindest die Existenz von scrollHeight / clientHeight, bevor Sie versuchen, den Effekt zu aktivieren.
Ein anderer möglicher alternativer Ansatz, um das Problem zu vermeiden, wenn es wichtig ist, dass es breiter funktioniert, besteht darin, ein verstecktes Div zu verwenden, das auf die gleiche Breite wie der Textbereich dimensioniert und in derselben Schriftart festgelegt ist. Bei der Eingabe kopieren Sie den Text aus dem Textbereich in einen Textknoten in verstecktem div (denken Sie daran, '\ n' durch einen Zeilenumbruch zu ersetzen und '<' / '&' ordnungsgemäß zu maskieren, wenn Sie innerHTML verwenden). Wenn Sie dann einfach den Versatz des Div messen, erhalten Sie die Höhe, die Sie benötigen.
quelle
scrollHeight
Textbereichen auftreten? Funktioniert gut mit aktuellen Versionen von IE, Firefox und Opera ...Wenn Sie IE8 nicht unterstützen müssen, können Sie das
input
Ereignis verwenden:Jetzt müssen Sie nur noch CSS hinzufügen und fertig:
Verwendungszweck:
Weitere Informationen zur Funktionsweise finden Sie in meinem Blogbeitrag .
quelle
input
Ereignis während der Initialisierung in jedem Zyklus auslösen .Automatische skalierung
https://github.com/jackmoore/autosize
Just Works, Standalone, ist beliebt (3.0k + GitHub-Stars ab Oktober 2018), verfügbar auf CDNJs ) und leicht (~ 3.5k). Demo:
Übrigens, wenn Sie den ACE-Editor verwenden, verwenden Sie
maxLines: Infinity
: Passen Sie die Höhe automatisch an den Inhalt im Ace Cloud 9-Editor anquelle
autosize
Plugin erlaubt keine manuelle Größenänderung mithilfe des Größenänderungssymbols im Textbereich.Ich habe von hier aus einen Einzeiler gefunden .
quelle
Hat jemand als inhaltsbearbeitbar angesehen? Kein Herumspielen mit dem Scrollen, und das einzige JS, das ich daran mag, ist, wenn Sie vorhaben, die Daten bei Unschärfe zu speichern ... und anscheinend ist es mit allen gängigen Browsern kompatibel: http://caniuse.com/#feat = inhaltsbearbeitbar
Gestalte es einfach so, dass es wie ein Textfeld aussieht, und es wird automatisch angepasst ... Machen Sie seine minimale Höhe zur bevorzugten Texthöhe und haben Sie es.
Das Coole an diesem Ansatz ist, dass Sie einige Browser speichern und mit Tags versehen können.
http://jsfiddle.net/gbutiri/v31o8xfo/
quelle
contenteditable
ist gut, aber wenn Sie Klartext wollen, braucht es eine Reihe von Optionen wie-webkit-user-modify: read-write-plaintext-only
undwhite-space: pre-wrap
.[dom-element].innerText
. @WebmasterG IMHO wäre es schön, jquery (aus Gründen der Transparenz) wegzulassen und das Beispiel auf dieser Seite über ein ausführbares Code-Snippet anstelle von jsfiddle aufzunehmen.Ich habe den folgenden Code für mehrere Textbereiche verwendet. Funktioniert problemlos in Chrome 12, Firefox 5 und IE 9, auch wenn in den Textbereichen Aktionen zum Löschen, Ausschneiden und Einfügen ausgeführt werden.
quelle
Es gibt einen etwas anderen Ansatz.
Die Idee ist, den Text von
textarea
in das zu kopierenpre
und CSS sicherstellen zu lassen, dass sie dieselbe Größe haben.Der Vorteil besteht darin, dass Frameworks einfache Tools zum Verschieben von Text bieten, ohne Ereignisse zu berühren. In AngularJS würden Sie nämlich ein
ng-model="foo" ng-trim="false"
zumtextarea
undng-bind="foo + '\n'"
zum hinzufügenpre
. Sehen Sie eine Geige .Stellen Sie einfach sicher, dass
pre
die Schriftgröße dieselbe ist wie dietextarea
.quelle
pre
die gleiche Schriftgröße wie dietextarea
" - Sie benötigen die gleicheline-height
und die gleiche Menge vonpadding
und / oderborder
auch. Dies ist die beste Lösung für Angular.Das Folgende funktioniert zum Ausschneiden, Einfügen usw., unabhängig davon, ob diese Aktionen über die Maus, eine Tastenkombination oder die Auswahl einer Option in einer Menüleiste ausgeführt werden. Mehrere Antworten verfolgen einen ähnlichen Ansatz, berücksichtigen jedoch nicht die Box- Größe, weshalb sie den Stil falsch anwenden
overflow: hidden
.Ich mache folgendes, was auch gut mit
max-height
undrows
für minimale und maximale Höhe funktioniert .Der Vollständigkeit halber sollten Sie die
adjust
Funktion unter folgenden Umständen aufrufen :textarea
Fenster mit der Fenstergröße ändert, oder andere Ereignisse, die die Breite des Textbereichs änderntextarea
'display
ändert, z. B. wenn es von gehtnone
(versteckt) nach wechseltblock
textarea
programmgesteuert geändert wirdBeachten Sie, dass das Verwenden
window.getComputedStyle
oder AbrufencurrentStyle
etwas rechenintensiv sein kann. Daher möchten Sie möglicherweise stattdessen das Ergebnis zwischenspeichern.Funktioniert für IE6, also hoffe ich wirklich, dass die Unterstützung gut genug ist.
quelle
Als anderen Ansatz können Sie einen verwenden,
<span>
der seine Größe automatisch anpasst. Sie müssen es bearbeitbar machen, indem Sie diecontenteditable="true"
Eigenschaft hinzufügen, und fertig:Das einzige Problem bei diesem Ansatz ist, dass Sie, wenn Sie den Wert als Teil des Formulars senden möchten, dies selbst in JavaScript tun müssen. Dies ist relativ einfach. Sie können beispielsweise ein ausgeblendetes Feld hinzufügen und im
onsubmit
Falle des Formulars den Wert vonspan
dem ausgeblendeten Feld zuweisen, das dann automatisch mit dem Formular gesendet wird.quelle
Ein bisschen Korrekturen. Funktioniert perfekt in Opera
quelle
Ich kenne eine kurze und korrekte Methode, um dies mit jquery zu implementieren. Kein zusätzliches verstecktes div erforderlich und funktioniert in den meisten Browsern
quelle
.live()
ist veraltet. api.jquery.com/live Sie möchten im Allgemeinen.on()
stattdessen verwenden.Ich weiß nicht, ob jemand dies erwähnt, aber in einigen Fällen ist es möglich, die Höhe mit dem Zeilenattribut zu ändern
Demo
quelle
white-space: nowrap;
. Wenn eine Zeile ohne Zeilenumbruch in eine andere Zeile umgebrochen wird, wird der Textbereich nicht mehr richtig angepasst.Hier ist eine eckige Direktive für Panzis Antwort.
HTML:
quelle
Sie können JQuery verwenden, um das zu erweitern
textarea
während der Eingabe :quelle
${textarea.scrollHeight}px
;});Diejenigen, die dasselbe in neuen Versionen von Angular erreichen wollen.
Schnapp dir textArea elementRef.
Ich füge auch einen weiteren Anwendungsfall hinzu, der für einige Benutzer, die den Thread lesen, nützlich sein kann. Wenn der Benutzer die Höhe des Textbereichs auf eine bestimmte Höhe erhöhen und dann darauf setzen möchte,
overflow:scroll
kann die oben beschriebene Methode erweitert werden, um den genannten Anwendungsfall zu erreichen.quelle
Einige der Antworten hier berücksichtigen nicht das Auffüllen.
Vorausgesetzt, Sie haben eine maximale Höhe, die Sie nicht überschreiten möchten, hat dies für mich funktioniert:
quelle
Ein noch einfacherer und sauberer Ansatz ist folgender:
// und das CSS
Alles, was benötigt wird, ist das Hinzufügen der
.auto-height
Klasse zu einer beliebigentextarea
Sie abzielen möchten.Getestet in FF, Chrome und Safari. Lassen Sie mich wissen, wenn dies aus irgendeinem Grund bei Ihnen nicht funktioniert. Aber dies ist der sauberste und einfachste Weg, auf dem ich festgestellt habe, dass dies funktioniert. Und es funktioniert super! : D.
quelle
Dieser Code funktioniert zum Einfügen und wählen Sie auch Löschen.
Hier ist die JSFiddle
quelle
Ich empfehle die Javascript-Bibliothek von http://javierjulio.github.io/textarea-autosize .
Fügen Sie pro Kommentar einen Beispielcodeblock zur Verwendung des Plugins hinzu:
Erforderliches Mindest-CSS:
quelle
MakeTextAreaResisable, das qQuery verwendet
quelle
Keine der Antworten scheint zu funktionieren. Aber dieser funktioniert für mich: https://coderwall.com/p/imkqoq/resize-textarea-to-fit-content
quelle
Meine Implementierung ist sehr einfach. Zählen Sie die Anzahl der Zeilen in der Eingabe (und mindestens 2 Zeilen, um zu zeigen, dass es sich um einen Textbereich handelt):
Vollständiges Arbeitsbeispiel mit Stimulus: https://jsbin.com/kajosolini/1/edit?html,js,output
(und dies funktioniert zum Beispiel mit dem manuellen Größenänderungshandle des Browsers)
quelle
Akzeptierte Antwort funktioniert gut. Aber das ist viel Code für diese einfache Funktionalität. Der folgende Code reicht aus.
quelle
Folgendes habe ich getan, als ich MVC HTML Helper für TextArea verwendet habe. Ich hatte einige Textbereichselemente und musste sie anhand der Modell-ID unterscheiden.
und im Skript hinzugefügt dies:
Ich habe es auf IE10 und Firefox23 getestet
quelle
Sie können diesen Code verwenden:
Coffescript:
Javascript
quelle