热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

elementuielinputtextarea可自适应文本高度的文本域分析

源代码version:element-plus1.0.1-beta.0这里的指向是element-plus但应该是一样的lethiddenTextarea隐藏的textarea

源代码



version:element-plus 1.0.1-beta.0


这里的指向是element-plus 但应该是一样的

let hiddenTextarea
// 隐藏的textarea样式
const HIDDEN_STYLE = `height:0 !important;visibility:hidden !important;overflow:hidden !important;position:absolute !important;z-index:-1000 !important;top:0 !important;right:0 !important;
`
const CONTEXT_STYLE = ['letter-spacing','line-height','padding-top','padding-bottom','font-family','font-weight','font-size','text-rendering','text-transform','width','text-indent','padding-left','padding-right','border-width','box-sizing',
]type NodeStyle = {contextStyle: stringboxSizing: stringpaddingSize: numberborderSize: number
}type TextAreaHeight = {height: stringminHeight?: string
}function calculateNodeStyling(targetElement): NodeStyle {const style = window.getComputedStyle(targetElement)// 获取box-sizing属性的值const boxSizing = style.getPropertyValue('box-sizing')// 上下padding值const paddingSize = (parseFloat(style.getPropertyValue('padding-bottom')) +parseFloat(style.getPropertyValue('padding-top')))// 上下borderconst borderSize = (parseFloat(style.getPropertyValue('border-bottom-width')) +parseFloat(style.getPropertyValue('border-top-width')))// const contextStyle = CONTEXT_STYLE.map(name => `${name}:${style.getPropertyValue(name)}`).join(';')return { contextStyle, paddingSize, borderSize, boxSizing }
}// 创建一个textarea,加入到body中,css隐藏,计算它的高度,然后算出来的就是要自适应的高度,在remove掉
export default function calcTextareaHeight(targetElement,minRows = 1,maxRows = null,
): TextAreaHeight {// 创建textarea,加入到body中if (!hiddenTextarea) {hiddenTextarea = document.createElement('textarea')document.body.appendChild(hiddenTextarea)}const {paddingSize,borderSize,boxSizing,contextStyle,} = calculateNodeStyling(targetElement)// 设置隐藏起来的样式hiddenTextarea.setAttribute('style', `${contextStyle};${HIDDEN_STYLE}`)hiddenTextarea.value = targetElement.value || targetElement.placeholder || ''let height = hiddenTextarea.scrollHeightconst result = {} as TextAreaHeight// 根据box-sizing来计算heightif (boxSizing === 'border-box') {height = height + borderSize} else if (boxSizing === 'content-box') {height = height - paddingSize}hiddenTextarea.value = ''// 每行的高度const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize// 传入最小行数if (minRows !== null) {let minHeight = singleRowHeight * minRowsif (boxSizing === 'border-box') {minHeight = minHeight + paddingSize + borderSize}// height 取较大的值height = Math.max(minHeight, height)// 返回值中的最小高度result.minHeight = `${ minHeight }px`}// 传入最大行数if (maxRows !== null) {let maxHeight = singleRowHeight * maxRowsif (boxSizing === 'border-box') {maxHeight = maxHeight + paddingSize + borderSize}// height 取较小的值height = Math.min(maxHeight, height)}// 返回值中的最大高度result.height = `${ height }px`// 移除隐藏的textareahiddenTextarea.parentNode?.removeChild(hiddenTextarea)hiddenTextarea = nullreturn result
}

推荐阅读
author-avatar
风流逍遥快活_936
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有