使用jQuery自动扩展文本区域


Answers:


113

我已经尝试了很多, 这很棒。 链接已死。此处有较新的版本。参见以下旧版本。
您可以通过在文本区域中按住Enter键来尝试。将效果与其他自动扩展的textarea插件进行比较。...

根据评论进行编辑

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

注意:您应该包括所需的js文件...

为了防止在textarea的滚动条从扩张/收缩的过程中通断闪烁,您可以设置overflowhidden还有:

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




更新:

上面的链接已断开。但是您仍然可以在此处获取javascript文件。


如果我的文本框ID是txtMeetingAgenda,那么我如何在jquery中实现Auto textArea属性
Piyush 2010年

点击事件是否已定义
Piyush 2010年

这都是关于textarea的,但是关于textbox的呢。这个插件也可以用于textbox吗?
Piyush 2010年

1
这个插件不能很好地工作,尝试自动调整大小,它的方式更好
julesbou

当textarea增长时,它仅能正常工作的一种方法。但是,当您开始删除文本时,并不会自动减小高度。
ekashking '18

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

如果您确实想要插件

@Jason 在这里设计了一个


1
我必须删除+ parseFloat($(this).css(“ borderTopWidth”))+ parseFloat($(this).css(“ borderBottomWidth”))),否则它会无限循环,并带有引导程序样式的textarea
blacelle

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

3
@metakungfu好吧,不仅可以投票,还可以帮助改善答案。我没有任何方法可以测试Windows的Apple Crash Atm和Safari早已停产。因此,我实际上无法做任何事情来确定为什么它不起作用。在代码方面,此解决方案没有错。您确定是jsfiddle中的代码破坏了而不是Safari破坏了吗?野生动物园非常挑剔,小提琴琴只经过了重大更新。Mayeb您可以打开dev con并提供更多细节吗?
SpYk3HH 2016年

1
还需要将textarea溢出-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内,并因此更改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>


如果要从$(this)获取scrollHeight,则可以使用$(this).prop('scrollHeight'); 相反;)
塞缪尔·维森特

3
它会在每个换行符处闪烁

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

1
它对我来说很完美!在简单的代码中绝对没有任何内容可以做到您所说的。
drolex

1
是的,我现在看到了,您的代码必须具有将高度初始设置为30的行。这可能是不需要的,因为它会迫使开发人员调整代码,而不是代码来理解和适应文本区域,
vsync

1
那是不对的。开发人员无需调整代码。将高度设置为30是必需的,它适用于所有情况。用户永远不会看到这种情况发生。这样便可以缩小文本区域。该代码可以理解并适应文本区域。这就是重点。
drolex

你是对的。演示页面:jsbin.com/ObEcoza/2/edit(将高度设置为1px似乎更好)
vsync

10

要定义自动扩展的文本区域,您必须做两件事:

  1. 扩大它,一旦你点击回车键里面,或者多行多类型的内容。
  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 2010年


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

(这在Internet Explorer 9或更早版本中无法使用,因为它利用了该input事件)


在我的项目中,由于我正在通过Jquery和Typescript在页面中呈现整个内容,因此您的解决方案是我解决问题的唯一途径,谢谢
Harry Sarshogh 2016年

3

我只是构建了此功能来扩展页面加载时的文本区域。只需更改eachkeyup,它将在键入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元素中引起意外的代码。(原来的“>”替换为“&amp;”,在某些极少数情况下会导致高度计算错误)。
  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

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函数。

但是,您需要在css中指定min-height,除非您想进行一些编码,否则它的长度必须为两位数。即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 发布插件 ,因为它不会遇到此问题。有关更多信息,请参见“ 搜索最终调整大小的文本区域”的第二个要点。



1

我想要动画和自动收缩。这种组合显然很难,因为人们为此提出了非常强烈的解决方案。我也做了多文本区域验证。而且它不像jQuery插件那么可笑。

我基于vsync的答案(以及他为此所做的改进),http://codepen.io/anon/pen/vlIwj://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

对此有很多答案,但我发现很简单,将keyup事件附加到textarea上,然后按Enter键检查输入键,键码为13

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

这将为您的文本区域添加另一行,您可以使用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);
}

即使您像我一样通过淘汰赛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);
        }
    });

这样,自动调整大小将适用于所有具有“文本区域”类的文本区域。删除文本时也会缩小。

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>

溢出应该被隐藏。如果不想通过鼠标调整大小,则“调整大小”为“无”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.