Ach, <textarea>. Wie viele Eigenheiten du besitzt. Hier ist eine Sammlung von neun Dingen, die du vielleicht mit Textareas machen möchtest. Viel Spaß.
1. Bild als Textarea-Hintergrund, verschwindet, wenn Text eingegeben wird.

Du kannst einem Textarea ein Hintergrundbild hinzufügen, wie jedem anderen Element auch. In diesem Fall ist das Bild eine freundliche Erinnerung, nett zu sein =). Wenn du ein Hintergrundbild hinzufügst, kann es aus irgendeinem Grund die Standardformatierung des Browsers für das Textarea unterbrechen. Der Standard-1px-solide-dunklere-Rand wird durch einen dickeren, abgeschrägten Rand ersetzt. Um den Standard des Browsers wiederherzustellen, kannst du den Rand einfach wieder normal erzwingen.
textarea {
background: url(images/benice.png) center center no-repeat; /* This ruins default border */
border: 1px solid #888;
}
Dieses Hintergrundbild kann die Lesbarkeit des Textes beeinträchtigen, sobald der Text diesen Bereich erreicht. Hier ist ein jQuery-Code, der den Hintergrund entfernt, wenn das Textarea im Fokus ist, und ihn wieder hinzufügt, wenn das Textarea ohne Text verlassen wird.
$('textarea')
.focus(function() { $(this).css("background", "none") })
.blur(function() { if ($(this)[0].value == '') { $(this).css("background", "url(images/benice.png) center center no-repeat") } });
2. HTML5 Platzhaltertext

Es gibt ein neues Attribut als Teil von HTML5-Formularen namensplaceholder. Es zeigt verblassten grauen Text im Textarea (funktioniert auch für Texteingabefelder), der verschwindet, wenn das Textarea im Fokus ist oder einen Wert hat.
<textarea placeholder="Remember, be nice!" cols="30" rows="5"></textarea>
HTML5-Platzhaltertext funktioniert in Safari 5, Mobile Safari, Chrome 6 und der Firefox 4 Alpha.
3. Platzhaltertext, HTML5 mit jQuery-Fallback
Wir können leicht testen, ob ein bestimmtes Element ein bestimmtes Attribut unterstützt, indem wir es mit JavaScript testen.
function elementSupportsAttribute(element, attribute) {
var test = document.createElement(element);
if (attribute in test) {
return true;
} else {
return false;
}
};
Dann können wir Code schreiben, so dass, wenn der Browser das Platzhalterattribut unterstützt, wir es verwenden, und wenn nicht, simulieren wir das Verhalten mit jQuery.
if (!elementSupportsAttribute('textarea', 'placeholder')) {
// Fallback for browsers that don't support HTML5 placeholder attribute
$("#example-three")
.data("originalText", $("#example-three").text())
.css("color", "#999")
.focus(function() {
var $el = $(this);
if (this.value == $el.data("originalText")) {
this.value = "";
}
})
.blur(function() {
if (this.value == "") {
this.value = $(this).data("originalText");
}
});
} else {
// Browser does support HTML5 placeholder attribute, so use it.
$("#example-three")
.attr("placeholder", $("#example-three").text())
.text("");
}
4. Den blauen Schein entfernen

Alle WebKit-Browser, Firefox 3.6 und Opera 10 umranden Textareas mit einem leuchtenden blauen Rand, wenn sie im Fokus sind. Du kannst ihn bei WebKit-Browsern wie folgt entfernen:
textarea {
outline: none;
}
Du könntest ihn auch auf den :focus-Stil anwenden, aber es funktioniert so oder so. Ich habe noch keinen Weg gefunden, ihn von Firefox oder Opera zu entfernen, aber-moz-outline-stylewar ungefähr so weit, wie ich getestet habe.
ERINNERUNG: Der blaue Schein wird zu einem starken Standard und das Brechen dieses Standards ist typischerweise schlecht für deine Benutzer. Wenn du es tust, solltest du einen verdammt triftigen Grund dafür haben und einen ähnlich starken :focus-Stil.
5. Größenänderungsgriff entfernen

