文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在HTML5中使用 textarea实现高度自适应

2023-06-09 11:43

关注

今天就跟大家聊聊有关怎么在HTML5中使用 textarea实现高度自适应,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

方案一

HTML5 Textarea 元素

1. 自动获得焦点

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

怎么在HTML5中使用 textarea实现高度自适应

查文档 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`;});

怎么在HTML5中使用 textarea实现高度自适应

为什么每次输入都会使得高度增加(每次增加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走一波,

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

看完上述内容,你们对怎么在HTML5中使用 textarea实现高度自适应有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