как переделать в jquery?возможно ли изменить так чтобы размер менялся и при удалении текста?

Динамическое изменение размеров 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 шт):

Автор решения: Алексей Шиманский

Без 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>

→ Ссылка