WebKit-Browser fügen am unteren rechten Rand von Textareas ein kleines UI-Element hinzu, das Benutzer zum Vergrößern und Verkleinern eines Textareas verwenden können. Wenn du das aus irgendeinem Grund entfernen möchtest, reicht CSS aus:
textarea {
resize: none;
}
6. Größenänderungsgriff hinzufügen

jQuery UI bietet eine Resizable-Interaktion, die auf Textareas angewendet werden kann. Sie funktioniert in allen Browsern und überschreibt die native WebKit-Version, da diese Version alle Arten von schicken Funktionen hat (wie Callbacks und Animationen).
Um sie zu verwenden, lade jQuery und jQuery UI auf deiner Seite und auf der grundlegendsten Ebene rufst du sie so auf:
$("textarea").resizable();
7. Automatische Größenanpassung an den Inhalt

James Padolsey hat ein super nettes jQuery-Skript für automatisch größenveränderliche Textareas (Das war mal im Internet und mal nicht, also hier ist ein Backup.)
Hier ist ein weiteres von Louis Lazeris, das auch Links zu anderen Optionen enthält. Es funktioniert genau so, wie du es dir wahrscheinlich wünschst. Das Textarea beginnt mit einer normalen, angemessenen Größe. Während du mehr und mehr Inhalt eingibst, erweitert sich das Textarea, um all diesen Text aufzunehmen, anstatt eine Scrollleiste auszulösen, wie es der Standard ist.
Das Plugin hat eine Vielzahl von Optionen, aber im einfachsten Fall lädst du jQuery, die Plugin-Datei und rufst es so auf:
$('textarea').autoResize();
Ein weiterer Trick hier ist, gar kein <textarea> zu verwenden, sondern <div contenteditable>. Das wächst automatisch ohne ausgefallene JavaScript-Hilfe – außer dass es kein echtes Formularelement mehr ist, sodass du JavaScript benötigst, um den Wert zu extrahieren/zu senden.
8. Kein Umbruch

Um zu verhindern, dass Text normal in CSS umgebrochen wird, verwendest du#whatever { white-space: nowrap; }. Aber aus irgendeinem Grund funktioniert das nicht mit Textareas. Wenn du in Textareas tippen möchtest und stattdessen lieber keine Zeilenumbrüche haben möchtest, bis du Enter drückst (stattdessen wird eine horizontale Scrollleiste ausgelöst), musst du daswrap="off"Attribut verwenden.
<textarea wrap="off" cols="30" rows="5"></textarea>
9. Standardmäßige Scrollbalken in Internet Explorer entfernen

