Следующее работает для вырезания, вставки и т. Д., Независимо от того, выполняются ли эти действия с помощью мыши, сочетания клавиш, выбора параметра в строке меню ... несколько ответов используют аналогичный подход, но не учитывают для определения размера ящика, поэтому они неправильно применяют стиль overflow: hidden
.
Я делаю следующее, что также хорошо работает с max-height
и rows
для минимальной и максимальной высоты.
function adjust() {
var style = this.currentStyle || window.getComputedStyle(this);
var boxSizing = style.boxSizing === 'border-box'
? parseInt(style.borderBottomWidth, 10) +
parseInt(style.borderTopWidth, 10)
: 0;
this.style.height = '';
this.style.height = (this.scrollHeight + boxSizing) + 'px';
};
var textarea = document.getElementById("ta");
if ('onpropertychange' in textarea) { // IE
textarea.onpropertychange = adjust;
} else if ('oninput' in textarea) {
textarea.oninput = adjust;
}
setTimeout(adjust.bind(textarea));
textarea {
resize: none;
max-height: 150px;
border: 1px solid #999;
outline: none;
font: 18px sans-serif;
color: #333;
width: 100%;
padding: 8px 14px;
box-sizing: border-box;
}
<textarea rows="3" id="ta">
Try adding several lines to this.
</textarea>
Для абсолютной полноты вы должны вызывать функцию adjust
в следующих случаях:
- События изменения размера окна, если ширина
textarea
изменяется с изменением размера окна или другими событиями, которые изменяют ширину текстовой области
- При изменении атрибута стиля
textarea
display
, например, когда он переходит от none
(скрытый) к block
- Когда значение
textarea
изменяется программно
Обратите внимание, что использование window.getComputedStyle
или получение currentStyle
может быть несколько вычислительно дорогим, поэтому вы можете вместо этого кэшировать результат.
Работает для IE6, так что я действительно надеюсь, что это достаточно хорошая поддержка.