javascript - textarea 自动调整大小无法正常工作
问题描述
所以我对我从互联网上获取的这个自动调整大小功能有疑问(作者:Adam Beres-Deak)。除了一个小问题外,一切都运行良好;假设 textarea 有 100 行(或超过页面可以容纳的行数)并说您在中间编辑某些内容,屏幕将一直跳到浏览器/屏幕底部以使文本 RIGHT。
(function(){
function adjustHeight(el, minHeight){
var outerHeight = parseInt(window.getComputedStyle(el).height, 10);
var diff = outerHeight - el.clientHeight;
el.style.height = 0;
el.style.height = Math.max(minHeight, el.scrollHeight + diff) + 'px';
}
var textAreas = [].slice.call(document.querySelectorAll('textarea[data-adaptheight]'));
textAreas.forEach(function(el){
el.style.boxSizing = el.style.mozBoxSizing = 'border-box';
el.style.overflow = 'hidden';
var minHeight = el.scrollHeight;
el.addEventListener('input', function(){
adjustHeight(el, minHeight);
});
window.addEventListener('resize', function(){
adjustHeight(el, minHeight);
});
adjustHeight(el, minHeight);
});
}());
<textarea data-adaptheight rows="2" cols="40" placeholder="Your input" style="padding: 7px; line-height: 1.5;width: 100%;display: block;"></textarea>
有人知道是什么原因造成的吗?我不是最擅长 javascript,但我确实尝试过查看它并查看可能导致它的原因,但我没有成功。
非常感谢各位大侠的帮助,谢谢!
回答:
查看问题的答案后:https ://stackoverflow.com/a/18262927/13231904
我能够将这个问题的代码与那个答案的代码合并,以获得一个非常有效的功能:
if(window.attachEvent){
observe = function(element, event, handler){ element.attachEvent('on'+event, handler); };
}else{
observe = function(element, event, handler){ element.addEventListener(event, handler, false); };
}
function init(){
var textAreas = [].slice.call(document.querySelectorAll('textarea[data-adaptheight]'));
textAreas.forEach(function(el){
function resize(){
var scrollLeft = window.pageXOffset ||
(document.documentElement || document.body.parentNode || document.body).scrollLeft;
var scrollTop = window.pageYOffset ||
(document.documentElement || document.body.parentNode || document.body).scrollTop;
el.style.resize = "none";
el.style.overflow = 'hidden';
el.style.boxSizing = el.style.mozBoxSizing = 'border-box';
el.style.height = "auto";
el.style.height = el.scrollHeight + 'px';
window.scrollTo(scrollLeft, scrollTop);
}
observe(el, 'input', resize);
resize();
});
}
init();
<textarea data-adaptheight style="padding: 7px;width: 100%;display: block;" rows="1" cols="40" placeholder="Your input">
</textarea>
解决方案
问题是这行代码:
el.style.height = 0;
它将 textarea 的高度设置为零,然后浏览器将 textarea 渲染为该大小,这将浏览器窗口的高度降低到屏幕大小,从而使滚动位置为 0 或最顶部。
编码:
el.style.height = Math.max(minHeight, el.scrollHeight + diff) + 'px';
然后将 textarea 的大小重新调整为适合所有文本所需的大小,并将浏览器窗口向下滚动至仅显示当前光标位置,这就是为什么您将始终在浏览器屏幕中尽可能向下滚动的原因。
您可以通过将窗口滚动位置恢复到 textarea 的高度设置为 0 之前的值来解决此问题。有关如何执行此操作,请参阅此答案。
推荐阅读
- mysql - 计算每件售出的产品
- json - 将数据作为字典连接到模型
- python - 在我的示例中,熊猫索引不返回行名
- php - 如何将网站更改为wordpress中的特定位置
- sql-server - 如何使用 SUM 进行 INNER JOIN
- linux - 用鼠标在shell中获取选定的字符
- javascript - ag-grid: 格式号 - 需要在网格中显示 0.123 为 .123
- python - 如何将 c++ 类从 .dylib 或 dll 导出到 python 和其他语言
- c - 为什么我的代码可以创建文本文件,但只读取我的文本的第一个字符串?
- python - 如何提高pandas中mysql查询的处理速度