Автоматическое расширение текстового поля с помощью jQuery
Как я могу сделать textarea автоматически расширяться с помощью jQuery?
У меня есть текстовое поле для объяснения повестки дня собрания, поэтому я хочу расширить это текстовое поле, когда текст моей повестки дня продолжает расти в этой области текстового поля.
27 ответов:
Я пробовал много и это великолепно.ссылка мертвая. Более новая версия здесь. Смотрите ниже для старой версии.
вы можете попробовать, нажав и удерживая клавишу enter в textarea. Сравните эффект с другим плагином автоматического расширения textarea....edit на основе комментария
$(function() { $('#txtMeetingAgenda').autogrow(); });Примечание: Вы должны включить необходимые файлы JS...
для предотвращения полоса прокрутки в текстовом поле от мигания вкл & выкл во время расширения / сжатия, вы можете установить
overflowдоhiddenа также:$('#textMeetingAgenda').css('overflow', 'hidden').autogrow()
обновление:
выше ссылка не работает. Но вы все равно можете получить файлы JavaScript здесь.
Если вы не хотите, плагин есть очень простое решение
$("textarea").keyup(function(e) { while($(this).outerHeight() < this.scrollHeight + parseFloat($(this).css("borderTopWidth")) + parseFloat($(this).css("borderBottomWidth"))) { $(this).height($(this).height()+1); }; });смотрите, как он работает в jsFiddle я использовал, чтобы ответить на другой вопрос ответа.
чтобы ответить на вопрос, делать это в обратном порядке или сделать его меньше, как текст удаляется:jsFiddle
и если вы хотите, чтобы плагин
растет / сжимается текстовая область. Эта демонстрация использует jQuery для привязки событий, но это не обязательно в любом случае.
(нет поддержки IE-IE не отвечает на строки изменить атрибут)
HTML
<textarea class='autoExpand' rows='3' data-min-rows='3' placeholder='Auto-Expanding Textarea'></textarea>CSS
textarea{ display:block; box-sizing: padding-box; overflow:hidden; padding:10px; width:250px; font-size:14px; margin:50px auto; border-radius:8px; border:6px solid #556677; }javascript (обновлено)
$(document) .one('focus.textarea', '.autoExpand', function(){ var savedValue = this.value; this.value = ''; this.baseScrollHeight = this.scrollHeight; this.value = savedValue; }) .on('input.textarea', '.autoExpand', function(){ var minRows = this.getAttribute('data-min-rows')|0, rows; this.rows = minRows; rows = Math.ceil((this.scrollHeight - this.baseScrollHeight) / 16); this.rows = minRows + rows; });
вы можете попробовать это
$('#content').on('change keyup keydown paste cut', 'textarea', function () { $(this).height(0).height(this.scrollHeight); }).find('textarea').change();<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <div id="content"> <textarea>How about it</textarea><br /> <textarea rows="5">111111 222222 333333 444444 555555 666666</textarea> </div>
благодаря SpYk3HH, я начал с его решения и превратил его в это решение, которое добавляет сокращающуюся функциональность и еще проще и быстрее, я полагаю.
$("textarea").keyup(function(e) { $(this).height(30); $(this).height(this.scrollHeight + parseFloat($(this).css("borderTopWidth")) + parseFloat($(this).css("borderBottomWidth"))); });протестировано в текущем браузере Chrome, Firefox и Android 2.3.3.
вы можете увидеть вспышки полос прокрутки в некоторых браузерах. Добавьте этот CSS, чтобы решить эту проблему.
textarea{ overflow:hidden; }
чтобы определить автоматически расширяемую текстовую область, вам нужно сделать две вещи:
- расширения это, как только вы нажмете клавишу Enter или тип содержимого более чем одной строке.
- и shrink это при размытии, чтобы получить фактический размер, если пользователь вошел свободное пространство.(бонус)
здесь ручная работа для выполнения поставленной задачи.
работает нормально почти со всеми браузерами (
. Вот метод: //Here is an event to get TextArea expand when you press Enter Key in it. // intiate a keypress event $('textarea').keypress(function (e) { if(e.which == 13) { var control = e.target; var controlHeight = $(control).height(); //add some height to existing height of control, I chose 17 as my line-height was 17 for the control $(control).height(controlHeight+17); } }); $('textarea').blur(function (e) { var textLines = $(this).val().trim().split(/\r*\n/).length; $(this).val($(this).val().trim()).height(textLines*17); });здесь это сообщение об этом.
Я использовал Textarea Expander плагин jQuery раньше с хорошими результатами.
каждый должен попробовать этот плагин jQuery: xautoresize-jquery. Это очень хорошо и должно решить вашу проблему.
Я только что построил эту функцию, чтобы расширить текстовые области на pageload. Просто изменить
eachtokeyupи это произойдет, когда текстовое поле будет введено.// On page-load, auto-expand textareas to be tall enough to contain initial content $('textarea').each(function(){ var pad = parseInt($(this).css('padding-top')); if ($.browser.mozilla) $(this).height(1); var contentHeight = this.scrollHeight; if (!$.browser.mozilla) contentHeight -= pad * 2; if (contentHeight > $(this).height()) $(this).height(contentHeight); });протестировано в Chrome, IE9 и Firefox. К сожалению, Firefox имеет эта ошибка, который возвращает неверное значение
scrollHeight, поэтому приведенный выше код содержит (hacky) обходной путь для него.
я исправил несколько ошибок в ответе, предоставленном Reigel (принятый ответ):
- порядок, в котором теперь заменяются HTML-объекты, не вызывает неожиданного кода в теневом элементе. (Оригинал заменен " > "на" &gt;", что вызывает неправильный расчет высоты в некоторых редких случаях).
- если текст заканчивается новой строкой, тень теперь получает дополнительный символ"#", а не фиксированную добавленную высоту, как в случае оригинальный.
- изменение размера текстовой области после инициализации обновляет ширину тени.
- добавлено word-wrap: break-word для shadow, поэтому он ломается так же, как текстовая область (принудительные разрывы для очень длинных слов)
есть некоторые оставшиеся вопросы, касающиеся пространств. Я не вижу решения для двойных пространств, они отображаются как одиночные пространства в тени (HTML-рендеринг). Это не может быть soved с помощью , потому что пробелы должны ломаться. Также textarea разрывает строку после пробела, если для этого пространства нет места, он разорвет линию в более ранней точке. Предложения приветствуются.
исправленный код:
(function ($) { $.fn.autogrow = function (options) { var $this, minHeight, lineHeight, shadow, update; this.filter('textarea').each(function () { $this = $(this); minHeight = $this.height(); lineHeight = $this.css('lineHeight'); $this.css('overflow','hidden'); shadow = $('<div></div>').css({ position: 'absolute', 'word-wrap': 'break-word', top: -10000, left: -10000, width: $this.width(), fontSize: $this.css('fontSize'), fontFamily: $this.css('fontFamily'), lineHeight: $this.css('lineHeight'), resize: 'none' }).appendTo(document.body); update = function () { shadow.css('width', $(this).width()); var val = this.value.replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/\n/g, '<br/>') .replace(/\s/g,' '); if (val.indexOf('<br/>', val.length - 5) !== -1) { val += '#'; } shadow.html(val); $(this).css('height', Math.max(shadow.height(), minHeight)); }; $this.change(update).keyup(update).keydown(update); update.apply(this); }); return this; }; }(jQuery));
код SpYk3HH с добавлением для уменьшения размера.
function get_height(elt) { return elt.scrollHeight + parseFloat($(elt).css("borderTopWidth")) + parseFloat($(elt).css("borderBottomWidth")); } $("textarea").keyup(function(e) { var found = 0; while (!found) { $(this).height($(this).height() - 10); while($(this).outerHeight() < get_height(this)) { $(this).height($(this).height() + 1); found = 1; }; } });
function autosize(textarea) { $(textarea).height(1); // temporarily shrink textarea so that scrollHeight returns content height when content does not fill textarea $(textarea).height($(textarea).prop("scrollHeight")); } $(document).ready(function () { $(document).on("input", "textarea", function() { autosize(this); }); $("textarea").each(function () { autosize(this); }); });(это не будет работать в Internet Explorer 9 или старше, так как он использует
inputсобытие)
Это сработало для меня лучше:
$('.resiText').on('keyup input', function() { $(this).css('height', 'auto').css('height', this.scrollHeight + (this.offsetHeight - this.clientHeight)); });.resiText { box-sizing: border-box; resize: none; }<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <textarea class="resiText"></textarea>
люди, кажется, очень над проработанными решениями...
вот как я это делаю:
$('textarea').keyup(function() { var $this = $(this), height = parseInt($this.css('line-height'), 10), padTop = parseInt($this.css('padding-top'), 10), padBot = parseInt($this.css('padding-bottom'), 10); $this.height(0); var scroll = $this.prop('scrollHeight'), lines = (scroll - padTop - padBot) / height; $this.height(height * lines); });Это будет работать с длинными линиями, а также разрывы строк.. растет и сжимается..
Я написал эту функцию jquery, которая, кажется, работает.
вам нужно указать min-height в css, хотя, и если вы не хотите делать некоторые кодирования, он должен быть длиной в две цифры. ie 12px;
$.fn.expand_ta = function() { var val = $(this).val(); val = val.replace(/</g, "<"); val = val.replace(/>/g, ">"); val += "___"; var ta_class = $(this).attr("class"); var ta_width = $(this).width(); var min_height = $(this).css("min-height").substr(0, 2); min_height = parseInt(min_height); $("#pixel_height").remove(); $("body").append('<pre class="'+ta_class+'" id="pixel_height" style="position: absolute; white-space: pre-wrap; visibility: hidden; word-wrap: break-word; width: '+ta_width+'px; height: auto;"></pre>'); $("#pixel_height").html(val); var height = $("#pixel_height").height(); if (val.substr(-6) == "<br />"){ height = height + min_height; }; if (height >= min_height) $(this).css("height", height+"px"); else $(this).css("height", min_height+"px"); }
для тех, кто использует плагин, опубликованный Reigel, обратите внимание, что это отключит функцию отмены в Internet Explorer (go give the demo A go).
Если это проблема для вас, то я предложил бы использовать плагинсообщение от @richsage вместо этого, так как он не страдает от этой проблемы. Смотрите второй пункт маркера на поиск окончательного изменения размера Textarea для получения дополнительной информации.
есть также очень круто
bgrins/ExpandingTextareas (github)проект, основанный на публикации Нил Дженкинс под названием Расширение Текстовых Областей Сделано Элегантным
Я хотел анимацию и автоматическое сжатие. Сочетание, по-видимому, трудно, потому что люди придумали довольно интенсивные решения для него. Я сделал это мульти-текстовой-доказательства тоже. И это не так смешно тяжело, как плагин jQuery.
я основывался на ответе vsync (и улучшении, которое он сделал для него),http://codepen.io/anon/pen/vlIwj это кодовый ключ для моего улучшение.
HTML
<textarea class='autoExpand' rows='3' data-min-rows='3' placeholder='Auto-Expanding Textarea'></textarea>CSS
body{ background:#728EB2; } textarea{ display:block; box-sizing: padding-box; overflow:hidden; padding:10px; width:250px; font-size:14px; margin:50px auto; border-radius:8px; border:6px solid #556677; transition:all 1s; -webkit-transition:all 1s; }JS
var rowheight = 0; $(document).on('input.textarea', '.autoExpand', function(){ var minRows = this.getAttribute('data-min-rows')|0, rows = this.value.split("\n").length; $this = $(this); var rowz = rows < minRows ? minRows : rows; var rowheight = $this.attr('data-rowheight'); if(!rowheight){ this.rows = rowz; $this.attr('data-rowheight', (this.clientHeight - parseInt($this.css('padding-top')) - parseInt($this.css('padding-bottom')))/ rowz); }else{ rowz++; this.style.cssText = 'height:' + rowz * rowheight + 'px'; } });
есть много ответов для этого, но я нашел что-то очень простое, прикрепите событие keyup к текстовой области и проверьте клавишу enter нажмите код ключа 13
keyPressHandler(e){if(e.keyCode == 13){e.target.rows = e.target.rows + 1;}}Это добавит вам еще одну строку textarea, и вы можете стилизовать ширину с помощью CSS.
допустим, вы пытаетесь сделать это с помощью нокаута... вот как:
на странице:
<textarea data-bind="event: { keyup: $root.GrowTextArea }"></textarea>в поле зрения модели:
self.GrowTextArea = function (data, event) { $('#' + event.target.id).height(0).height(event.target.scrollHeight); }Это должно работать, даже если у вас есть несколько текстовых областей, созданных нокаутом foreach, как я делаю.
Простое Решение:
HTML:
<textarea class='expand'></textarea>JS:
$('textarea.expand').on('input', function() { $(this).scrollTop($(this).height()); }); $('textarea.expand').scroll(function() { var h = $(this).scrollTop(); if (h > 0) $(this).height($(this).height() + h); });
@Георгий Иванкин сделал предложение в комментарии, Я использовал его успешно :)--, но с небольшими изменениями:
$('#note').on('keyup',function(e){ var maxHeight = 200; var f = document.getElementById('note'); if (f.clientHeight < f.scrollHeight && f.scrollHeight < maxHeight ) { f.style.height = f.scrollHeight + 'px'; } });он перестает расширяться после достижения максимальной высоты 200px
самое простое решение:
html:
<textarea class="auto-expand"></textarea>css:
.auto-expand { overflow:hidden; min-height: 80px; }js (jquery):
$(document).ready(function () { $("textarea.auto-expand").focus(function () { var $minHeight = $(this).css('min-height'); $(this).on('input', function (e) { $(this).css('height', $minHeight); var $newHeight = $(this)[0].scrollHeight; $(this).css('height', $newHeight); }); }); });
старый вопрос, но вы могли бы сделать что-то вроде этого:
html:
<textarea class="text-area" rows="1"></textarea>jquery:
var baseH; // base scroll height $('body') .one('focus.textarea', '.text-area', function(e) { baseH = this.scrollHeight; }) .on('input.textarea', '.text-area', function(e) { if(baseH < this.scrollHeight) { $(this).height(0).height(this.scrollHeight); } else { $(this).height(0).height(baseH); } });таким образом, автоматическое изменение размера будет применяться к любой текстовой области с классом "text-area". Также сжимается при удалении текста.
jsfiddle:
решение с чистым JS
function autoSize() { if (element) { element.setAttribute('rows', 2) // minimum rows const rowsRequired = parseInt( (element.scrollHeight - TEXTAREA_CONFIG.PADDING) / TEXTAREA_CONFIG.LINE_HEIGHT ) if (rowsRequired !== parseInt(element.getAttribute('rows'))) { element.setAttribute('rows', rowsRequired) } } }
Это решение я в конечном итоге с помощью. Я хотел, встроенное решение, и это до сих пор кажется, отлично работает:
<textarea onkeyup="$(this).css('height', 'auto').css('height', this.scrollHeight + this.offsetHeight - this.clientHeight);"></textarea>
Comments