如何根据视口大小和字体划分页面中的文本

时间:2012-11-15 21:03:21

标签: javascript jquery css fonts

这有点棘手。基本上,我有一个水平滑块,用于浏览通过Ajax实时填充的页面(预装了一个节流器,静音预加载等,所以一切都很好)。

像Facebook Billboarding一样工作,如果有人记得FB黑客杯,但略有不同。所以我根据视口计算块的大小,得到boxSizeX和boxSizeY。

现在服务器提供X字的文本。渲染使用等宽字体,字体大小为13px。并且行高为1 em,因此再次为13 px。基本上,我现在试图将文本块分成完全适合boxSizeX和boxSizeY的块,而不会破坏一半的单词,在最后两个单词之前结束句子(对于我应该注意的内容的更多建议非常受欢迎,因为我不要错过任何事情。)

整个计算在JS中完成,尽管可以在对文本进行初始调用时将boxSize提供给服务器,以便在服务器端进行密集计算。你最好怎么做?我几乎不知道要注意什么,浏览器渲染问题,字体等等。谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,对于等宽字体,将字符串拆分为两个相等的一半并检查断字是第一步是否正确?

这是一个基本的工作检查,用于将字符串分成两半,将分割字添加到前半部分,从后半部分删除它们,从分割字符串的后半部分删除任何前导空格,并将结果返回到两个字符串:

var str = "Works like Facebook Billboarding, if anyone remembers the FB hacker cup, yet slightly different. So I compute the size of the block based on the viewport and I get boxSizeX and boxSizeY.";
var halfway = Math.round(str.length/2);
var first_half = str.slice(0, halfway);
var second_half = str.slice(halfway);
var broken_word = second_half.indexOf(" ");
var orphan = (second_half.slice(0, broken_word));
first_half = first_half.concat(orphan);
second_half = second_half.slice(broken_word).trim()
console.log(first_half + " --halfway split here-- " + second_half)

您需要检查first_half的结尾或second_half的开头是否为空格,在这种情况下,没有断字,因此您只能运行broken_word在那个测试中。

通过更多的工作,您可以在字符串的前半部分的最后一个完整停止之前抓取两个单词,使用正则表达式并反转字符串:

var backwards = first_half.split("").reverse().join("");
z = (backwards.match(/(\.\S+\s\S+)/)[0]);
end_sentence = z.split("").reverse().join("");
console.log(end_sentence);

从那里你可以使用backwards.indexOf(".")或者在end_sentence结束后拆分first_half,然后切片并连接你想要的字符串前半部分的结果。