前言
延續上次的文章,取得文字高度和寬度後就可以動態調整邊界。
取得字體資訊
若沒有在CSS中設定,可以透過getComputedStyle
取得。
1 2
| var style = window.getComputedStyle( text, null ).getPropertyValue( 'font-family' ); var size = window.getComputedStyle(text, null).getPropertyValue('font-size');
|
取得字體高度及寬度
一樣透過在網頁新增物件量測。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| var getTextWidth = function(text,font,size){ var span = document.createElement('span'); span.style['fontFamily'] = font ; span.style['fontSize'] = size ; span.innerHTML = "W" + text + "W"; document.body.appendChild(span); var width = 0 ; try { width = span.offsetWidth ; } finally { span.remove(); } return width; } var getTextHeight = function(font,size) { var text = document.createElement('span'); text.style['fontFamily'] = font ; text.style['fontSize'] = size ; text.innerHTML = "Hg"; var block = document.createElement('div') ; block.style.display ="inline-block"; block.style.width = "1px" ; block.style.height = "0px" ; var div = document.createElement('div'); div.appendChild(text); div.appendChild(block) document.body.appendChild(div); var height = 0 ; try { block.style.verticalAlign = "bottom" ; height = block.offsetTop - text.offsetTop; } finally { div.remove(); } return height; }
|
取得行數及最大寬度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var getTextMaxLength = function(text,font,size){ var s = "" ; var t = text.value ; var max = 0 ; var row = 0 ; for ( var i = 0 ; i < t.length ; i ++ ){ if ( t[i] === "\n" || i === t.length - 1 ){ max = Math.max(max,getTextWidth(s,font,size)) ; s = "" ; row ++ ; if ( (t[i] === "\n" || t[i] === "\r" || t[i] === "\r\n" ) && i === t.length - 1 ){ row++ ; } } else { s += t[i] ; } } return {row:row,length:max} ; }
|
Event
若使用onchange會點擊其他元素的時候才會觸發,單獨使用keydown會造成最後按下的字母不會在value裡,而單獨使用keyup會造成長按只紀錄一個,因此同時使用keydown和keyup。
1 2 3 4 5 6 7 8 9 10
| text.onkeydown = function(){ var result = getTextMaxLength(text,getFontFamily(this),getFontSize(this)) ; this.style.width = result.length + 3 ; this.style.height = getTextHeight(getFontFamily(this),getFontSize(this)) * result.row + 10; } text.onkeyup = function(){ var result = getTextMaxLength(text,getFontFamily(this),getFontSize(this)) ; this.style.width = result.length + 3 ; this.style.height = getTextHeight(getFontFamily(this),getFontSize(this)) * result.row + 10; }
|
GitHub
GitHub