jQueryを使用してテキストエリアを自動拡張する


128

jQueryを使用してtextareaを自動的に拡張するにはどうすればよいですか?

会議の議題を説明するテキストボックスがあるので、議題のテキストがテキストボックス領域を拡大し続けているときに、そのテキストボックスを拡張したいと考えています。


textareaは自動拡張可能です。
andrew Sullivan


質問を変更して「jQuery」という単語を削除することを検討してください
vsync

回答:


113

私はたくさん試しました、そして これは素晴らしいです。 リンクが死んでいる。新しいバージョンはこちらから入手できます。古いバージョンについては、以下を参照してください。
テキストエリアでエンターキーを押し続けることで試すことができます。他の自動拡張textareaプラグインと効果を比較します。

コメントに基づいて編集

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

注:必要なjsファイルを含める必要があります...

膨張/収縮の際に&オフ点滅からテキストエリアにスクロールバーを防ぐために、あなたが設定できるoverflowhiddenも同様に:

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




更新:

上記のリンクは壊れています。ただし、JavaScriptファイルはこちらから入手できます


テキストボックスIDがtxtMeetingAgendaの場合、jqueryにAuto textAreaプロパティをどのように実装できますか
Piyush

ここでクリックイベントが定義されているかどうか
Piyush

これはすべてtextareaについてですが、textboxについてはどうですか?このプラグインはtextboxでも機能しますか?
Piyush

1
このプラグインはうまく機能しません。自動サイズを試してみてください。それはずっと良い方法です
julesbou

textareaが大きくなると、一方向にしか機能しません。ただし、テキストの削除を開始しても、高さが自動的に減少するわけではありません。
ekashking 2018

166

プラグインが必要ない場合は、非常に簡単な解決策があります

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

私がここで別のtextarea質問に答えるのに使用したjsFiddleで動作することを確認してください

テキストを削除するときに逆にするか、小さくするかという質問に答えるには:jsFiddle

プラグインが必要な場合

@Jasonここで設計しました


1
私は、そうでなければ無限にブートストラップでスタイルテキストエリアでループし、+ parseFloatは($(この)の.css( "borderTopWidth"))+ parseFloatは($(この)の.css( "borderBottomWidthを"))削除する必要がありました
blacelle

3
jQueryなしバージョン:if (this.clientHeight < this.scrollHeight) { this.style.height = this.scrollHeight + 'px'; }
Georgii Ivankin 2015

3
@metakungfu反対票を投じるのではなく、答えを改善するのに役立つでしょう。アップルクラップのatmをテストする方法はありません。Windowsのサファリはずっと前に廃止されました。だから私はそれがうまくいかない理由を決定するために本当に何もすることができません。コード的には、このソリューションには何の問題もありません。jsfiddleでサファリが壊れているのではなく、壊れているのはコードですか?サファリはかなりうるさいですし、フィドルはメジャーアップデートを行っただけです。Mayebあなたは開発コンを開いて、さらに詳細を提供できますか?
SpYk3HH 2016

1
また、点滅、スクロールを防止するために隠されたテキストエリアにオーバーフロー-yのセットを必要とする
iulial

2
追加した行を削除したい場合、テキストボックスの拡大サイズは同じままですが、自動的にサイズ変更することもできますか?
スティーブン

33

テキストエリアを拡大/縮小します。このデモでは、イベントバインディングに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;
    });

2
入力した文字が
textarea

1
どうやら、テキストが任意のソースからコピー(CTRL + V)されると、ソリューションは壊れます。一方、テキストを手動で入力した場合-これは素晴らしく、非常にスムーズです。
Satya Kalluri 2014

1
@vsync:複数のテキスト領域をどのように変更しますか?つまり、textarea1とtextarea2があり、両方を拡張できるようにしたいですか?
jmoreno 2015

1
これが一番の答えになるはずです!私はそれに基づいて質問を投稿しました。興味がある場合は、stackoverflow.com
questions / 29930300 /…

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>


$(this)からscrollHeightを取得したい場合は、$(this).prop( 'scrollHeight');を使用できます。代わりに;)
Samuel Vicent 2017

3
改行ごとに点滅します
joe

11

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

それはまったくうまく機能しません:/入力したすべての文字、高さを追加します。
vsync 2013年

1
それは私にぴったりです!単純なコードには、あなたの言うとおりのことは何もありません。
drolex 2013年

