2011-08-05 4 views
16

JavaScriptを使用してテキストノードのサイズをピクセル単位で取得できません。例:JavaScriptのテキストノードのバウンディングボックスを測定します。

 
<p> 
    first text block 
    <b>second text block</b> 
</p> 

2つのテキストブロックの境界ボックスを個別に取得する必要があります。 < b>要素を測定するだけで、2番目のブロックのサイズを取得できましたが、最初のブロックはわかりません。 Javascriptのtextnodeの高さや幅は、私が知る限りは現れていません。

<スパンの最初のテキストブロックを折り返して測定することはオプションではありません。スパンが必ずしもその上のすべてのスタイルを継承するとは限らないことがわかったので、突然変更しますサイズ。それはJavascriptのハイゼンベルグ不確実性原理のようです。何かを測定する私の試みはそれを変える。

私はHTMLをページ(実際にはEPUB HTML)に分割するアプリケーションを構築していますが、ページ上の各テキストブロックの位置、高さ、幅を知る必要がありますこのページまたは次のページで

提案がありますか?

+0

これに対する答えがあるように見えるん。私たちはこの問題に全く異なるアプローチをとった。マルチカラムレイアウトを使用してEPUBのページを分割しています。テキストメトリックは必要ありません。 – ccleve

+0

私は間違っています。ティムダウンはそれに答えました。 – ccleve

答えて

22

あなたは、最新のブラウザ(多分それ以前のFirefox 4+、2009年初頭以来のWebKit、オペラ11、)とIEでTextRangeあるCSSOM View extensionsをサポートRange、でこれを行うことができます。 TextRangeのコードは面倒ですので、ここでは省略しました。

jsFiddle:http://jsfiddle.net/gdn6C/1/

コード:

function getTextNodeHeight(textNode) { 
    var height = 0; 
    if (document.createRange) { 
     var range = document.createRange(); 
     range.selectNodeContents(textNode); 
     if (range.getBoundingClientRect) { 
      var rect = range.getBoundingClientRect(); 
      if (rect) { 
       height = rect.bottom - rect.top; 
      } 
     } 
    } 
    return height; 
} 
+0

うわー!どうもありがとう! –

+0

なぜIE用に特別なケースを開く必要がありますか? http://www.quirksmode.org/dom/w3c_cssom.htmlの表は、ここでも 'getBoundingClientRect'が利用可能であることを示しています。 –

+0

@NicoSchlömer:そのページは、範囲ではなく要素のgetBoundingClientRectメソッドを参照しています。 –

0

測定したい要素をインラインにしてみてください。インライン要素は、必要なだけ多くの領域を占有します。したがって、それはjavascriptによって取り出すことができる絶対幅と高さを持っています。ブロックエレメントは、包含エレメントの幅全体を埋めます。したがって、javascriptはその幅にアクセスできません。

+0

スパンタグはデフォルトではインラインではありませんか?スパンは機能しません。上記を参照してください。 – ccleve

関連する問題