Вся сложность заключается в том, чтоб узнать именно высоту содержимого. Тут поможет
scrollHeight
. Но если растягивать постоянно, то и значение будет расти, а значит если удалить текст, то блок не уменьшится. Нужен какой-то трюк, чтоб сбросить его к нормальному, задав высоту 0. Юзер ничего не заметит и магия сработает.
const textarea = document.querySelector<HTMLTextAreaElement>("textarea");
const minHeight = 60;
const maxHeight = 260;
const constrain = (n: number, low: number, high: number) => {
return Math.max(Math.min(n, high), low);
};
if (textarea !== null) {
textarea.addEventListener("input", () => {
textarea.style.setProperty("height", "0");
textarea.style.setProperty(
"height",
constrain(textarea.scrollHeight, minHeight, maxHeight) + "px",
);
});
}
P.S. размеры внутренних отступов и рамок надо будет тоже учитывать, но там все просто.