IE fügt standardmäßig eine vertikale Scrollleiste zu allen Textareas hinzu. Du kannst sie mitoverflow: hiddenausblenden, aber dann erhältst du keine Scrollbalken mehr, wenn sich der Text erweitert. Glücklicherweise funktioniert auto-overflow, um die Scrollleiste zu entfernen und sie trotzdem einzublenden, wenn sie benötigt wird.
textarea {
overflow: auto;
}
Alle oben genannten Beispiele können hier eingesehen werden.
Dies ist einer der informativsten Beiträge, Chris. Ich wollte wirklich mehr über Textareas wissen und dies ist einer der seltenen Beiträge, der ihnen allein gewidmet ist :D Danke vielmals.
Sehr, sehr nützliche Tipps! Danke! (Das sind 3 „sehr“)
Hoppla... sehr.
Du bist super Chris... danke.
Gute Sachen zu wissen!
Ich denke, dass die Verwendung von jQuery für das Textarea nicht notwendig ist. Ich würde eher CSS-Pseudoklassen verwenden (Hover, active, focus...).
Alles, wofür jQuery in diesem Artikel verwendet wurde, war speziell für etwas, das CSS allein nicht kann.
Du sagst es! Haha
Du kannst dasselbe mit :focus tun, was redest du von "kann CSS nicht alleine tun".
Teste es, bitte sehr.
.text {background-color:#FFF;color:#000;}
.text:focus {background-color:#000;color:#FFF;}
Das Hintergrundbild bleibt entfernt, wenn Text im Textarea vorhanden ist. Dieser Text-Test kann nur mit JavaScript durchgeführt werden.
Hm... obwohl ich zugebe, dass es nicht browserübergreifend ist, aber es gibt *:empty, oder?
JS wird verwendet, um festzustellen, ob Text vorhanden ist oder nicht, wenn der Fokus vom Textarea entfernt wird, und gibt den Hintergrund nur zurück, wenn das Textarea keinen Text hat.
:empty, aber nicht browserübergreifend.
Wunderbarer Artikel, ich finde ihn sehr hilfreich. Tolle Informationen und Details!
Für #4 denke ich, dass dies tatsächlich ein Zugänglichkeitsaspekt für Leute ist, die mit der Tabulatortaste durch ein Formular navigieren, dasselbe wie gepunktete Linien um Links.
Aber es ist in Ordnung, solange du ein :focus-Verhalten hinzufügst.
Wow, alle Tipps auf einmal, danke Chris
Gute Sachen, Chris, aber nur eine Sache: Firefox 3.6 hat keinen blauen Schein auf Textareas im Fokus. Ich möchte auch darauf hinweisen, dass es für dein erstes Beispiel gut ist, einen CSS-Fallback mit der :focus-Pseudoklasse zu geben.
Ansonsten werde ich definitiv einige davon in Zukunft verwenden, besonders die automatische Größenanpassung.
Auf meiner Mac-Version tut es das, vielleicht ist das eine Mac-spezifische Sache?
Chrome unter Windows setzt einen gelb-orangen Schein um das Textfeld.
Nun, zumindest bekommt dein Kommentartextfeld keinen gelb-orangenen Schein in Chrome (Windows). Ich schätze, du benutzt diese Tricks auch auf CSS-Tricks ^^
Ja, das ist eine Mac-spezifische Sache. Andere Betriebssysteme haben standardmäßig unterschiedliche Wege, um anzuzeigen, welches Element fokussiert ist.
Der blau-ähnliche Schein ist nur in Safari :)
Wie Sumeet sagt, machen andere Browser unterschiedliche Dinge, einige wie Chrome verwenden einen anderen Schein.
Der Schein in Chrome hängt auch vom verwendeten Thema ab, glaube ich ;-)
Das ändert sich auf jedem Theme/Plattform, weil XUL versucht, Systemstile für Eingaben zu verwenden.
Die Hälfte dieser Tricks habe ich bereits auf die harte Tour selbst entdeckt, aber es ist immer gut, diese kleinen Dinge zu lernen, die einen Unterschied für den Benutzer machen können.
Danke für all diese Ressourcen, Chris!
Schau dir mein Kontaktformular an
http://bit.ly/b6GSWE
Es ist hübsch.
Dem fehlen sehr viele Sicherheitsmaßnahmen. Hier auf CSS-Tricks.com gab es mehrere Artikel dazu und Version nach Version war dies das Endergebnis.
Meiner Meinung nach viel besser und das Endergebnis für den Benutzer und den E-Mail-Client ist ungefähr dasselbe.
Ich habe den Code von dort verwendet, um das Formular zu erstellen... Hoffentlich fehlen ihm nicht zu viele Dinge.
Wow, vielen Dank Chris!
Danke fürs Teilen, Chris!
Nett. Danke. Und wie immer: sehr nutzbare Tipps.
Offtopic: Ich habe mir gerade die Website von James Padolsey angesehen und mir gefällt der Scroll-Effekt des Hintergrunds sehr gut. Weißt du, wie das gemacht wird?
Gruß
jQuery, das ist sicher, und ich denke, mit diesem Code-Schnipsel :)
Danke. Ich werde das ausprobieren...
Danke fürs Teilen. Sehr hilfreich.
Manche dieser "Tricks" sind sehr nützlich, andere nicht...
1.a ist schön, 1.b (Hintergrund bei Fokus entfernen) kann mit textarea:focus {} background.image: none } ohne JS erledigt werden ;)
2./3. HTML5 rockt :)
4. Wie erwähnt, sollte das nicht getan werden...
5. Ähm... warum?
6./7./8./9. Diese Tricks sind wirklich nützlich :) Danke dafür!
@4: Viele Leute/Kunden mögen keinen Schein.
@5: Viele Leute versuchen, die Größenänderungsbox zu entfernen, da die Größenänderung manchmal das Layout des Designs ruiniert. Daher kann es auch sehr nützlich sein.
Oh Mann, Chris, du kannst dir nicht vorstellen, wie sehr IE mir mit overflow zu schaffen gemacht hat. Ich habe immer overflow:hidden verwendet und irgendwie gehofft, dass die Leute nicht zurückscrollen, weil ich die automatische Scrollleiste wirklich gehasst habe, die immer da war, auch ohne Text. Ich habe die Möglichkeit overflow:auto völlig übersehen. Vielen Dank! Viel viel Schmerz erspart!
Danke für die nützlichen Tipps!
Danke, Chris!
Toller Artikel.
Sind diese standardmäßig mit jQuery enthalten oder ist das eine Art Plugin für Textareas?
Toller Artikel, danke :)
Du kannst den Fokusring in Firefox deaktivieren, indem du -moz-appearance: none setzt, oder indem du einen Hintergrund oder einen Rand für das Textarea setzt: dies überschreibt auch das native Aussehen.
Danke!
Super coole Sachen!
Danke für die Mühe :)
Toller Artikel, Chris! Informativ und lesenswert.
Ich würde eine Optimierung für die Funktion elementSupportsAttribute vorschlagen.
Dies bringt keine nennenswerten Leistungssteigerungen, aber es zeigt, was wir alle beim Programmieren mit JavaScript lieben.
Ja, das ist interessant!
Ja, nun, ich sehe keinen Sinn in all dem.
Sehr schön... nützlich.
Chris, kann ich eine Demo sehen?
Sicher.
https://css-tricks.de/examples/TextareaTricks/
Eine Sammlung von Tricks für Textareas, einige kannte ich noch nicht. Danke fürs Posten.
Toller Artikel,
es macht Spaß, Tipps zu erhalten, die sich auf ein einziges Element konzentrieren.
Das sind die Arten von Artikeln, die ich genieße.
Ausgezeichneter Artikel, zu den Favoriten hinzugefügt, mach weiter so.
Schöne Tricks... danke fürs Teilen, Chris!
Danke für "resize: none;"! Das wusste ich tatsächlich nicht :)
Statt
var test = document.createElement(element);
if (attribute in test) {
return true;
} else {
return false;
}
Du kannst einfach
var test = document.createElement(element);
return (attribute in test);
Oder vielleicht sogar
return (attribute in document.createElement(element))
Und schließlich hast du all das zusammengefasst, Chris!
Ich habe damals etwa 2-3 Tage damit verbracht, Lösungen für 1, 2, 4, 5, 7, 9 zu finden....
Danke für dieses schöne Tutorial :D
Das ist seltsam! Ich habe gestern tatsächlich nach einer Anleitung gesucht, wie man das macht! Danke Chris :D
Ich entferne normalerweise die horizontale Größenänderung.
textarea { resize:none; /* Safari */ resize:vertical; /* Chrome */ }Und ich hasse kleine Textareas mit nur 4 Zeilen (was viele Seiten aus seltsamen Gründen verwenden).
Genau das habe ich gesucht, danke :)
Das ist einfach nur bescheuert.
$(this)[0].valueDas solltest du stattdessen verwenden:
this.valuediesenist ein Schlüsselwort in JavaScript (wie in vielen anderen Programmier-/Skriptsprachen) und bezieht sich auf das "Besitzer"-Objekt des aktuell ausgeführten Codes. In diesem Fall,diesenbezieht sich auf das Textarea-DOM-Objekt undvalueist eine seiner nativen Eigenschaften.
Was du getan hast, ist, dass du jQuery gesagt hast, nimm dieses Objekt ($(this)), packe es in eine jQuery-Sammlung, greife auf das erste Element dieser Sammlung zu ($(this)[0]) und greife dann auf dasvalueAttribut dieses Objekts zu ($(this)[0].value), anstatt einfach direkt auf das Attribut zuzugreifen (this.value), ohne jQuery einzuschalten!
Du solltest wirklich etwas JavaScript und jQuery lernen, bevor du versuchst, anderen etwas beizubringen!
Und noch etwas... Der
-Tag ist aus einem Grund ein Inline-Tag! Würde mein vorheriger Kommentar nicht besser aussehen, wenn du das Standardverhalten dieses Tags unverändert gelassen hättest?Pfff... Noch mehr "Genialität".
var $el = $(this);
// console.log($el.text(), "value: " + $el.attr("val"));
Du hast wirklich den längsten Weg zu diesem Attribut des Elementwerts gewählt...
Kürzer als
$el.attr(“val”)
wäre gewesen
$el.val()
oder (immer noch schlecht)
$el[0].value
oder (am besten)
this.value
…
Für die hilfreichen Teile deines Kommentars
Großartig, danke! Du hast Recht, ich werde den Code bearbeiten, um ihn effizienter zu gestalten. Ich weiß es eigentlich besser, manchmal mache ich es schnell, bekomme es zum Laufen und gehe nicht zurück, um es aufzuräumen.
Für die unhöflichen Teile
Du solltest versuchen, weniger unhöflich zu sein!
Ich wusste nichts vom HTML5-Platzhalter-Tag oder JQuerys Resizable, vielen Dank, dass du diese hervorgehoben hast.
Ja. Ich auch nicht. Ich liebe es, diese Seite zu besuchen, weil ich immer etwas Neues lerne.
Danke für das Posten des Artikels, habe ein paar Tipps mitgenommen, die ich vorher nicht kannte!
Danke Chris!!! Das sollte auf jeden Fall in die Lesezeichen aufgenommen werden.
Schöne Tipps... Ich habe wirklich etwas sehr Wichtiges über Textareas im Frontend-Kontext gelernt.
Wenn du einen allgemeineren jQuery-Fallback für das HTML5-Platzhalterattribut möchtest, kannst du gerne mein Platzhalter-jQuery-Plugin verwenden.
Schöner Spam.
Dieser Beitrag hat mir sehr geholfen, obwohl ich einige der oben genannten Tricks kannte, aber die Platzhalter-Tricks waren die, die ich sehr nützlich fand, da ich HTML5 noch nicht berührt habe.
Danke für die so schön dokumentierten CSS-Tricks für das Textarea-Tag.
#4 auf dem iPhone entfernt den inneren Schatten bei Textfeldern. Sowohl im Fokus- als auch im Nicht-Fokus-Zustand.
Ich habe eine Frage zum neuen "Platzhaltertext".
Wird dieser Text im POST/GET-Array übergeben, wenn der Benutzer nichts eingibt? Es wäre sehr hilfreich, wenn nicht, da dies zusätzliche Validierung beim Überprüfen von leeren Feldern, die "erforderliche" Felder sind, verursachen würde.
Schöner Beitrag übrigens!
Nein
Hey Chris, danke, dass du ein paar wirklich nette Tricks mit uns geteilt hast. Ich habe mich immer gefragt, wie man den Größenänderungsgriff auf meinen Boxen entfernt, aber nie wirklich danach gesucht... und jetzt hast du es mir gebracht. Ich denke, es wird ein Fall von Experimentieren mit diesen Beispielen sein und sehen, wie ich damit zurechtkomme. Cheers.
Stimmt, das ist ein toller Tipp. Diese Dinge sind manchmal nervig.
Toller Artikel, Chris! Es ist verrückt, wie du es oft schaffst, neue Artikel zu veröffentlichen, gerade wenn ich hier über genau dieses Thema nachdenke.
In diesem Zusammenhang... weiß jemand, wie man den Text in einem Textarea-Feld 'scrollen' lässt, ohne Scrollbalken?
Ich habe ein gestyltes Formular, in dem ich ein Textarea habe, das eine bestimmte Breite und Höhe hat. Das Textarea ist auch mit cols/rows eingestellt, aber in Firefox, wenn meine Eingabe das untere Ende des erreicht, setzt sie sich unterhalb des fort, wo man nicht mehr sehen kann, was man schreibt.
Safari bewegt den Text automatisch nach oben, so dass die Zeile, die man schreibt, sichtbar bleibt.
Ich habe alles versucht, was mir einfällt. Wenn mir also jemand Vorschläge machen kann, wäre ich extrem dankbar.
Danke... Mann
Sehr, sehr nützlich für meine GUI.
Danke fürs Teilen, Chris :-)
Wirklich nützliche Tricks – danke fürs Teilen;)
Es ist wichtig zu bedenken, dass man zwar ein Textarea mit CSS gestalten kann, aber die Attribute cols und rows trotzdem immer angegeben werden müssen.
CSS vs. cols und rows
Da ich verschiedene Probleme mit der vorgeschlagenen Textarea-Autoresize-Methode hatte, fand ich diese hier, die viel einfacher zu implementieren ist und, soweit ich gesehen habe, browserübergreifend besser kompatibel ist: http://perplexed.co.uk/596_expanding_textarea_as_you_type.htm
Der Resizer js wird nicht gefunden, bitte aktualisieren Sie Ihren Link.
Brillanter, brillanter, brillanter Artikel und ich habe etwas Neues über das Entfernen des Glühens von aktiven Feldern gelernt – es sieht schrecklich aus!
Ein Problem, das ich jedoch habe, ist, dass ich den Text nicht am oberen Rand eines Textarea-Feldes beginnen lassen kann. Ich habe versucht:
vertical-align: top !important;
text-align: start;
Aber das hat keine Auswirkung.
Ich habe sogar versucht, 'vertical-align: middle' vom gesamten Eingabefeld zu entfernen und es auf 'top' zu ändern, aber der Text erscheint immer noch in der Mitte des Feldes.
Was mache ich falsch?
Chris –
Wenn Sie "overflow: auto;" im Textarea verwenden, verhält es sich wie "white-space: nowrap;".
Ich dachte nur, ich teile das mit!
Hat jemand Ideen zu meinem Problem, dass ich den Text nicht am oberen Rand eines Textarea-Feldes beginnen lassen kann, sondern er sich in der vertikalen Mitte befindet?
Hier gibt es ein paar ziemlich große Versäumnisse.
a) Sie verwenden die jQuery data()-Methode, aber das ist wirklich nicht nötig. Die Standardverwendung des placeholder-Attributs reicht aus. Ich werde unten ein Beispiel hinzufügen.
b) Wenn Sie den Wert des Feldes in den Platzhaltertext ändern, sollten Sie ihn vor dem Absenden wieder ändern (sonst wird der Platzhaltertext für das Feld gesendet, was kein guter Ersatz für das Standardverhalten ist – standardmäßig wird der Platzhaltertext NICHT gesendet, wenn das Feld leer gelassen wird).
Mir ist bewusst, dass die folgende Implementierung nicht ideal ist – sie sollte wahrscheinlich ein Array von Elementen verwenden, um den Code so DRY wie möglich zu halten – aber es ist ein guter Anfang.
Dann sollten wir vor dem Absenden des Formulars idealerweise so etwas wie onsubmit="return clearPlaceholders('#'+this.id)" tun, um zu verhindern, dass die Platzhalterdaten gesendet werden. Die clearPlaceholders-Funktion sieht ungefähr so aus:
Das ist im Grunde das, was ich mache, und es funktioniert großartig.