ऑटो jQuery का उपयोग कर एक textarea का विस्तार


128

मैं jQuery का उपयोग करके कैसे एक textarea स्वचालित रूप से विस्तार कर सकते हैं?

मेरे पास मीटिंग के एजेंडे को समझाने के लिए एक टेक्स्टबॉक्स है, इसलिए मैं उस टेक्स्टबॉक्स का विस्तार करना चाहता हूं जब मेरे एजेंडे का टेक्स्ट उस बॉक्सबॉक्स क्षेत्र को बढ़ाता रहता है।


मैं थिक textarea autoexpandable है।
andrew सुलिवन


कृपया अपने प्रश्न को बदलने और "jQuery" शब्द को हटाने पर विचार करें
vsync

जवाबों:


113

मैंने बहुत कोशिश की है और यह बहुत अच्छा है। लिंक मर चुका है। नया संस्करण यहां उपलब्ध है । पुराने संस्करण के लिए नीचे देखें।
आप textarea में एंटर की दबाकर और दबाकर देख सकते हैं। अन्य ऑटो एक्सपैंडिंग टेक्सारिया प्लगइन के साथ प्रभाव की तुलना करें ...।

टिप्पणी के आधार पर संपादित करें

$(function() {
   $('#txtMeetingAgenda').autogrow();
});

ध्यान दें: आपको आवश्यक जेएस फाइलें शामिल करनी चाहिए ...

विस्तार / संकुचन के दौरान चालू या बंद चमकती से पाठ क्षेत्र में स्क्रॉलबार रोकने के लिए, आप सेट कर सकते हैं overflowकरने के लिए hiddenअच्छी तरह से:

$('#textMeetingAgenda').css('overflow', 'hidden').autogrow()




अपडेट करें:

ऊपर का लिंक टूटा हुआ है। लेकिन आप अभी भी यहाँ जावास्क्रिप्ट फ़ाइलें प्राप्त कर सकते हैं


अगर मेरी टेक्स्टबॉक्स आईडी txtMeetingAgenda है तो मैं कैसे कर सकते हैं ऑटो पाठ संपत्ति को jquery में लागू
Piyush

यहाँ क्लिक घटना परिभाषित है या नहीं
पीयूष

यह सब textarea के बारे में है, लेकिन textbox.is के बारे में क्या यह प्लगइन पाठ बॉक्स के लिए भी काम करता है?
पीयूष

1
यह प्लगइन अच्छी तरह से काम नहीं करता है,
ऑटोसेज़

यह केवल एक ही तरह से काम करता है जब टेक्सारिया बढ़ रहा हो। लेकिन जब आप पाठ को हटाना शुरू करते हैं, तो यह स्वचालित रूप से ऊंचाई को कम नहीं करता है।
ईकैशकिंग

166

यदि आप एक प्लगइन नहीं चाहते हैं तो एक बहुत ही सरल उपाय है

$("textarea").keyup(function(e) {
    while($(this).outerHeight() < this.scrollHeight + parseFloat($(this).css("borderTopWidth")) + parseFloat($(this).css("borderBottomWidth"))) {
        $(this).height($(this).height()+1);
    };
});

इसे एक jsFiddle में काम करते हुए देखें मैंने यहां एक और textarea प्रश्न का उत्तर दिया

पाठ को हटाने के रूप में इसे उल्टा करने या इसे छोटा बनाने के प्रश्न का उत्तर देने के लिए: jsFiddle

और अगर आप एक प्लगइन चाहते हैं

@ जेसन ने यहाँ एक डिज़ाइन किया है


1
मुझे + parseFloat ($ (यह) .css ("borderTopWidth")) + parseFloat ($ (यह) .css ("borderBottomWidth")) को निकालना पड़ा, अन्यथा यह बूटस्ट्रैप के साथ स्टाइल किए गए एक textarea के साथ असीम छोरों
blacelle

3
if (this.clientHeight < this.scrollHeight) { this.style.height = this.scrollHeight + 'px'; }
jQuery-

