键入文本时扩展的 CSS Textarea

IT技术 javascript jquery html css textarea
2021-03-03 05:55:35

我有一个 Textarea,用户可以在其中输入文本。默认情况下,它的高度为 17px。但是,如果用户插入大量文本,我希望文本区域相应地扩展。有没有办法用 CSS 做到这一点?提前致谢!!

6个回答

这不能单独使用 CSS 来完成。尝试自动增长 jquery 插件。 https://github.com/jaz303/jquery-grab-bag/blob/master/javascripts/jquery.autogrow-textarea.js

您还可以在此处查看自动增长演示http://onehackoranother.com/projects/jquery/jquery-grab-bag/autogrow-textarea.html

它重量轻且易于使用。这是它的完成方式。定义你的 textarea id。在 .js 之前包含 jquery js 文件</body>然后在脚本标签之间,发出 jquery 命令$("#txtInput").autoGrow();

<body>
    <textarea id="txtInput"></textarea>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> 

<script>
    $("#txtInput").autogrow();
</script>
</body>
$('#textInput').autoGrow(); 应该 $(#txtInput).autogrow();
2021-04-19 05:55:35
为什么 javascriptly 链接带我 bet365.com !
2021-05-10 05:55:35

我知道这有点晚了,但我不得不说有一种方法可以使用<div>withcontenteditable属性来模拟所需的行为。

.textareaElement {
  width: 300px;
  min-height: 17px;
  border: 1px solid #ccc;
  max-height: 150px;
  overflow-x: hidden;
  overflow-y: auto;
}
<div class="textareaElement" contenteditable></div>

只需设置您的最小和最大高度,使用适当的溢出值,您就拥有功能齐全的纯 CSS 扩展文本框,这也得到了很好的支持。

在此处输入图片说明

很好的解决方案,因为我只关心 Chrome 支持。谢谢!
2021-04-26 05:55:35
我认为这也是一个很好的解决方案,但是如果您对文本进行任何操作,contentEditable 很快就会变成一场灾难,因为它的处理方式非常不同,而且文档也不是很好。如果您只想要一个简单的文本输入,那么,是的,但请注意有很多带有可编辑内容的曲线球。
2021-05-02 05:55:35
这是一个很好的解决方案!唯一的复杂之处在于,当您按 Enter/return 时,它会将所有新文本放入一个<div>块中。所以innerHTML变成了一个文本节点,后面跟着一堆<div>s。
2021-05-11 05:55:35

这个 jQuery 插件真的很棒:http : //www.jacklmoore.com/autosize

我已经测试了很多这些,这是迄今为止最好的。还给出了一个使用 CSS 过渡效果的例子,它非常漂亮。

我同意这是最好的解决方案。最重要的是,它修复了这个错误: 当 textarea y-overflow 被隐藏时,Chrome/Safari 不会重排文本以考虑通过删除滚动条提供的可用空间。 标记为答案的自动增长 jquery 插件没有此修复程序。
2021-04-26 05:55:35

**请注意,这与上面 Woody 的回答非常相似,但想对其进行一些扩展并提供一个运行代码示例,因为 Stack 允许我们嵌入它们。

在阅读了所有这些并尝试了几个插件之后,我发现这些都没有像我希望的那样奏效。我使用 jquery 执行了以下操作,但可以通过抓取填充值而不是使用内部高度来使用 javascript 轻松完成:

  • 在 CSS 中设置textarea的最小高度
  • 将溢出设置为隐藏以进行垂直滚动(我只想垂直扩展)
  • 如果滚动高度高于高度 + 填充(innerHeight),则在每个keyup事件上将高度设置为滚动高度减去填充
  • 如果滚动高度不高,我将高度重新设置为 1,然后将高度设置为滚动高度减去填充(缩小高度)。如果最初不重置为较小的高度,则滚动高度不会缩小。

$(function() {
  $('#myTextArea').on('input keyup paste', function() {
    var $el = $(this),
        offset = $el.innerHeight() - $el.height();

    if ($el.innerHeight() < this.scrollHeight) {
      // Grow the field if scroll height is smaller
      $el.height(this.scrollHeight - offset);
    } else {
      // Shrink the field and then re-set it to the scroll height in case it needs to shrink
      $el.height(1);
      $el.height(this.scrollHeight - offset);
    }
  });
});
#myTextArea {
  width: 250px;
  min-height: 35px;
  overflow-y: hidden;
}
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
<textarea id="myTextArea" placeholder="Hit enter a few times, it should expand"></textarea>

可能有一种更优雅的方法来执行此操作,但您始终可以手动触发 keyup 事件,以便在从数据库加载数据后运行上述代码 -- $('#test').keyup(); 如果它是一个静态页面,其中包含数据库数据在服务器端呈现,您可以将 keyup 事件放在 jquery 就绪函数中,以便它在 jquery 和其他库加载后运行 -- $(function() { $('#测试').keyup(); });
2021-04-22 05:55:35
这对我使用“键盘粘贴输入”很有用 - 除非我从数据库加载数据。当我点击它时,文本区域会扩展,但正如最初显示的那样,它只会显示第一行。我的 JQuery 是“按需”的,因此基本上不存在。我尝试添加一些事件,例如“准备好”、“加载”等,但似乎没有任何效果。有人有任何提示吗?
2021-04-24 05:55:35
非常感谢您的回复。我尝试过 keyup 没有成功 - 可能是因为我在 ListView 中有很多文本框的实例,我在 JS 中按类标识了它们。我用了 $(".ExpandableText").keyup(); 并尝试使用单引号。没有人抱怨初始尺寸。不过也只是时间问题。
2021-05-07 05:55:35

您不需要为此使用插件。这适用于任何大小、高度或行大小的 textarea,并且仅当内容超出 textarea 时才有效。首先将目标文本区域上的溢出设置为隐藏并调整为无,然后将以下功能添加到要自动增长的文本区域。它不仅会在用户键入时增加 textarea 的大小,还会在删除内容时自动缩小它。

$('textarea').on('paste input', function () {
    if ($(this).outerHeight() > this.scrollHeight){
        $(this).height(1)
    }
    while ($(this).outerHeight() < this.scrollHeight + parseFloat($(this).css("borderTopWidth")) + parseFloat($(this).css("borderBottomWidth"))){
        $(this).height($(this).height() + 1)
    }
});

它的工作原理是测量 textarea 的滚动高度是否大于外部高度,只有当文本多于 textarea 可以容纳的文本时才会出现这种情况 - 并且它考虑了边框大小以获得更高的准确性。使用粘贴和输入意味着它只会在用户物理更改 textarea 的值时增加,而不是在他们按下任意键时。这是小事,但当有人按下箭头键或其他东西时,textarea 不应该增长。

为那些没有 Javascript 的人添加一个 No JS 选项来重新启用溢出和调整大小可能是谨慎的,否则他们会被一个小盒子卡住。

只要您不忘记包含 jQuery 库,它就可以正常工作!!!Yarin jsfiddle 没有它。但是一旦您在选项中选择了 jQuery 1.9.1,就一切都好了。
2021-05-02 05:55:35
@ekashking 我没有得到那个结果。
2021-05-02 05:55:35
它有效,但由于某种原因,在我有许多表格和文本区域的复杂页面上它非常慢,有时在按下 Enter 键后会暂停一两秒钟。
2021-05-05 05:55:35
之后不会减少。
2021-05-11 05:55:35