0

Динамическое изменение размеров textarea под содержимое

var maxWidth = 200;
var maxHeight = 100;

$('.demo').on('input', function(e){
// Если появляется скролл и его ширина больше клиентской → увеличиваем ширину клиента if (this.scrollWidth > this.clientWidth) this.style.width = this.scrollWidth + 'px';

// Если ширина больше максимально допустимой → даем словам "ломаться" и фиксируем ширину
if (this.clientWidth >= maxWidth) {
    this.style.width = maxWidth;
    this.style.whiteSpace = 'pre-wrap';
}

// Если высота больше максимальной → нафиг ничЁ не надо
if (this.clientHeight > maxHeight) 
    return;    

// Если появляется скролл и его высота клиентской → увеличиваем высоту клиента
if (this.scrollHeight > this.clientHeight) 
    this.style.height = this.scrollHeight + 'px';

})

такой код сейчас

$(document).on('input', '.nomination_text', function(e){
    $(this).css({'height' : '1px'});
    $(this).css({'width' : '1px'});
var elm = $(this);
elm.scrollTop(elm.get(0).scrollHeight);
elm.scrollLeft(elm.get(0).scrollWidth);
var scrollHeight = elm.scrollTop() + elm.height();
var scrollWidth = elm.scrollLeft() + elm.width();

$(this).css({'height' : (scrollHeight + 6) + 'px'});

if(scrollWidth > this.clientWidth){
    $(this).css({'width' : (scrollWidth + 6) + 'px'});
}

if(this.clientWidth >= maxWidth){
    $(this).css({'width' : '420px'});
    $(this).css({'white-space' : 'pre-wrap'});
}

elm.scrollTop(0);
elm.scrollLeft(0);

});

В общем ответ я так и не нашел... Возможно я не понял правильно что мне писали, но если появится человек который сможет объяснить как сделать меняющуюся ширину textarea при помощи jquery при наборе/удалении текста(именно textarea, без скрытых блоков, без замен на какие-то другие блоки и т.п) Я буду благодарен))

1 Answers1

0

Без Jquery в одну строку прямо в элементе:

<textarea name="text" oninput="this.style.height = ''; this.style.height = this.scrollHeight +'px';"></textarea>

С Jquery

$(document).find('textarea').each(function () {
    let  offset = this.offsetHeight - this.clientHeight;
$(this).on('keyup input focus', function () {
    $(this).css('height', 'auto').css('height', this.scrollHeight + offset);
});

});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<textarea></textarea>

(Чистый JavaScript + CSS)

$('#container').delegate( 'textarea', 'keydown', function (){
    $(this).height( 0 );
    $(this).height( this.scrollHeight );
});

$('#container').find( 'textarea' ).keydown();

div#container textarea {
    min-width: 270px;
    width: 270px;
    height: 22px;    
    min-height: 22px;
    overflow-y: hidden; /* фикс мигания скроллбара */
    padding-top: 1.0em; /* чтобы не прыгала арея во время нажатия Enter */
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<div id="container">
  <textarea></textarea>
</div>

Еще варианты с https://stackoverflow.com/questions/454202/

(Jquery)

$("textarea").each(function () {
    this.setAttribute("style", "height:" + (this.scrollHeight) + "px;overflow-y:hidden;");
}).on("input", function () {
    this.style.height = "auto";
    this.style.height = (this.scrollHeight) + "px";
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea placeholder="Type, paste, cut text here...">PRELOADED TEXT.
This javascript should now add better support for IOS browsers and Android browsers.</textarea>
<textarea placeholder="Type, paste, cut text here..."></textarea>

(Чистый JavaScript)

const tx = document.getElementsByTagName("textarea");
for (let i = 0; i < tx.length; i++) {
  tx[i].setAttribute("style", "height:" + (tx[i].scrollHeight) + "px;overflow-y:hidden;");
  tx[i].addEventListener("input", OnInput, false);
}

function OnInput() { this.style.height = "auto"; this.style.height = (this.scrollHeight) + "px"; }

<textarea placeholder="Type, paste, cut text here...">PRELOADED TEXT. This JavaScript should now add better support for IOS browsers and Android browsers.</textarea>
<textarea placeholder="Type, paste, cut text here..."></textarea>
  • я тут еще не разобрался,поэтому забыл правильно сформулировать вопрос - я пытаюсь настроить ширину textarea, с высотой разобрался – user447846 Jun 14 '21 at 09:23
  • C шириной будет тоже самое, только вместо height - width............ Лично я считаю что в таком задании ширины смысла нет, потому что это будет слишком шокировать пользователя, что вначале расширяется, потом увеличивается по высоте. и наоборот. Лучше ширину сделать фиксированной, а изменять высоту. Либо давай изменять ширину/высоту мышкой. .... – Алексей Шиманский Jun 14 '21 at 09:30
  • просто справа от textarea должен быть приклеен блок с выводом количества комментариев, для этого и изменение ширины сама textarea никак не выделяется - поэтому изменение размера не будет видно Спасибо за ответ)) – user447846 Jun 14 '21 at 09:32