作者:风流逍遥快活_936 | 来源:互联网 | 2023-10-12 15:54
源代码version:element-plus1.0.1-beta.0这里的指向是element-plus但应该是一样的lethiddenTextarea隐藏的textarea
源代码
version:element-plus 1.0.1-beta.0
这里的指向是element-plus 但应该是一样的
let hiddenTextarea
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)const boxSizing = style.getPropertyValue('box-sizing')const paddingSize = (parseFloat(style.getPropertyValue('padding-bottom')) +parseFloat(style.getPropertyValue('padding-top')))const 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 }
}
export default function calcTextareaHeight(targetElement,minRows = 1,maxRows = null,
): TextAreaHeight {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 TextAreaHeightif (boxSizing === 'border-box') {height = height + borderSize} else if (boxSizing === 'content-box') {height = height - paddingSize}hiddenTextarea.value = ''const singleRowHeight = hiddenTextarea.scrollHeight - paddingSizeif (minRows !== null) {let minHeight = singleRowHeight * minRowsif (boxSizing === 'border-box') {minHeight = minHeight + paddingSize + borderSize}height = Math.max(minHeight, height)result.minHeight = `${ minHeight }px`}if (maxRows !== null) {let maxHeight = singleRowHeight * maxRowsif (boxSizing === 'border-box') {maxHeight = maxHeight + paddingSize + borderSize}height = Math.min(maxHeight, height)}result.height = `${ height }px`hiddenTextarea.parentNode?.removeChild(hiddenTextarea)hiddenTextarea = nullreturn result
}