构建相同样式的 DOM
看上去这个方案是最妙的。那么如何构建相同的DOM呢?
- 既然要构建相同的 DOM,那么我们需要知道 DOM 长什么样子。
那么如何获取样式呢?获取class?获取style?
nonono,我们要用 window.getComputedStyle(el)
,然后就可以快乐的拿到计算后的属性。
- 之后我们需要知道什么属性会影响字体排列。
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']
- 因为我们需要重新搞一个DOM节点,而且我们不希望这个过程被用户看到,所以我们要隐藏起来。有什么方案呢?
display:none
这个是不行的,因为 none 之后不会绘制了。也就获取不到宽高了。
opacity:0
这个可以
visibility: hidden;
这个也可以
height:0;overflow:hidden
这个也可以,获取scrollHeight
z-index:-999
这也可以的。
position:absolute;top:-9999px;left:-9999px
也是可以的
elementUI 实现
https://github.com/ElemeFE/element/blob/dev/packages/input/src/calcTextareaHeight.js
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',