3
@metakungfu अच्छी तरह से सिर्फ डाउनवोटिंग के बजाय, शायद आप उत्तर को बेहतर बनाने में मदद कर सकते हैं। मेरे पास ऐप्पल क्रैप्ट एटीएम और टेस्टिंग के लिए खिड़कियों के लिए किसी भी तरह का परीक्षण नहीं है, बहुत समय पहले बंद कर दिया गया था। इसलिए मैं वास्तव में यह निर्धारित करने के लिए कुछ भी नहीं कर सकता कि यह काम क्यों नहीं करेगा। कोड-वार, इस समाधान में कुछ भी गलत नहीं है। क्या आप सुनिश्चित हैं कि यह कोड है जो तोड़ रहा है और सफारी को jsfiddle में नहीं तोड़ रहा है? सफारी सुंदर picky है और बेला बस एक प्रमुख अद्यतन के माध्यम से चला गया। मेयब आप देव कॉन खोल सकते हैं और कुछ और विवरण प्रदान कर सकते हैं?
SpYk3HH

1
भी चमक चमक को रोकने के लिए छिपा करने के लिए textarea अतिप्रवाह-y सेट की जरूरत है
iulial

2
यदि मैं जोड़ी गई पंक्तियों को हटाना चाहता हूं, तो टेक्स्टबॉक्स का बढ़ा हुआ आकार समान रहता है, क्या यह संभव है कि यह स्वचालित रूप से वापस आकार बदल सकता है?
स्टीवन

33

बढ़ता / सिकुड़ता है। यह डेमो इवेंट बाइंडिंग के लिए jQuery का उपयोग करता है, लेकिन यह किसी भी तरह से जरूरी नहीं है।
( कोई IE समर्थन - IE पंक्तियों का जवाब नहीं है विशेषता परिवर्तन )

डेमो पेज


एचटीएमएल

<textarea class='autoExpand' rows='3' data-min-rows='3' placeholder='Auto-Expanding Textarea'></textarea>

सीएसएस

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;
}

जावास्क्रिप्ट (अद्यतन)

$(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;
    });

2
क्योंकि कोड को उस पत्र के लिए थोड़ा इंतजार करना होगा जिसे आपने textarea के अंदर मुद्रित करने के लिए टाइप किया है और उसके बाद textarea के आयामों को बदल सकते हैं
vsync

1
मैं देखता हूं, जब किसी भी स्रोत से पाठ की प्रतिलिपि बनाई जाती है (CTRL + V) तो समाधान टूट जाता है। हालांकि, यदि पाठ मैन्युअल रूप से टाइप किया गया है - यह भयानक और बहुत ही सहज है।
सत्य कल्लूरी

1
@vsync: आप कई टेक्स्ट क्षेत्रों के लिए कैसे संशोधित करेंगे? यानी आपके पास textarea1 और textarea2 हैं और आप दोनों को बढ़ने देना चाहते हैं?
jmoreno

1
यह शीर्ष उत्तर होना चाहिए! मैंने एक प्रश्न के आधार पर पोस्ट किया कि अगर किसी को दिलचस्पी है: stackoverflow.com/questions/29930300/…
gsamaras

1
@AllyMurray - मैंने अब जाकर इसे 16 पर अपडेट किया क्योंकि यह बेहतर परिणाम देता है। और हाँ, यह अपेक्षित लाइन ऊंचाई है
vsync


20

आप यह एक कोशिश कर सकते हैं

$('#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>


यदि आप $ (यह) से स्क्रॉलहाइट प्राप्त करना चाहते हैं, तो आप $ (इस) .प्रॉप ('स्क्रॉलहाइट') का उपयोग कर सकते हैं; इसके बजाय;)
सैमुअल विकेंट

3
यह हर लाइन ब्रेक ब्लिंक
जो

11

SpYk3HH के लिए धन्यवाद, मैंने उसके समाधान के साथ शुरुआत की और इसे इस समाधान में बदल दिया, जो सिकुड़ती कार्यक्षमता को जोड़ता है और यहां तक ​​कि सरल और तेज है, मैं अनुमान लगाता हूं।

$("textarea").keyup(function(e) {
    $(this).height(30);
    $(this).height(this.scrollHeight + parseFloat($(this).css("borderTopWidth")) + parseFloat($(this).css("borderBottomWidth")));
});

वर्तमान क्रोम, फ़ायरफ़ॉक्स और Android 2.3.3 ब्राउज़र में परीक्षण किया गया।

आप कुछ ब्राउज़रों में स्क्रॉल बार की झलक देख सकते हैं। इसे हल करने के लिए इस सीएसएस जोड़ें।

textarea{ overflow:hidden; }

यह बिल्कुल अच्छा काम नहीं करता है: / हर चरित्र मैं टाइप करता हूं, यह ऊंचाई जोड़ता है।
vsync

