textarea 自适应高度,vue textarea 设置长宽
本文主要介绍了某视频剪辑软件中文本区域自适应高度方案的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
目录
隐藏的问题解决自适应高度的方案先给方案,Vue栈有需求的同学可以直接下载vue-真棒-文本区
隐藏的问题
抛开原生JS,框架的大部分用户界面库都支持自适应文本区域高度功能,但普遍都忽略了一个功能,就是自适应高度的回显。
使用这些库的时候,我们很容易的在文本区域中键入内容,超出范围时会自动延展一行,保证内容高度的自适应。当我们提交内容,在其它页面使用同样的用户界面来渲染时,麻烦的就来了,有些用户界面库是不支持自适应回显的,这就需要我们通过行高、行数甚至高度之间的计算得出一个基值,从而实现回显。
解决自适应高度的方案
常见得方案有两种,一种是在页面地"边远地区"添加一个幽灵王国来模拟输入换行,这个数字正射影像图的可能是可编辑的属性为真实的的差异或者是一个一摸一样得文本区。
以元素-用户界面的投入组件举例,当我们在组件内输入值时,会调用resizeTextarea方法
resizeTextarea() {
如果(这个$isServer)返回;
const { autosize,type }=this
如果(类型!==textarea )返回;
如果(!自动调整){
this.textareaCalcStyle={
minHeight: calcTextareaHeight(这个. refs.textarea).米恩海特
};
返回;
}
const minRows=autosize.minRows
const maxRows=autosize.maxRows
这个。textareacalcstyle=calcTextareaHeight(this .$refs.textarea,minRows,maxRows);
}
当设置了自动调整大小为真实的则文本区域设为自适应高度。此时文本区域的高度会通过calcTextareaHeight方法实时计算。
导出默认函数calcTextareaHeight(
目标元素,
minRows=1,
maxRows=null
) {
如果(!隐藏区域){
hiddenTextarea=文档。createelement(“textarea”);
文档。身体。appendchild(hiddentexarea);
}
让{
paddingSize,
边框大小,
装箱尺寸,
上下文样式
}=calculatenodestying(目标元素);
隐藏的区域。set属性( style ,` $ { context style });$ { HIDDEN _ STYLE } `);
hiddentextarea。值=目标元素。value 目标元素。占位符 “”;
设height=hiddentexarea。滚动高度;
常数结果={ };
if (boxSizing===border-box) {
height=高度边框大小
} else if(框大小=== content-box ){
height=height-填充大小;
}
隐藏的区域。值=" ";
设singleRowHeight=hiddentexarea。滚动高度-填充大小;
if (minRows!==null) {
设最小高度=singleRowHeight *最小行数;
if (boxSizing===border-box) {
最小高度=最小高度填充尺寸边框尺寸;
}
height=Math.max(minHeight,height);
结果。最小高度=` $ { min height } px
}
if (maxRows!==null) {
设max height=singleRowHeight * maxRows;
if (boxSizing===border-box) {
最大高度=最大高度填充大小边框大小;
}
height=Math.min(maxHeight,height);
}
result.height=` $ { height } px
隐藏的区域。父节点hiddentexarea。父节点。移除子级(hiddentexarea);
hiddenTextarea=null
返回结果;
};
我们可以看到
如果(!隐藏区域){
hiddenTextarea=文档。createelement(“textarea”);
文档。身体。appendchild(hiddentexarea);
}
元素-用户界面创建了一个文本区域的多姆,通过calculateNodeStyling方法将真正的文本区域的样式复制给隐藏区域(溢出不同步,真正的文本区域是为隐藏的).接着监听文本区域的输入值,同步给隐藏区域。同时将隐藏区域的滚动高度同步给文本区域的高度,最后再将数字正射影像图销毁掉。
关于样式的同步,元素这里用了元素和getPropertyValue这两个API。当然,如果你自己封装的话,也可以使用钢性铸铁预处理器的混合。
第二个方案类似于第一个方案,但是不会创建额外的dom。例如,vue-awesome-textarea以:
init() {
this.initAutoResize()
},
initAutoResize () {
这个。自动调整这个。$nextTick(this.calcResize)
}
当页面已装入或内容已更改且自适应高度自动调整功能已打开时,执行this.calcResize方法。
calcResize() {
this.resetHeight()
this.calcTextareaH()
},
resetHeight() {
this.height=auto
},
calcTextareaH() {
让content height=this . calccontentheight()
this . height=this . calcheightchange(content height) px
if(this . needupdaterows(content height)){
this.updateRows(contentHeight)
}
this . old content height=content height
},
calcContentHeight () {
const { padding size }=this . calcnodestyle(this。$el)
归还这个。$el.scrollHeight - paddingSize
},
resetHeight()用于初始化textarea的高度,默认值为auto。calcTextareaH()方法用于计算内容区域的高度(scrollarea的高度减去padding的高度),并将计算的高度实时同步到textarea的高度:
this . height=this . calcheightchange(content height) px
与第一种方案相比,该方案采用了相同的思路(动态修改高度),但减少了额外的创建和销毁dom的过程。
此外,vue-awesome-textarea还支持自适应过程中行数的回调,可以更好地支持数据回显。的实现方法也很简单:
计算值:{
.
oneRowsHeight() {
return this . calccontentheight()/Number(this . rows) 0
}
.
}
在computed中,我们计算单行的高度,同时在执行this.calcTextareaH()方法时记录内容高度:
this . old content height=content height
然后我们再对比是否存在加行的操作。添加后,新内容高度和旧内容高度将会不同:
needUpdateRows(new content height){
返回this.oldContentHeight!==新内容高度
},
此时,我们将向组件外部发出最新的行高:
updateRows(contentHeight) {
这个。$emit(getRows ,math . round(content height/this . onerowsheight))
}
这就是本文关于Vue中文本区域自适应高度方案的实现。更多Vue textarea适配的相关内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。