Autoresizing Textareas
For one of my side projects I wanted to use a textarea that auto resizes to the length of its content. Besides some jQuery plugins and some pure JavaScript examples that didn’t work properly I couldn’t find anything useful, so I tried to implement my own solution.
var resizingTextareas = [].slice.call(
document.querySelectorAll("textarea[autoresize]")
);
resizingTextareas.forEach(function (textarea) {
textarea.addEventListener("input", autoresize, false);
});
function autoresize() {
this.style.height = "auto";
this.style.height = this.scrollHeight + "px";
this.scrollTop = this.scrollHeight;
window.scrollTo(window.scrollLeft, this.scrollTop + this.scrollHeight);
}
At first the code finds all textareas with an autoresize attribute. Then it
adds a listener for the input event, which calls the autoresize function. The
autorize function sets the textarea’s height to auto and immediately changes
its height again to its scrollHeight. This has to be done otherwise the
scrollHeight isn’t correcly calculated. The line after ensures that the
texarea is scrolled to the bottom whenever a new line is added. The last line
scrolls the page if the textbox starts to be higher than the viewport.
textarea[autoresize] {
display: block;
overflow: hidden;
resize: none;
}
Setting the display to block prevents a small position change in Chrome,
Safari and Opera when the autoresize function is called for the first time.
overflow: hidden prevents the scrollbars from showing up and resize: none
removes the small handle at the bottom right corner of the textarea.
You may now use autoresizing textareas like so:
<textarea autoresize>Type here and I’ll resize.</textarea>
View the live example on JSBin.