首页前端开发HTMLHTML5 textarea高度自适应的两种方案

HTML5 textarea高度自适应的两种方案

时间2024-01-25 04:09:41发布访客分类HTML浏览425
导读:收集整理的这篇文章主要介绍了HTML5 textarea高度自适应的两种方案,觉得挺不错的,现在分享给大家,也给大家做个参考。 阅读全文你将获得以下解决方案。 点击长文本编辑textarea,自动获得焦点 随着输入值...
收集整理的这篇文章主要介绍了HTML5 textarea高度自适应的两种方案,觉得挺不错的,现在分享给大家,也给大家做个参考。

阅读全文你将获得以下解决方案。

  • 点击长文本编辑textarea,自动获得焦点
  • 随着输入值自动伸缩高度
  • 可复制添加信息
  • 可粘贴文本
  • 可粘贴图片

以下实例代码执行环境为Chrome80

方案一

HTML5 Textarea 元素

1. 自动获得焦点

点击编辑自动获得焦点后光标跳转到了最前面,why?

查文档 MDN,textarea元素存在selectionEndselectionStart的属性用来表示选中的文本开始位置和结束位置,DOM接口实例是 HTMLTextAreaElement, 它具有 setSelectionRange 方法,用来选中输入框中的文本,用法:TextAreaElement.setSelectionRange(selectionStart, selectionEnd, [optional] selectionDirection);

那么我们只要做到selectionStart === selectionEnd === value.length , 这样光标就选中到最末尾。

edIT.addEventListener("click", function() {
      txt.classList.add("hidden");
      document.body.insertBefore(textarea, edit);
      textarea.innerHTML = "这是需要编辑的信息";
      textarea.focus();
      // textarea.selectionEnd = textarea.innerHTML.length;
      textarea.setSelectionRange(    textarea.innerHTML.length,    textarea.innerHTML.length  );
}
    );
    

2. 自适应高度

当不设置高度时换行会出现滚动条,所以只要让textarea滚动条消失,让其height = scrollHieght, 那么如何监听textarea的变化,则需要input事件,让textarea高度动态等于它的scrollHeight即可,代码如下:

textarea.addEventListener("input", function() {
    this.style.height = `${
this.scrollHeight}
    px`;
}
    );
    

为什么每次输入都会使得高度增加(每次增加4px),经过测试Safari同样也是这个效果,Firefox符合预期高度不异常增加,查看Chrome控制台发现textarea内置了很多样式,尝试将去掉padding后,可以正常随着内容增加高度自适应了。

style>
textarea {
      padding: 0;
}
    /style>
    textarea>
    /textarea>
    script>
    const textarea = document.createElement("textarea");
textarea.addEventListener("input", function(e) {
  this.style.height = `${
this.scrollHeight}
    px`;
}
    );
    /script>
    

为什么去掉padding值,输入后高度就不增加了?(未找到合理的解释,欢迎留言讨论解答)

但是删除文本的情况下height并未能自动缩放,分析原因, 当删除文本换行的时候scrollHeight的大小并未发生改变,scrollHeight作为只读属性( MDN-文档),如何让scrollHeight高度重新计算哪?只有改变高度,于是:

textarea.addEventListener("input", function(e) {
      this.style.height = "inherit";
  this.style.height = `${
this.scrollHeight}
    px`;
}
    );

到此高度自适应输入内容完成,但是每次换行的闪动很难受,transition走一波,

@H_360_115@textarea { overflow: hidden; // 防止换行出现滚动条闪动 padding: 5px 10px; box-sizing: border-box; transition: all 0.2s linear; }

结果transition并没效果,原因height初始值或者参考值必须为数值过渡动画才会生效,height设置为auto或者inherit动画不会生效, 所以折中的办法就是当删除的时候重新重置高度,输入时不需要重置,这样输入时动画生效, 删除没有动画, 暂时没想到更好的办法。

textarea.addEventListener("keyup", function(e) {
  if (e.keyCode === 8) {
        this.style.height = "inherit";
    this.style.height = `${
this.scrollHeight}
    px`;
  }
 else {
    this.style.height = `${
this.scrollHeight}
    px`;
  }
}
    );
    

3. 支持粘贴文本,图片等

textarea只能输入文本,无法实现粘贴图片。

textarea.addEventListener(  "paste",  function(e) {
        e.preventDefault();
        console.LOG(      "paste",      e.clipboardData.items,      e.clipboardData.tyPEs,      e.clipboardData.getData("text/html"),      e.clipboardData.getData("text/plain"),      e.clipboardData.getData("text/Files")    );
  }
    ,  false);
    

方案二

div contenteditable 替换textarea

1. 自动获得焦点

编辑div contenteditabletrue,然后利用RangeSelection 光标移动到最后的效果。

edit.addEventListener("click", () =>
 {
      textarea.setattribute("contenteditable", true);
      textarea.focus();
      const range = document.createRange();
      // range 包含的内容  range.selectNodeContents(textarea);
      // range.setStart(textarea.FirstChild, 0);
      // range.setStart(textarea.lastChild, textarea.innerHTML.length);
      // 起始位置是否相同  range.collapse(false);
      const sel = window.getSelection();
        // 将所有的区域都从选区中移除。  sel.removeAllRanges();
        // 一个区域(Range)对象将被加入选区。  sel.addRange(range);
}
    );
    

2. 自适应高度

div contenteditable 天然支持根据输入来自适应高度。

3. 粘贴图片, 文本等

textarea.addEventListener("paste", function(e) {
      e.PReventDefault();
      const clipboardData = e.clipboardData || e.originalEvent.clipboardData;
      // 获取纯文本  let text = clipboardData.getData("text/plain");
      let file = clipboardData.getData("text/plain");
      // console.log(clipboardData.items, clipboardData.getData("text/Files"));
      // 插入img,可以做一些上传图片的一些操作  insertImg(clipboardData);
      // 只输入纯文本  document.execCommand("insertText", false, text);
}
    );
    

此方法可以限定只能上传文本或者图片。

欢迎留言讨论其他textarea高度自适应的方案。

到此这篇关于HTML5  textarea高度自适应的两种方案的文章就介绍到这了,更多相关textarea高度自适应内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

textarea

若转载请注明出处: HTML5 textarea高度自适应的两种方案
本文地址: https://pptw.com/jishu/586115.html
html5启动原生APP总结 详解HTML5如何使用可选样式表为网站或应用添加黑暗模式

游客 回复需填写必要信息