Ich arbeite derzeit an einer internen Vertriebsanwendung für das Unternehmen, für das ich arbeite, und ich habe ein Formular, mit dem der Benutzer die Lieferadresse ändern kann.
Jetzt denke ich, dass es viel schöner aussehen würde, wenn der Textbereich, den ich für die Hauptadressdetails verwende, nur den Bereich des darin enthaltenen Textes einnimmt und die Größe automatisch ändert, wenn der Text geändert wird.
Hier ist ein Screenshot davon.
Irgendwelche Ideen?
@ Chris
Ein guter Punkt, aber es gibt Gründe, warum ich möchte, dass die Größe geändert wird. Ich möchte, dass der Bereich, den es einnimmt, der Bereich der darin enthaltenen Informationen ist. Wie Sie im Screenshot sehen können, nimmt ein fester Textbereich, wenn ich einen festen Textbereich habe, ziemlich viel vertikalen Raum ein.
Ich kann die Schriftart reduzieren, aber die Adresse muss groß und lesbar sein. Jetzt kann ich den Textbereich verkleinern, aber dann habe ich Probleme mit Leuten, die eine Adresszeile haben, die 3 oder 4 (eine nimmt 5) Zeilen dauert. Die Notwendigkeit, dass der Benutzer eine Bildlaufleiste verwendet, ist ein wichtiges Nein-Nein.
Ich denke, ich sollte etwas genauer sein. Ich bin nach vertikaler Größenänderung und die Breite ist nicht so wichtig. Das einzige Problem, das dabei auftritt, ist, dass die ISO-Nummer (die große "1") unter die Adresse verschoben wird, wenn die Fensterbreite zu klein ist (wie Sie auf dem Screenshot sehen können).
Es geht nicht darum, eine Spielerei zu haben; Es geht darum, ein Textfeld zu haben, das der Benutzer bearbeiten kann und das nicht unnötig Platz beansprucht, sondern den gesamten Text darin anzeigt.
Wenn jemand einen anderen Weg findet, um das Problem anzugehen, bin ich auch dafür offen.
Ich habe den Code ein wenig geändert, weil er etwas seltsam war. Ich habe es geändert, um es beim Keyup zu aktivieren, da es das gerade eingegebene Zeichen nicht berücksichtigt.
resizeIt = function() {
var str = $('iso_address').value;
var cols = $('iso_address').cols;
var linecount = 0;
$A(str.split("\n")).each(function(l) {
linecount += 1 + Math.floor(l.length / cols); // Take into account long lines
})
$('iso_address').rows = linecount;
};
Antworten:
Facebook tut dies, wenn Sie an die Wände von Personen schreiben, die Größe jedoch nur vertikal ändern.
Die horizontale Größenänderung scheint mir aufgrund von Zeilenumbrüchen, langen Zeilen usw. ein Chaos zu sein, aber die vertikale Größenänderung scheint ziemlich sicher und nett zu sein.
Keiner der Facebook-Neulinge, die ich kenne, hat jemals etwas darüber erwähnt oder war verwirrt. Ich würde dies als anekdotischen Beweis verwenden, um zu sagen: "Mach weiter, implementiere es".
Dazu JavaScript-Code mit Prototype (weil ich damit vertraut bin):
PS: Offensichtlich ist dieser JavaScript-Code sehr naiv und nicht gut getestet, und Sie möchten ihn wahrscheinlich nicht für Textfelder mit Romanen verwenden, aber Sie haben eine allgemeine Vorstellung davon.
quelle
<textarea cols='5'>0 12345 12345 0</textarea>
. (Ich habe eine nahezu identische Implementierung geschrieben und diese erst nach einem Monat der Verwendung abgefangen.) Auch bei Leerzeilen schlägt dies fehl.Eine Verfeinerung einiger dieser Antworten besteht darin, CSS mehr von der Arbeit machen zu lassen.
Die Grundroute scheint zu sein:
textarea
und ein verstecktesdiv
textarea
Inhalt von Javascript mit dem synchronisiertdiv
'sdiv
, vermeiden wir das explizite Festlegen dertextarea
Höhe.quelle
var text = $("#textArea").val().replace(/\n/g, '<br/>') + ' ';
stellt sicher, dass Sie kein ruckeliges Verhalten bekommen, wenn Sie von einer leeren neuen Zeile am Ende des Textbereichs zu einer nicht leeren wechseln, da das versteckte div sicherstellt, dass es in den nbsp umbrochen wird.Hier ist eine andere Technik zum automatischen Ändern eines Textbereichs.
Code: (einfaches Vanille-JavaScript)
Demo: (verwendet jQuery, Ziele in dem Textbereich, in den ich gerade tippe - wenn Sie Firebug installiert haben, fügen Sie beide Beispiele in die Konsole ein und testen Sie auf dieser Seite)
quelle
clientHeight
undscrollHeight
gleich ist, können Sie diese Methode nicht verwenden, wenn Ihr Textbereich sowohl verkleinert als auch vergrößert werden soll.if (text.clientHeight == text.scrollHeight) text.style.height = "20px";
Wahrscheinlich die kürzeste Lösung:
Auf diese Weise brauchen Sie keine versteckten Divs oder ähnliches.
Hinweis:
this.style.height = (this.scrollHeight) + "px";
Je nachdem, wie Sie den Textbereich gestalten (Zeilenhöhe, Polsterung und dergleichen), müssen Sie möglicherweise damit spielen .quelle
keyup
könnte genug sein, aber ich bin nicht sicher. Ich war so glücklich, dass ich es herausgefunden habe, dass ich aufgehört habe, etwas anderes auszuprobieren.Hier ist eine Prototypversion der Größenänderung eines Textbereichs, die nicht von der Anzahl der Spalten im Textbereich abhängt. Dies ist eine überlegene Technik, da Sie damit den Textbereich über CSS steuern und über einen Textbereich mit variabler Breite verfügen können. Zusätzlich zeigt diese Version die Anzahl der verbleibenden Zeichen an. Obwohl nicht angefordert, ist es eine ziemlich nützliche Funktion und kann leicht entfernt werden, wenn sie unerwünscht ist.
Erstellen Sie das Widget durch Aufrufen
new Widget.Textarea('element_id')
. Die Standardoptionen können überschrieben werden, indem sie als Objekt übergeben werden, znew Widget.Textarea('element_id', { max_length: 600, min_height: 50})
. Wenn Sie es für alle Textbereiche auf der Seite erstellen möchten, gehen Sie wie folgt vor:quelle
Hier ist eine Lösung mit
JQuery
:abc
ist einteaxtarea
.quelle
Überprüfen Sie den folgenden Link: http://james.padolsey.com/javascript/jquery-plugin-autoresize/
quelle
Wenn ich das noch einmal betrachte, habe ich es ein bisschen aufgeräumter gemacht (obwohl jemand, der mit Prototype / JavaScript voll ist , Verbesserungen vorschlagen könnte?).
Einfach anrufen mit:
quelle
Ich habe etwas ganz einfaches gemacht. Zuerst habe ich die TextArea in einen DIV gelegt. Zweitens habe ich die
ready
Funktion für dieses Skript aufgerufen .Einfach. Dies ist die maximale Höhe des Div nach dem Rendern, geteilt durch die Höhe einer TextArea einer Zeile.
quelle
Ich brauchte diese Funktion für mich selbst, aber keiner von hier funktionierte so, wie ich sie brauchte.
Also habe ich Orions Code verwendet und ihn geändert.
Ich habe eine Mindesthöhe hinzugefügt, damit es bei der Zerstörung nicht zu klein wird.
quelle
Wie die Antwort von @memical.
Ich habe jedoch einige Verbesserungen gefunden. Sie können die jQuery-
height()
Funktion verwenden. Beachten Sie jedoch die Pixel oben und unten. Andernfalls wächst Ihr Textbereich zu schnell.quelle
Meine Lösung, bei der jQuery nicht verwendet wird (weil sie manchmal nicht dasselbe sein müssen), ist unten aufgeführt. Obwohl es nur in Internet Explorer 7 getestet wurde , kann die Community auf alle Gründe hinweisen, aus denen dies falsch ist:
Bisher gefällt mir die Funktionsweise sehr gut, und andere Browser interessieren mich nicht. Daher werde ich sie wahrscheinlich auf alle meine Textbereiche anwenden:
quelle
Hier ist eine Erweiterung des Prototyp-Widgets, das Jeremy am 4. Juni veröffentlicht hat:
Es verhindert, dass der Benutzer mehr Zeichen eingibt, wenn Sie in Textbereichen Grenzwerte verwenden. Es wird geprüft, ob noch Zeichen vorhanden sind. Wenn der Benutzer Text in den Textbereich kopiert, wird der Text bei max. Länge:
quelle
@memical hatte eine großartige Lösung zum Festlegen der Höhe des Textbereichs beim Laden von Seiten mit jQuery, aber für meine Anwendung wollte ich die Höhe des Textbereichs erhöhen können, wenn der Benutzer mehr Inhalt hinzufügte. Ich habe die Lösung von memical wie folgt aufgebaut:
Es ist nicht sehr flüssig, aber es ist auch keine Anwendung für Kunden, sodass Glätte keine Rolle spielt. (Wäre dies für Kunden vorgesehen, hätte ich wahrscheinlich nur ein jQuery-Plugin mit automatischer Größenänderung verwendet.)
quelle
Für diejenigen, die für IE codieren und auf dieses Problem stoßen. IE hat einen kleinen Trick, der es zu 100% CSS macht.
Sie können sogar einen Wert für rows = "n" angeben, den der IE ignoriert, andere Browser jedoch verwenden. Ich hasse Codierung, die IE-Hacks implementiert, aber diese ist sehr hilfreich. Es ist möglich, dass es nur im Quirks-Modus funktioniert.
quelle
Benutzer von Internet Explorer, Safari, Chrome und Opera müssen daran denken, den Wert für die Zeilenhöhe in CSS explizit festzulegen. Ich mache ein Stylesheet, das die anfänglichen Eigenschaften für alle Textfelder wie folgt festlegt.
quelle
Hier ist eine Funktion, die ich gerade in jQuery geschrieben habe, um dies zu tun - Sie können sie auf Prototype portieren , aber sie unterstützen nicht die "Lebendigkeit" von jQuery, sodass Elemente, die durch Ajax-Anforderungen hinzugefügt wurden, nicht antworten.
Diese Version wird nicht nur erweitert, sondern auch verkleinert, wenn Löschen oder Rücktaste gedrückt wird.
Diese Version basiert auf jQuery 1.4.2.
Genießen ;)
http://pastebin.com/SUKeBtnx
Verwendung:
oder (ein beliebiger jQuery-Selektor zum Beispiel)
Es wurde mit Internet Explorer 7 / Internet Explorer 8 , Firefox 3.5 und Chrome getestet . Alles funktioniert gut.
quelle
Gehen Sie mit ASP.NET einfach so vor:
quelle