ここでは、目的に合ったアプローチの 1 つを紹介します。
- 参照用に、1 行の段落の高さを取得します。
- 各段落について、実際の高さを取得し、行数を推測します。
- 行をループして、絶対位置に番号を追加します。
var refHeight = $("p").eq(0).height();
$("p").eq(0).remove();
var cnt = 1;
$("p").each(function(index) {
var pos = $(this).position();
var h = $(this).height();
var lines = h / refHeight;
var lineHeight = h / lines;
for (var i=pos.top ; i<pos.top+h ; i += lineHeight) {
var num = $("<p>", { class: "number" });
num.text(cnt++);
num.css("top", i);
$(this).before(num);
console.log(i);
}
});
(フィドル)
編集
固定行の長さを使用したい場合 (全員が同じ数字を見るようにするため)、上記を次のように組み合わせることができます。
- 段落を行に分割します。
- 各行を span/div で囲み、再度追加します。
- ブラウザでテキストの折り返しをブロックします。
$("p").each(function() {
var text = $(this).text();
$(this).html("");
var i=0;
while (i<text.length) {
lineCharWidth = charWidth;
while (i+lineCharWidth < text.length && text[i+lineCharWidth] != ' ') {
lineCharWidth++;
}
var line = $("<span>", { class: "line" }).text(text.substr(i, lineCharWidth));
$(this).append(line).append("<br/>");
i += lineCharWidth;
}
});
(フィドル)