ivue-material-plus
Version:
A high quality UI components Library with Vue.js
1 lines • 8.39 kB
Source Map (JSON)
{"version":3,"file":"calc-textarea-height.mjs","sources":["../../../../src/utils/calc-textarea-height.ts"],"sourcesContent":["const HIDDEN_TEXTAREA_STYLE = `\r\n min-height:0 !important;\r\n max-height:none !important;\r\n height:0 !important;\r\n visibility:hidden !important;\r\n overflow:hidden !important;\r\n position:absolute !important;\r\n z-index:-1000 !important;\r\n top:0 !important;\r\n right:0 !important\r\n`;\r\n\r\nconst SIZING_STYLE = [\r\n 'letter-spacing',\r\n 'line-height',\r\n 'padding-top',\r\n 'padding-bottom',\r\n 'font-family',\r\n 'font-weight',\r\n 'font-size',\r\n 'text-rendering',\r\n 'text-transform',\r\n 'width',\r\n 'text-indent',\r\n 'padding-left',\r\n 'padding-right',\r\n 'border-width',\r\n 'box-sizing',\r\n];\r\n\r\nconst computedStyleCache: Record<string, any> = {};\r\nlet hiddenTextarea;\r\n\r\n// 获取节点样式\r\nfunction calculateNodeStyling(node: any, useCache = false) {\r\n const nodeRef =\r\n node.getAttribute('id') ||\r\n node.getAttribute('data-reactid') ||\r\n node.getAttribute('name');\r\n\r\n if (useCache && computedStyleCache[nodeRef]) {\r\n return computedStyleCache[nodeRef];\r\n }\r\n\r\n const style = window.getComputedStyle(node);\r\n\r\n const boxSizing =\r\n style.getPropertyValue('box-sizing') ||\r\n style.getPropertyValue('-moz-box-sizing') ||\r\n style.getPropertyValue('-webkit-box-sizing');\r\n\r\n const paddingSize =\r\n parseFloat(style.getPropertyValue('padding-bottom')) +\r\n parseFloat(style.getPropertyValue('padding-top'));\r\n\r\n const borderSize =\r\n parseFloat(style.getPropertyValue('border-bottom-width')) +\r\n parseFloat(style.getPropertyValue('border-top-width'));\r\n\r\n const sizingStyle = SIZING_STYLE.map(\r\n (name) => `${name}:${style.getPropertyValue(name)}`\r\n ).join(';');\r\n\r\n const nodeInfo = {\r\n sizingStyle,\r\n paddingSize,\r\n borderSize,\r\n boxSizing,\r\n };\r\n\r\n if (useCache && nodeRef) {\r\n computedStyleCache[nodeRef] = nodeInfo;\r\n }\r\n\r\n return nodeInfo;\r\n}\r\n\r\n// 计算Textarea高度\r\nexport const calcTextareaHeight = (\r\n uiTextNode: Record<string, any>,\r\n minRows = null,\r\n maxRows = null,\r\n useCache = false\r\n) => {\r\n if (!hiddenTextarea) {\r\n hiddenTextarea = document.createElement('textarea');\r\n document.body.appendChild(hiddenTextarea);\r\n }\r\n\r\n // Fix wrap=\"off\" issue\r\n // https://github.com/ant-design/ant-design/issues/6577\r\n if (uiTextNode.getAttribute('wrap')) {\r\n hiddenTextarea.setAttribute('wrap', uiTextNode.getAttribute('wrap'));\r\n } else {\r\n hiddenTextarea.removeAttribute('wrap');\r\n }\r\n\r\n // Copy all CSS properties that have an impact on the height of the content in\r\n // the textbox\r\n const { paddingSize, borderSize, boxSizing, sizingStyle } =\r\n calculateNodeStyling(uiTextNode, useCache);\r\n\r\n // Need to have the overflow attribute to hide the scrollbar otherwise\r\n // text-lines will not calculated properly as the shadow will technically be\r\n // narrower for content\r\n hiddenTextarea.setAttribute(\r\n 'style',\r\n `${sizingStyle};${HIDDEN_TEXTAREA_STYLE}`\r\n );\r\n hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || '';\r\n\r\n let minHeight = Number.MIN_SAFE_INTEGER;\r\n let maxHeight = Number.MAX_SAFE_INTEGER;\r\n let height = hiddenTextarea.scrollHeight;\r\n let overflowY: string;\r\n\r\n // border-box: add border, since height = content + padding + border\r\n if (boxSizing === 'border-box') {\r\n height = height + borderSize;\r\n }\r\n // remove padding, since height = content\r\n else if (boxSizing === 'content-box') {\r\n height = height - paddingSize;\r\n }\r\n\r\n if (minRows !== null || maxRows !== null) {\r\n // measure height of a textarea with a single row\r\n hiddenTextarea.value = ' ';\r\n\r\n const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;\r\n\r\n if (minRows !== null) {\r\n minHeight = singleRowHeight * minRows;\r\n if (boxSizing === 'border-box') {\r\n minHeight = minHeight + paddingSize + borderSize;\r\n }\r\n height = Math.max(minHeight, height);\r\n }\r\n\r\n if (maxRows !== null) {\r\n maxHeight = singleRowHeight * maxRows;\r\n\r\n if (boxSizing === 'border-box') {\r\n maxHeight = maxHeight + paddingSize + borderSize;\r\n }\r\n\r\n overflowY = height > maxHeight ? '' : 'hidden';\r\n height = Math.min(maxHeight, height);\r\n }\r\n }\r\n\r\n // Remove scroll bar flash when autosize without maxRows\r\n if (!maxRows) {\r\n overflowY = 'hidden';\r\n }\r\n\r\n return {\r\n height: `${height}px`,\r\n minHeight: `${minHeight}px`,\r\n maxHeight: `${maxHeight}px`,\r\n overflowY,\r\n };\r\n};\r\n"],"names":[],"mappings":"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"}