1
ええ、私は今それを見て、あなたのコードは最初に高さを30に設定する行を持っている必要があります。それは、理解し、テキストエリアに適応する代わりに、コードの、コードを微調整するために、開発者を強制するので、これはおそらく不必要なilneある
VSYNC

1
不正解です。開発者はコードを微調整する必要はありません。高さを30に設定する必要があり、それはすべてに対して機能します。ユーザーはそれが起こるのを見ることはありません。それがテキストエリアを縮小する方法です。コードは、textareaを理解して適応します。それがポイントです。
drolex 2013年

あなたは正しいです。デモページ:jsbin.com/ObEcoza/2/edit(高さを設定する1px方が良いようです)
vsync

10

自動拡張可能なテキストエリアを定義するには、2つのことを行う必要があります。

  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を使用しますが、行、列などを適切にスタイル設定してから、上記のように自動拡張プラグインを使用します。
richsage


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

(これはinputイベントを利用するため、Internet Explorer 9以前では機能しません)


私のプロジェクトでは、Jqueryとtypescriptを使用してページ全体をレンダリングしているので、あなたの解決策が私の問題を解決できる唯一の方法でした。ありがとう
Harry Sarshogh

3

この関数を作成して、ページロード時にテキスト領域を拡張しました。に変更eachするだけでkeyup、textareaが入力されたときに発生します。

// 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ため、上記のコードには(ハックな)回避策が含まれています。


3

Reigelによって提供された回答(承認された回答)のいくつかのバグを修正しました。

  1. htmlエンティティが置き換えられる順序により、shadow要素で予期しないコードが発生しなくなりました。(元の ">"を "&ampgt;"に置き換えたため、まれに高さの計算が正しく行われませんでした)。
  2. テキストが改行で終わっている場合、元のように高さが固定されているのではなく、影に「#」が追加されます。
  3. 初期化後にテキスト領域のサイズを変更すると、影の幅が更新されます。
  4. ワードラップを追加しました:シャドウのブレークワードなので、テキストエリアと同じようにブレークします(非常に長いワードのブレークを強制します)

スペースに関するいくつかの問題が残っています。ダブルスペースの解決策はありません。それらは、シャドウ内のシングルスペースとして表示されます(htmlレンダリング)。&nbsp;を使用してスペースを区切る必要があるため、これを解決することはできません。また、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, '&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 2013年

1
あなたの解決策は私に合いません、いくつかのエラーがありました、私はどれを覚えていません。
DSblizzard 2013

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関数を作成しました。

ただし、CSSでmin-heightを指定する必要があります。コーディングを行わない限り、2桁にする必要があります。すなわち12px;

$.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によって投稿されたプラグインを使用している人は、これによりInternet Explorerの元に戻す機能が無効になることに注意してください(デモを実行してください)。

これが問題である場合は、代わりに@richsage によって投稿されプラグイン を使用することをお勧めします。この問題の影響を受けないためです。詳細については、「究極のサイズ変更テキストエリアの検索」の2番目の箇条書きを参照してください。



1

アニメーションと自動縮小が欲しかった。人々はそれにかなり強力な解決策を考え出したので、組み合わせは明らかに難しいです。私もそれをマルチテキストエリアプルーフにしました。そして、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'; 
    }
});

注:私は、box-sizing:content-boxを使用すると、より適切に機能する場合があることに気付きました。理由はよくわかりませんが、パディングを正しく処理する必要があります:(
Lodewijk

1

これには多くの答えがありますが、私は非常に単純なものを見つけました、テキストエリアにキーアップイベントをアタッチし、Enterキーを押してキーコードを確認します13

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

これにより、textareaに別の行が追加され、CSSを使用して幅をスタイルできます。


1

Knockoutを使用してこれを達成しようとしているとしましょう...以下がその方法です。

ページ内:

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

ビューモデル:

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

これは、私と同じように、Knockout foreachによって作成された複数のテキストエリアがある場合でも機能するはずです。


1

簡単な解決策:

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

https://fiddle.jshell.net/7wsnwbzg/


1

最も簡単な解決策:

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

1

純粋な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)
    }
  }
}

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

古い質問ですが、次のようなことができます:

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」を持つすべてのtextareaに適用されます。また、テキストが削除されると縮小します。

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>

オーバーフロー非表示にする必要があります。マウスでサイズを変更したくない場合は、サイズ変更はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.