1
यह मेरे लिए एकदम सही काम करता है! सरल कोड में निश्चित रूप से ऐसा कुछ नहीं है जो आप कहते हैं कि यह करता है।
ड्रॉलेक्स

1
हाँ, मैं इसे अभी देख रहा हूँ, आपके कोड में वह पंक्ति होनी चाहिए जो प्रारंभ में ऊँचाई को 30 पर सेट करती है। यह शायद एक गैर-जरूरत वाला इल्न है क्योंकि यह डेवलपर को कोड को समझने के लिए मजबूर करता है, बजाय कोड को समझने और textarea के अनुकूल करने के लिए,
vsync

1
यह गलत है। डेवलपर को कोड को ट्विक करने की आवश्यकता नहीं है। ऊंचाई को 30 पर सेट करना आवश्यक है और यह सब कुछ के लिए काम करता है। उपयोगकर्ता कभी ऐसा नहीं देखता है। यही कारण है कि यह textarea सिकुड़ने में सक्षम है। कोड समझ और textarea के लिए अनुकूल है। पूरी बात यह है।
ड्रॉलेक्स

तुम सही हो। डेमो पेज: jsbin.com/ObEcoza/2/edit ( 1pxबेहतर होने के लिए ऊंचाई निर्धारित करना )
vsync

10

ऑटो एक्सपेंडेबल टेक्स्टारिया को परिभाषित करने के लिए, आपको दो काम करने होंगे:

  1. एक बार जब आप इसके अंदर Enter कुंजी पर क्लिक करते हैं, तो इसका विस्तार करें , या एक पंक्ति से अधिक सामग्री टाइप करें।
  2. और हटना (कलंक पर यह उपयोगकर्ता सफेद रिक्त स्थान में प्रवेश किया है, तो वास्तविक आकार पाने के लिए। बोनस )

कार्य को पूरा करने के लिए यहां एक हस्तनिर्मित समारोह है।

लगभग सभी ब्राउज़र (<IE7) के साथ ठीक काम करना । यहाँ विधि है:

    //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);
    });

यहाँ इस बारे में एक पोस्ट है।


6

मैंने अच्छे परिणामों के साथ Textarea Expander jQuery प्लगइन का उपयोग किया है ।


1
एक टेक्स्ट बॉक्स (इनपुट टेक्स्ट एलिमेंट जिसे मैं मानता हूं) मल्टीलाइन नहीं है। एक textarea का उपयोग करें लेकिन इसे उचित रूप से स्टाइल करें - पंक्तियाँ, कॉलम आदि, और फिर ऊपर के रूप में ऑटो-ग्रो प्लगइन का उपयोग करें।
अमीरजाद

4

हर किसी को इस jQuery प्लगइन का प्रयास करना चाहिए: xautoresize-jquery । यह वास्तव में अच्छा है और आपकी समस्या को हल करना चाहिए।


इसने मुझे सबसे अच्छे परिणाम दिए और इसे लागू करना भी आसान है।
ब्लिट्जकिड

4
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);
    });
});

(यह इंटरनेट एक्सप्लोरर 9 या पुराने में काम नहीं करेगा क्योंकि यह inputघटना का उपयोग करता है )


मेरे प्रोजेक्ट में, जैसा कि मैं Jquery और टाइपस्क्रिप्ट द्वारा पृष्ठ की पूरी चीजों को प्रस्तुत कर रहा हूं, आपका समाधान एकमात्र तरीका था जिससे मैं अपनी समस्या को हल कर सकता था धन्यवाद
हैरी सुरशोग

3

मैंने सिर्फ पगेलोड पर टेक्स्टारिस का विस्तार करने के लिए इस फ़ंक्शन का निर्माण किया। बस में परिवर्तन eachकरें keyupऔर यह तब होगा जब टेक्सटेरिया टाइप किया गया हो।

// 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);
});

क्रोम, IE9 और फ़ायरफ़ॉक्स में परीक्षण किया गया। दुर्भाग्य से फ़ायरफ़ॉक्स में यह बग है जो इसके लिए गलत मान लौटाता है scrollHeight, इसलिए उपरोक्त कोड में इसके लिए एक (हैकी) वर्कअराउंड है।


3

