【问题标题】:It is possible to expand a textarea only with CSS?是否可以仅使用 CSS 扩展文本区域?
【发布时间】:2013-03-29 18:15:16
【问题描述】:

我有一个高度为 200px 的 textarea,但是当我通过文本传递 200px 时,我希望扩展 textarea 而不是使用滚动条保持 200px 的高度。

只有 CSS 可以做到这一点吗?

【问题讨论】:

  • 不,不可能只使用 css
  • 这是一个很好的例子,说明使用 CSS 可以对 textarea 做些什么:css-tricks.com/textarea-tricks 我相信您正在寻找的是 7. 自动调整大小以适应内容。
  • 来自 Mason240 的评论,css-tricks.com/textarea-tricks第 7 节。自动调整大小以适应内容 使用 jQuery/JavaScript not CSS,尽管有标题。正如上面 user1317647 所说,仅使用 CSS 是不可能的,但需要脚本。
  • 查看这个答案以了解如何使用 js:stackoverflow.com/questions/454202/…(不需要太多 js、oninput 事件和 rows = split("\n").length 效果很好)

标签: html css


【解决方案1】:

不幸的是没有,但是用 JS 很容易:

let el = document.getElementById(`myTextarea`);
el.addEventListener("input", function() {
  if (el.scrollTop != 0)
    el.style.height = el.scrollHeight + "px";
});

在我的例子中,我有一个玩家姓名列表,我正在为每个玩家循环执行此操作。

              humansContainer.innerHTML = humans
                .map(
                  (h, i) =>
                    `<div><textarea id="human_${i}" type="text" value="${h}">${h}</textarea></div>`
                )
                .join("");
              humans.forEach((h, i) => {
                let el = document.getElementById(`human_${i}`);
                el.addEventListener("input", function(e) {
                  let name = el.value;
                  if (el.scrollTop != 0)
                    el.style.height = el.scrollHeight + "px";
                  humans[i] = name;
                });
              });

【讨论】:

    【解决方案2】:

    仅使用 CSS 就可以让用户扩展文本区域。事实上,在一些现代浏览器中,这种可扩展性甚至是浏览器的默认设置。您可以明确要求:

    textarea { resize: both; }
    

    浏览器支持正在增长,但仍然有限。

    通常只有一个关于可调整大小的小提示:右下角的调整大小手柄。而且恐怕大多数用户不会理解这个提示。

    您不能仅使用 CSS 使文本区域自动按内容扩展。

    【讨论】:

    • 我认为应该是“右角”...?
    • 对,多恩。我解决了这个问题。 (并且当书写方向是从右到左时,手柄出现在左下角。)
    【解决方案3】:

    不,不可能只使用 css,但您可以使用 jquery:

    $('#your_textarea').on('keydown', function(e){
        var that = $(this);
        if (that.scrollTop()) {
            $(this).height(function(i,h){
                return h + 20;
            });
        }
    });
    

    【讨论】:

      【解决方案4】:

      您可以将divcontentEditable 属性一起使用,而不是textarea

      div {
        display: inline-block;
        border: solid 1px #000;
        min-height: 200px;
        width: 300px;
      }
      &lt;div contentEditable="true"&gt;&lt;/div&gt;

      DEMO

      【讨论】:

      • +1 非常好的方法。如果我们可以用div 替换textarea,它可以工作并且得到很好的支持:caniuse.com/#feat=contenteditable
      • 唯一的问题是这种元素在提交表单时没有默认传递,需要使用Javascript来处理
      • 光标在 iOS 中没有出现在这个解决方案中,所以很遗憾没有完全削减它
      • 另一个问题是,如果您将格式化的文本复制并粘贴到框中,you get HTML inserted 那里。
      • @Engineer 这个问题现在有更现代的答案还是你的答案仍然是更好的选择?
      【解决方案5】:

      这是一个简单的、纯 php 和 html 的解决方案,不需要 js,使 textarea 适合大小。 HTML: &lt;textarea rows="&lt;?php echo linecount($sometext, 100, 3);?&gt;" cols="100" name="sometext"&gt;&lt;?php echo $sometext;?&gt;&lt;/textarea&gt;

          <?php
         /* (c)MyWeb.cool, 2014
         * -------------------------------------------------------------------------
         *Calculate number of rows in a textarea.
         *  Parms :   $text:      The contents of a textarea,
         *            $cols:      Number of columns in the textarea,
         *            $minrows:   Minimum number of rows in the textarea,
         *  Return:   $row:       The number of in textarea.
         * ---------------------------------------------------------------------- */
         function linecount($text, $cols, $minrows=1) {
         // Return minimum, if empty`
         if ($text <= '') {
          return $minrows;
         }
         // Calculate the amount of characters
         $rows = floor(strlen($text) / $cols)+1; 
         // Calculate the number of line-breaks
         $breaks = substr_count( $text, PHP_EOL );
         $rows = $rows + $breaks;
         if ($minrows >= $rows)   {
          $rows = $minrows;
         }
         // Return the number of rows
         return $rows;
         }
         ?> 
      

      `而且这个更短更好:

      function linecount($text, $cols, $minrows=1) {
          if ($text <= '') {return $minrows;}
          $text = wordwrap($text, $cols, PHP_EOL);
          $rows = substr_count( $text, PHP_EOL )+1;
          if ($minrows >= $rows) {$rows = $minrows;}
          return $rows;
      }
      ?>
      

      【讨论】:

      • 这不会在用户输入更多文本时扩展客户端的文本区域。这通常也不是一个好主意 - 除非您使用等宽字体,否则您无法通过计算字符来测量文本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多