JavaScript 撐出頁面文字換行
碰到一個(gè)問題,就是在頁面展示的時(shí)候,很多情況下需要對(duì)顯示的文字做折行處理,例如文字超過TD的寬度,或者DIV的寬度等等。
在IE下有word-break等等,但是在FF下,卻是行不通,所以研究了一下,寫了一個(gè)JS腳本,原理是這樣的:
1. 首先,我們在頁面上找一個(gè)span元素,用它來裝載字符,然后通過它的寬度,來得到字符的顯示寬度
2. 然后,我們在顯示一個(gè)字符串的時(shí)候,就可以利用前面得到的字符寬度,計(jì)算出每個(gè)字符串的寬度
3. 在此基礎(chǔ)上,計(jì)算出字符串應(yīng)該折行的位置,插入<br/>進(jìn)行折行就不是什么問題了。
條件所限,blog不能上傳附件,我在這里解釋一下代碼。
代碼有2部分,一個(gè)是“textWidth.js”,他完成絕大部分的工作;另外一個(gè)是測試頁面。
1. textWidth.js
| 源代碼 | 說明 |
|---|---|
var TextWidth = new function() {
var widthLib = new Hash();
var textSpan;
var self = this; |
內(nèi)部成員變量 widthLib是一個(gè)保存某個(gè)字體、字號(hào)的所有字符的寬度的hash表; |
self.getWidth = function(string, fontName, fontSize) {
var lib = getSizeLib(fontName, fontSize);
var totalWidth = 0;
for(var i =0; i < string.length; i++) {
var c = string.charCodeAt(i);
if (c > 255) {
totalWidth += lib[256];
}else{
totalWidth += lib[c];
}
}
return totalWidth;
}
|
計(jì)算字符串的長度。算法簡單,就是把每個(gè)字符的寬度都加到一起就好了。 關(guān)鍵是getSizeLib(fontName, fontSize);這個(gè)函數(shù),如果Hash表里沒有這個(gè)字體字號(hào)的寬度數(shù)據(jù),它會(huì)主動(dòng)初始化相應(yīng)的寬度數(shù)據(jù) |
self.wrapText = function(string, fontName, fontSize, maxWidth) {
if (!string) {
return " ";
}
var origText = string.strip();
var lib = getSizeLib(fontName, fontSize);
var resultText = "";
var deltaW;
var totalW = 0;
for(var i =0; i < string.length; i++) {
var c = string.charCodeAt(i);
if (c > 255) {
deltaW = lib[256];
}else{
deltaW = lib[c];
}
if ((totalW + deltaW) > maxWidth)
{
resultText += "";
totalW = deltaW;
}else{
totalW += deltaW;
}
resultText += string.charAt(i);
}
return resultText;
}
|
計(jì)算折行。這個(gè)也簡單,先從Hash表里拿到寬度數(shù)據(jù),然后逐個(gè)計(jì)算,寬度超了,就加個(gè)<br>進(jìn)去 |
self.setSpan = function(obj) {
textSpan = obj;
textSpan.hide();
}
|
保存用于寬度計(jì)算的span元素 |
function getSizeLib(fontName, fontSize) {
if (!widthLib.get(getKey(fontName, fontSize))) {
initwidthLib(fontName, fontSize);
}
return widthLib.get(getKey(fontName, fontSize));
}
|
取得指定字體字號(hào)的寬度數(shù)據(jù)。沒有的話,就初始化一份 |
function initwidthLib(fontName, fontSize) {
var key = getKey(fontName, fontSize);
var sizeLib = new Array(257);
textSpan.show();
textSpan.style.fontFamily = fontName;
textSpan.style.fontSize = fontSize+"px";
textSpan.update("中中中中中中中中中中");
sizeLib[256] = textSpan.offsetWidth/10;
for(var i = 0; i<256; i++) {
textSpan.update("中" + String.fromCharCode(i)+"中");
sizeLib[i] = textSpan.offsetWidth-2*sizeLib[256];
}
textSpan.hide();
widthLib.set(key, sizeLib);
}
|
初始化 |
function getKey(fontName, fontSize) {
return fontName+"@"+fontSize+"px";
}
} |
|
下面是測試頁面的代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<script language="javascript" src="prototype.js"></script>
<script language="javascript" src="textWidth.js"></script>
<title>無標(biāo)題文檔</title>
<style type="text/css">
* {
font-size: 14px;
font-family: Geneva,Arial,Helvetica,sans-serif;
}
</style>
</head>
<body>
<textarea id="in" type="text"></textarea><input type="button" value="test" onclick="runTest()"/><p/>
<textarea id="resultSpan" style="width: 900px;font-size: 14px; font-family: Geneva">
</textarea>
<div id="resultDisplay" style="font-size: 14px; font-family: Geneva;background-color:#e242E6; width:80px"></div>
<span id="textSpan" style="display:none"></span>
</body>
<script type="text/javascript">
TextWidth.setSpan($('textSpan'));
function runTest() {
$('resultSpan').innerHTML = $("in").value;
var theWidth = TextWidth.getWidth($('resultSpan').innerHTML, "Geneva", 14);
$("resultDisplay").innerHTML = TextWidth.wrapText($('resultSpan').innerHTML, "Geneva", 14, 80);
}
</script>
</html>
prototype.js請自行下載驗(yàn)證
相關(guān)文章
擴(kuò)展Bootstrap Tooltip插件使其可交互的方法
這篇文章主要介紹了擴(kuò)展Bootstrap Tooltip插件使其可交互的方法,結(jié)合實(shí)例形式分析了bootstrap擴(kuò)展tooltip插件的原理與具體操作技巧,需要的朋友可以參考下2016-11-11
javascript算法之?dāng)?shù)組反轉(zhuǎn)
這篇文章主要介紹了javascript算法之?dāng)?shù)組反轉(zhuǎn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
JS實(shí)現(xiàn)帶有3D立體感的銀灰色豎排折疊菜單代碼
這篇文章主要介紹了JS實(shí)現(xiàn)帶有3D立體感的銀灰色豎排折疊菜單代碼,可實(shí)現(xiàn)基本的JS響應(yīng)鼠標(biāo)事件動(dòng)態(tài)展開與折疊菜單欄的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
微信小程序?qū)崿F(xiàn)圖片滾動(dòng)效果示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)圖片滾動(dòng)效果,結(jié)合實(shí)例形式分析了微信小程序基于swiper組件的圖片滾動(dòng)效果相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-12-12
javascript表單驗(yàn)證使用示例(javascript驗(yàn)證郵箱)
JavaScript可用來在數(shù)據(jù)被送往服務(wù)器前對(duì)HTML表單中的這些輸入數(shù)據(jù)進(jìn)行驗(yàn)證2014-01-01