मैंने रीगेल द्वारा दिए गए उत्तर (स्वीकृत उत्तर) में कुछ कीड़े तय किए:

  1. जिस क्रम में html संस्थाओं को प्रतिस्थापित किया जाता है, वह छाया तत्व में अप्रत्याशित कोड का कारण नहीं बनता है। (मूल स्थान ">" द्वारा "& ampgt;", कुछ दुर्लभ मामलों में ऊंचाई की गलत गणना का कारण बनता है)।
  2. यदि पाठ एक नई रेखा के साथ समाप्त होता है, तो छाया को एक अतिरिक्त वर्ण "#" मिलता है, बजाय एक निश्चित अतिरिक्त ऊंचाई के, जैसा कि मूल में है।
  3. आरंभीकरण के बाद टेक्सारिया का आकार बदलना छाया की चौड़ाई को अद्यतन करता है।
  4. जोड़ा गया शब्द-आवरण: छाया के लिए ब्रेक-वर्ड, इसलिए यह एक textarea के रूप में एक ही टूट जाता है (बहुत लंबे शब्दों के लिए मजबूर करता है)

रिक्त स्थान से संबंधित कुछ शेष मुद्दे हैं। मुझे डबल स्पेस के लिए कोई समाधान दिखाई नहीं देता, वे छाया (html रेंडरिंग) में सिंगल स्पेस के रूप में प्रदर्शित होते हैं। यह रिक्त स्थान के टूटने के कारण & nbsp; का उपयोग करके नहीं देखा जा सकता है। इसके अलावा, एक स्थान के बाद टेक्सारिया एक लाइन को तोड़ता है, अगर उस स्थान के लिए कोई जगह नहीं है तो यह पहले के बिंदु पर लाइन को तोड़ देगा। सुझावों का स्वागत है।

सही कोड:

(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, '&amp;')
                                    .replace(/</g, '&lt;')
                                    .replace(/>/g, '&gt;')
                                    .replace(/\n/g, '<br/>')
                                    .replace(/\s/g,'&nbsp;');
                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));

3

आकार सिकुड़ने के साथ 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;
        };
    }
});

क्या तुमने मेरा जवाब तुम्हारे सामने देखा?
drolex

1
आपका समाधान मुझे शोभा नहीं देता, कुछ त्रुटि थी, जो मुझे याद नहीं है।
DSblizzard

2

इसने मेरे लिए बेहतर काम किया:

$('.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>


2

लोगों को लगता है बहुत काम किया समाधान ...

यह मेरा इसे करने का तरीका है:

  $('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);
  });

यह लंबी लाइनों के साथ काम करेगा, साथ ही लाइन टूट जाएगी .. बढ़ता है और सिकुड़ता है ।।


1

मैंने यह jquery फ़ंक्शन लिखा है जो काम करने लगता है।

आपको सीएसएस में न्यूनतम ऊंचाई निर्दिष्ट करना होगा, और जब तक आप कुछ कोडिंग नहीं करना चाहते, तब तक इसे दो अंकों का होना चाहिए। यानी 12 पीएक्स;

$.fn.expand_ta = function() {

var val = $(this).val();
val = val.replace(/</g, "&lt;");
val = val.replace(/>/g, "&gt;");
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");
}

1

Reigel द्वारा पोस्ट किए गए प्लगइन का उपयोग करने वाले किसी के लिए, कृपया ध्यान रखें कि यह इंटरनेट एक्सप्लोरर में पूर्ववत कार्यक्षमता को अक्षम कर देगा (गो डेमो दे ए गो)।

अगर यह आपके लिए एक समस्या है तो मैं इसके बजाय @richsage द्वारा पोस्ट किए गए प्लगइन का उपयोग करने का सुझाव दूंगा, क्योंकि यह इस समस्या से ग्रस्त नहीं है। अधिक जानकारी के लिए अंतिम आकार बदलने वाले Textarea के लिए खोज पर दूसरा बुलेट बिंदु देखें।



1

मैं एनिमेशन और ऑटो-हटना चाहता था। संयोजन स्पष्ट रूप से कठिन है, क्योंकि लोग इसके लिए बहुत गहन समाधान के साथ आए थे। मैंने इसे बहु-टेक्स्टरी-प्रूफ भी बनाया है। और यह jQuery प्लगइन के रूप में हास्यास्पद रूप से भारी नहीं है।

मैंने खुद को vsync के जवाब पर आधारित किया है (और इसके लिए उसने जो सुधार किया है), http://codepen.io/anon/pen/vlIwj मेरे सुधार का कोडपेन है।

एचटीएमएल

