2017年4月9日日曜日

lineHeightが未定義のテキストエリアからlineHeightを取得するサンプル

1行あたりの高さを表すのがlineHeightプロパティですが「<textarea></textarea>」のようにlineHeightが定義されていないエレメントだと「lh = elem.lineHeight」のようにしても変数に入るのは長さ0のカラ文字列です。offsetWidthのような感じのプロパティはlineHeightにはありません。

それでもlineHeightが必要な場合があるので、取得するためのサンプルを作成しました。



起動画面



「for in」ボタンを押すとテキストエリアのプロパティ名とその値が表示されます。



テキストエリア内でonkeyupイベントを発生させるとタイトル部分にlineHeightの値が表示されます。



以下ソース
<html>
<head>
<title>scrollHeight</title>
<style type="text/css">
.max{width:100%;height:100%}
.w-max{width:100%}
.nowrap{white-space:nowrap}
.ta-c{text-align:center}
.bc{border-collapse:collapse}
.of-auto{overflow:auto}
.of-hidden{overflow:hidden}
.border1{border:solid 1px #000}
</style>
</head>
<body class=of-hidden>
<table class="max bc">
<tr height=1><td><button id=btn>for in</button></td></tr>
<tr><td><textarea id=ta class=max wrap=off></textarea></td></tr>
</table>
</body>
<script>
resizeTo(300,300)
getLineHeight=function(ta){
var c=document.body.insertBefore(ta.cloneNode(true)), h='scrollHeight', v=c.value='', h0=c[h], v=c.value='\n', h1=c[h]
return c.removeNode(true), h1-h0
}
ta.onkeyup=function(){ document.title = getLineHeight(this) }
btn.onclick=function(){
var a=[], n
for(n in ta){a.push(n +' = '+ta[n])}
ta.value = a.sort().join('\n')
}
</script>
</html>
view raw lineHeight.hta hosted with ❤ by GitHub


テキストエリアのvalueに改行を追加する前後のscrollHeightを取得して、その差をlineHeightの値として返しています。

既存のテキストエリアに対してvalueの変更を加えるとカーソルが移動してしまうので、クローンを作成しています。

クローンのvalueプロパティを一旦、長さ0のカラ文字列にしているのは、そうしないとscrollHeightの値がおかしなことになる場合があるからです。最終的に返すlineHeightの値が大きくなったり、マイナスの値になったりします。値の狂い方の規則性もよく分からなかったので何が原因なのかもよく分かりません。確かめたい人は「v=c.value=''」の部分を削除して、テキストエリアでエンターキーを押しまくると私が見た不可思議な現象を再現できると思います。

0 件のコメント:

コメントを投稿