Был еще один поток об этом , который я попробовал. Но есть одна проблема: textarea
не уменьшается, если вы удалите контент. Я не могу найти способ уменьшить его до правильного размера - clientHeight
значение возвращается как полный размер textarea
, а не его содержимое.
Код с этой страницы ниже:
function FitToContent(id, maxHeight)
{
var text = id && id.style ? id : document.getElementById(id);
if ( !text )
return;
var adjustedHeight = text.clientHeight;
if ( !maxHeight || maxHeight > adjustedHeight )
{
adjustedHeight = Math.max(text.scrollHeight, adjustedHeight);
if ( maxHeight )
adjustedHeight = Math.min(maxHeight, adjustedHeight);
if ( adjustedHeight > text.clientHeight )
text.style.height = adjustedHeight + "px";
}
}
window.onload = function() {
document.getElementById("ta").onkeyup = function() {
FitToContent( this, 500 )
};
}
Ответы:
Это работает для меня (Firefox 3.6 / 4.0 и Chrome 10/11):
Если вы хотите попробовать его на jsfiddle, то он начинается с одной строки и увеличивается только до необходимой суммы. Это нормально для одного
textarea
, но я хотел написать что-нибудь, где у меня было бы много-много такихtextarea
(примерно столько же, сколько обычно было бы строк в большом текстовом документе). В этом случае это действительно медленно. (В Firefox это безумно медленно.) Поэтому я действительно хотел бы подход, который использует чистый CSS. Это было бы возможно сcontenteditable
, но я хочу, чтобы это было только открытым текстом.источник
style.height='auto'
. Я подозреваю, что решение состоит в том, чтобы добавить скрытого брата, используемого только для измерения.ПОЛНОЕ ЕЩЕ ПРОСТОЕ РЕШЕНИЕ
Обновлено 2020-05-14 (улучшена поддержка браузеров для мобильных телефонов и планшетов).
Следующий код будет работать:
ВАРИАНТ 1 (с помощью jQuery)
Эта опция требует jQuery и была протестирована и работает с 1.7.2 - 3.3.1
Просто (добавьте этот код jquery в ваш основной файл сценария и забудьте об этом.)
Test on jsfiddle
ВАРИАНТ 2 (Чистый JavaScript)
Просто (добавьте этот JavaScript в ваш основной файл сценария и забудьте об этом.)
Test on jsfiddle
ВАРИАНТ 3 (расширение jQuery)
Полезно, если вы хотите применить дальнейшую цепочку к текстовым областям, для которых вы хотите иметь автоматический размер.
Вызвать с
$('textarea').autoHeight()
ОБНОВЛЕНИЕ ТЕКСТАРЕА ВИА JAVASCRIPT
При добавлении содержимого в текстовую область через JavaScript добавьте следующий код, чтобы вызвать функцию в варианте 1.
PRESET TEXTAREA ВЫСОТА
Чтобы исправить начальную высоту текстовой области, вам нужно будет добавить дополнительное условие:
источник
this.style.height = 'auto';
волшебное поведение исправить. Я был так расстроен, почему scrollHeight был таким странным в поведении. Высота до auto, а затем соответствие scrollHeight в том же цикле рендеринга, все еще поражает, как она «исправляет» эту проблему, хотя технически следует рисовать только вторую высоту.this.style.height = 'auto';
исправляет поведение scrollHeight? Это просто волшебство.Решение JQuery настроить CSS в соответствии с вашими требованиями
CSS ...
Javascript ...
ИЛИ альтернатива для jQuery 1.7 + ...
Я создал скрипку с абсолютным минимальным стилем в качестве отправной точки для ваших экспериментов ... http://jsfiddle.net/53eAy/951/
источник
overflow-y: hidden;
к CSS, чтобы полоса прокрутки не мигала при изменении размера.$('textarea.auto-resize').on('change cut paste drop keyup', function(){...})
Протестировано в Firefox 14 и Chromium 18. Числа 24 и 12 являются произвольными, проверьте, что подходит вам больше всего.
Вы можете обойтись без тегов стиля и скрипта, но имхо становится немного грязно (это старый стиль HTML + JS и не рекомендуется).
Изменить: модернизированный код. Изменен атрибут onkeyup на addEventListener.
Редактировать: клавиатура работает лучше, чем клавиатура
Редактировать: объявлять функцию перед использованием
Редактировать: ввод работает лучше, чем клавиатура (thnx @ WASD42 & @ MA-Maddin)
jsfiddle
источник
input
событие вместо этого. См. Stackoverflow.com/a/14029861/1951524textarea
поддержкой в виде однойdocument.querySelectorAll('textarea').forEach(function(te){ te.addEventListener("input", function() { this.style.height='24px'; this.style.height=this.scrollHeight+12+'px'; }); });
removeEventListener
и очистить слушателей событий. Это особенно важно при создании прослушивателей событий повсеместно в цикле forEach. Кроме того, на мой взгляд, читаемость гораздо важнее, чем краткость.box-sizing: border-box;
свойство установлено, иначе текстовое поле увеличивается на 4 пикселя для каждого события onInput. Я провел около 3 часов, пока не понял, что это проблема.Лучшее решение (работает и коротко) для меня:
Он работает как брелок без каких-либо мерцаний с пастой (также с мышью), вырезает, вводит и сжимается до нужного размера.
Пожалуйста, посмотрите на jsFiddle .
источник
Вы используете более высокое значение текущего clientHeight и содержимого scrollHeight. Когда вы уменьшаете scrollHeight, удаляя содержимое, вычисляемая область не может уменьшаться, потому что clientHeight, ранее установленный style.height, держит его открытым. Вместо этого вы можете взять max () из scrollHeight и минимальное значение высоты, которое вы предварительно определили или рассчитали из textarea.rows.
В общем, вы, вероятно, не должны полагаться на scrollHeight на элементы управления формой. Помимо того, что scrollHeight традиционно менее широко поддерживается, чем некоторые другие расширения IE, HTML / CSS ничего не говорит о внутренней реализации элементов управления формы, и вы не гарантируете, что scrollHeight будет что-то значимым. (Традиционно некоторые браузеры использовали виджеты ОС для этой задачи, что делает невозможным взаимодействие CSS и DOM на их внутренних объектах.) По крайней мере, проанализируйте наличие scrollHeight / clientHeight, прежде чем пытаться включить эффект.
Другой возможный альтернативный подход, позволяющий избежать проблемы, если важно, чтобы он работал более широко, может заключаться в использовании скрытого элемента div, имеющего ширину, равную ширине текстовой области, и установленного в том же шрифте. При keyup вы копируете текст из текстовой области в текстовый узел в скрытом div (не забывая заменить '\ n' на разрыв строки и экранировать '<' / '&' правильно, если вы используете innerHTML). Затем просто измерив смещение divHeight, вы получите необходимую высоту.
источник
scrollHeight
текстовыми сообщениями? Прекрасно работает с текущими версиями IE, Firefox и Opera ...Если вам не нужно поддерживать IE8, вы можете использовать
input
событие:Теперь вам нужно только добавить немного CSS, и все готово:
Применение:
Вы можете прочитать больше о том, как это работает, в моем блоге .
источник
input
событие во время инициализации в цикле foreach.авто размер
https://github.com/jackmoore/autosize
Просто работает, автономно, популярен (3.0k + звезды GitHub по состоянию на октябрь 2018), доступен на cdnjs ) и легкий (~ 3.5k). Демо - версия:
Кстати, если вы используете редактор ACE, используйте
maxLines: Infinity
: Автоматически настроить высоту содержимого в редакторе Ace Cloud 9источник
autosize
Плагин не позволяет вручную изменить размер , используя значок изменения размера в текстовом поле.Нашел один лайнер отсюда ;
источник
Кто-нибудь посчитал приемлемым? Нет необходимости возиться с прокруткой, и единственное, что мне нравится в JS, - это если вы планируете сохранять данные в режиме размытия ... и, видимо, оно совместимо во всех популярных браузерах: http://caniuse.com/#feat = contenteditable
Просто сделайте так, чтобы оно выглядело как текстовое поле, и оно автоматически изменится ... Сделайте минимальную высоту желаемой высоты текста и сделайте это.
Что хорошо в этом подходе, так это то, что вы можете сохранять теги в некоторых браузерах.
http://jsfiddle.net/gbutiri/v31o8xfo/
источник
contenteditable
это хорошо, но если вы хотите открытый текст, ему нужно несколько вариантов, таких как-webkit-user-modify: read-write-plaintext-only
иwhite-space: pre-wrap
.[dom-element].innerText
. @WebmasterG ИМХО, было бы неплохо опустить jquery (для прозрачности) и включить пример на этой странице через исполняемый фрагмент кода вместо jsfiddle.Я использовал следующий код для нескольких текстовых областей. Хорошо работает в Chrome 12, Firefox 5 и IE 9, даже с действиями удаления, вырезания и вставки, выполненными в текстовых областях.
источник
Есть немного другой подход.
Идея состоит в том, чтобы скопировать текст из
textarea
вpre
и позволить CSS убедиться, что они имеют одинаковый размер.Преимущество состоит в том, что фреймворки предоставляют простые инструменты для перемещения текста без каких-либо событий. А именно, в AngularJS вы добавили бы
ng-model="foo" ng-trim="false"
кtextarea
иng-bind="foo + '\n'"
кpre
. Вижу скрипку .Просто убедитесь, что
pre
размер шрифта такой же, как уtextarea
.источник
pre
него тот же размер шрифта, что и уtextarea
» - им нужно одинаковоеline-height
и одинаковое количествоpadding
и / илиborder
тоже. Это лучшее решение для Angular.Следующее работает для вырезания, вставки и т. Д. Независимо от того, выполняются ли эти действия с помощью мыши, сочетания клавиш, выбора параметра в строке меню ... в нескольких ответах используется аналогичный подход, но они не учитывают Размеры, поэтому они неправильно применяют стиль
overflow: hidden
.Я делаю следующее, что также хорошо работает с
max-height
иrows
минимальной и максимальной высоты.Для абсолютной полноты вы должны вызывать
adjust
функцию в следующих случаях:textarea
изменяется с изменением размера окна, или другие события, которые изменяют ширину текстовой областиtextarea
sdisplay
изменяется, например, когда он переходит изnone
(скрытого) вblock
textarea
изменяется программноОбратите внимание, что использование
window.getComputedStyle
или получениеcurrentStyle
может быть несколько вычислительно дорогим, поэтому вы можете вместо этого кэшировать результат.Работает для IE6, поэтому я очень надеюсь, что это достаточно хорошая поддержка.
источник
В качестве другого подхода вы можете использовать a,
<span>
который автоматически подстраивает свой размер. Вам нужно будет сделать его редактируемым, добавивcontenteditable="true"
свойство, и все готово:Единственная проблема с этим подходом заключается в том, что если вы хотите отправить значение как часть формы, вам придется сделать это самостоятельно в JavaScript. Это относительно легко. Например, вы можете добавить скрытое поле и в
onsubmit
случае формы назначить значениеspan
скрытому полю, которое затем будет автоматически отправлено вместе с формой.источник
Немного исправлений. Отлично работает в опере
источник
Я знаю короткий и правильный способ реализации этого с помощью jquery. Никаких дополнительных скрытых div не требуется и работает в большинстве браузеров.
источник
.live()
устарела. api.jquery.com/live Обычно вы хотите использовать.on()
вместо этого.Я не знаю, упоминал ли кто-нибудь об этом, но в некоторых случаях можно изменить высоту с помощью атрибутов строк.
демонстрация
источник
white-space: nowrap;
. Когда строка переносится на другую строку без разрыва строки, текстовая область больше не будет корректно корректироваться.Вот директива angularjs для ответа Панзи.
HTML:
источник
Вы можете использовать JQuery, чтобы расширить
textarea
время ввода:источник
${textarea.scrollHeight}px
;});Те, кто хочет добиться того же в новых версиях Angular.
Захватить текст
Я также добавляю еще один вариант использования, который может пригодиться некоторым пользователям, читающим поток, когда пользователь хочет увеличить высоту текстовой области до определенной высоты и затем использовать
overflow:scroll
ее, вышеупомянутый метод может быть расширен для достижения упомянутого варианта использования.источник
Некоторые ответы здесь не учитывают отступы.
Предполагая, что у вас есть максимальная высота, которую вы не хотите проходить, это сработало для меня:
источник
Еще более простой и понятный подход заключается в следующем:
// и CSS
Все, что нужно, это добавить
.auto-height
класс к любому, на которыйtextarea
вы хотите нацелиться.Испытано в FF, Chrome и Safari. Дайте мне знать, если это не сработает для вас, по любой причине. Но это самый чистый и простой способ, который я нашел, чтобы это работало. И это прекрасно работает! : D
источник
Этот код работает для вставки и выберите удалить также.
Вот JSFiddle
источник
Я рекомендую библиотеку javascript с http://javierjulio.github.io/textarea-autosize .
В комментариях добавьте пример кодового блока по использованию плагина:
Минимально необходимый CSS:
источник
MakeTextAreaResisable, использующий qQuery
источник
Ни один из ответов, похоже, не работает. Но этот работает для меня: https://coderwall.com/p/imkqoq/resize-textarea-to-fit-content
источник
моя реализация очень проста, посчитайте количество строк на входе (и минимум 2 строки, чтобы показать, что это текстовая область):
полный рабочий пример со стимулом: https://jsbin.com/kajosolini/1/edit?html,js,output
(и это работает с ручкой ручного изменения размера браузера, например)
источник
Принятый ответ работает нормально. Но это много кода для этой простой функциональности. Код ниже сделает свое дело.
источник
Вот что я сделал, используя MVC HTML Helper для TextArea. У меня было довольно много элементов textarea, поэтому пришлось различать их по Model Id.
и в сценарии добавил это:
Я проверил это на IE10 и Firefox23
источник
Вы можете использовать этот код:
Coffescript:
Javascript
источник