<textarea class='autoExpand' rows='3' data-min-rows='3' placeholder='Auto-Expanding Textarea'></textarea>

सीएसएस

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;
}

जे एस

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'; 
    }
});

नोट: मैंने देखा है कि यह कभी-कभी बॉक्स-साइज़िंग के साथ बेहतर काम करता है: सामग्री-बॉक्स। मुझे पूरी तरह यकीन नहीं है कि क्यों, हालांकि, इसे सही तरीके से पैडिंग की प्रक्रिया करनी चाहिए :(
Lodewijk

1

इसके लिए बहुत सारे उत्तर हैं, लेकिन मुझे कुछ बहुत ही सरल लगा, एक कुंजीपट घटना को टेक्स्टारिया में संलग्न करें और दर्ज करने के लिए जांच करें कुंजी कोड 13 है

keyPressHandler(e){ if(e.keyCode == 13){ e.target.rows = e.target.rows + 1; } }

यह आपके लिए textarea में एक और पंक्ति जोड़ देगा और आप CSS का उपयोग करके चौड़ाई को स्टाइल कर सकते हैं।


1

मान लीजिए कि आप नॉकआउट का उपयोग करके इसे पूरा करने की कोशिश कर रहे हैं ... यहां बताया गया है:

पेज में:

<textarea data-bind="event: { keyup: $root.GrowTextArea }"></textarea>

दृश्य मॉडल में:

self.GrowTextArea = function (data, event) {
    $('#' + event.target.id).height(0).height(event.target.scrollHeight);
}

यहां तक ​​कि अगर आपके पास नॉटआउट फोर्क द्वारा बनाए गए कई टेक्स्टारियस हैं जैसे कि मैं करता हूं तो भी यह काम करना चाहिए।



1

सबसे सरल उपाय:

एचटीएमएल:

<textarea class="auto-expand"></textarea>

सीएसएस:

.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);
        });
    });       
});

1

शुद्ध जेएस के साथ समाधान

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)
    }
  }
}

https://jsfiddle.net/Samb102/cjqa2kf4/54/


1

यह वह समाधान है जिसका मैंने उपयोग किया है। मैं एक इनलाइन समाधान चाहता था, और यह अब तक बहुत अच्छा काम करता है:

<textarea onkeyup="$(this).css('height', 'auto').css('height', this.scrollHeight + this.offsetHeight - this.clientHeight);"></textarea>

1

function autoResizeTextarea() {
  for (let index = 0; index < $('textarea').length; index++) {
    let element = $('textarea')[index];
    let offset = element.offsetHeight - element.clientHeight;
    $(element).css('resize', 'none');
    $(element).on('input', function() {
      $(this).height(0).height(this.scrollHeight - offset - parseInt($(this).css('padding-top')));
    });
  }
}

https://codepen.io/nanachi1/pen/rNNKrzQ

यह काम करना चाहिए।


0

@Georgiy Ivankin ने एक टिप्पणी में एक सुझाव दिया, मैंने इसे सफलतापूर्वक इस्तेमाल किया :) -, लेकिन थोड़े बदलाव के साथ:

$('#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 की अधिकतम ऊंचाई तक पहुँचने के बाद इसका विस्तार रुक जाता है


0

पुराना सवाल लेकिन आप ऐसा कुछ कर सकते हैं:

एचटीएमएल:

<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);
        }
    });

इस तरह ऑटो रिसाइज किसी भी textarea पर "text-area" क्लास के साथ लागू होगा। पाठ हटाए जाने पर भी सिकुड़ जाता है।

jsfiddle:

https://jsfiddle.net/rotaercz/46rhcqyn/


0

इसे इस्तेमाल करे:

  $('textarea[name="mytextarea"]').on('input', function(){
    $(this).height('auto').height($(this).prop('scrollHeight') + 'px');
  }).trigger('input');

0

सरल jQuery समाधान:

$("textarea").keyup(function() {
    var scrollHeight = $(this).prop('scrollHeight') - parseInt($(this).css("paddingTop")) - parseInt($(this).css("paddingBottom"));

    if (scrollHeight > $(this).height()) {
        $(this).height(scrollHeight + "px");
    }
});

HTML:

<textarea rows="2" style="padding: 20px; overflow: hidden; resize: none;"></textarea>

ओवरफ्लो को छिपाया जाना चाहिए। आकार है कोई भी अगर आप इसे माउस द्वारा पुनः आकार देने योग्य बनाने के लिए नहीं करना चाहती।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.