H5中textarea高度自适应有什么实现方法,代码是什么
Admin 2022-07-12 群英技术资讯 782 次浏览
这篇文章给大家介绍了“H5中textarea高度自适应有什么实现方法,代码是什么”的相关知识,讲解详细,步骤过程清晰,有一定的借鉴学习价值,因此分享给大家做个参考,感兴趣的朋友接下来一起跟随小编看看吧。阅读全文你将获得以下解决方案。
以下实例代码执行环境为Chrome80
方案一
HTML5 Textarea 元素
1. 自动获得焦点
点击编辑自动获得焦点后光标跳转到了最前面,why?

查文档 MDN,textarea元素存在selectionEnd和selectionStart的属性用来表示选中的文本开始位置和结束位置,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走一波,
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 contenteditable为true,然后利用Range和Selection 光标移动到最后的效果。
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);
});
此方法可以限定只能上传文本或者图片。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本篇文章主要的为大家介绍了关于HTML5中的canvas标签的绘图,说明了html5 canvas标签的定义和基本的使用过程,添加了点css样式和js的基础知识,让整篇文章的难度增大了,不过按着代码操作总没错的。接下来让我们一起来看看这篇文章吧
css会阻塞页面渲染吗?对于这个问题,一些朋友可能不是很了解,因此这篇文章就和大家一起来探讨分析看看,本文会从从浏览器的渲染过程来进行解析,感兴趣的朋友就继续往下看吧。
如何把图片变成“伪像素风”?本篇文章给大家介绍一下使用CSS处理图片,将其转为“像素风”的方法,希望对大家有所帮助!
本篇文章主要给大家介绍下掌握CSS布局技巧有哪些的内容,横向两列布局(左列固定,右列自适应)可以用四种CSS方式来实现。下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
使用CSS怎样实现元素粘滞效果?很多朋友可以不是很了解什么是粘滞效果,也就是从一个元素中,点击会出现多个元素的效果,例如下文这样的点击分享的功能,那么这个效果是怎样做的呢?接下来就给大家简单的介绍一下。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008