Firefox で英語の文字が折り返されない問題の解決方法

Firefox で英語の文字が折り返されない問題の解決方法

テキストのレイアウトには、言語に応じていくつかの書式設定要件があります。たとえば、簡体字中国語では、カンマやセミコロンなどの句読点は行の先頭に表示されません。英語の場合、完全な単語は 2 行に表示されません。ブラウザは同様の原則に基づいてテキストを表示します。ただし、Web ページの幅の制限により、連続した非常に長い文字、数字、句読点は、それらが配置されている領域の幅の制限を超えてしまい、例 1 に示すように、ページの視覚効果に影響を与えます。この問題は、ユーザー入力情報を表示するときに特に顕著になります。ここでは、この問題を解決する方法について説明します。

CSS3 ドラフトでは、この問題を解決するために、word-wrap と word-break という 2 つの新しいプロパティがテキスト処理に追加されています。

  1. {word-wrap:break-word;} : アジア言語と非アジア言語のテキストルールに従って単語内での改行を許可し、非アジア言語のテキスト行を任意の単語内で改行できるようにします。
  2. {word-break:break-all;} : コンテンツは境界内で折り返され、必要に応じて単語の区切りも発生します。

一般的なブラウザのサポートは次のとおりです。

IE6/7 [1]ファイアフォックス2/3 [2]オペラ3+ Safari9.5以降/Chrome
{単語の折り返し:単語の区切り;} td要素の幅を設定する必要があります。例4と例5を参照してください。サポートされていませんサポートされていませんtd要素はサポートされていません。例4と例5を参照してください。
{単語区切り:すべて区切り;}連続記号はサポートされていません。例 3 を参照してください。サポートされていませんサポートされていませんサポート
  • [1] MSDNのCSS互換性とInternet Explorerから、IE8はIE6やIE7と同様にword-wrapとword-breakプロパティをサポートしていることがわかります。しかし、IE8beta2をテストしたところ、これら2つのプロパティはサポートされていないことがわかりました。IE8はまだベータ段階であり、最終的にはIE8がこれらをサポートすると信じているため、ページヘッダーで<meta content="IE=7" http-equiv="X-UA-Compatible" />を宣言して、IE8がIE7に従ってページを解釈するようにするのが良いでしょう。
  • [2] Firefox 3.1はword-wrap属性をサポートする予定

{word-break:break-all;} では英語や数字の可読性が著しく低下し、連続する記号を折り返すことができないため、{word-wrap:break-word;} が比較的良い選択です。

しかし、ブラウザのサポートが不十分な場合、この問題を解決するには JavaScript に頼らざるを得ません。つまり、ブラウザが CSS ソリューションをサポートしていない場合は、連続する文字列の適切な位置に &#8203; 文字を挿入します (もちろん、 <wbr />と &shy; も使用できます。ブラウザでのこれら 3 つの文字のサポートについては、ppk の「wbr タグ」を参照してください)。これらの文字は、ブラウザに書き込まれたときには表示されませんが、長い文字列を折り返します。具体的な実装コードは次のとおりです。

 function fnBreakWordAll(o){
var o = o || {},
iWord = o.word || 13,
iRe = o.re || '[a-zA-Z0-9]',
bAll = o.all || false,
sClassName = o.className || 'word-break-all',
aEls = o.els || (function(){
var aEls = [],
aAllEls = document.getElementsByTagName('*'),
re = new RegExp('(?:^|\\s+)' + sClassName + '(?:\\s+|$)');
for(var i =0,iLen = aAllEls.length; i < iLen ; ++i){
if(re.test(aAllEls[i].className)){
aEls[aEls.length] = aAllEls[i];
}
}
return aEls;
})() || [],
fnBreakWord = function(oEl){
// 基于http://www.hedgerwow.com/360/dhtml/css-word-break.html修改
if(!oEl || oEl.nodeType !== 1){
return false;
}else if(oEl.currentStyle && typeof oEl.currentStyle.wordWrap==='string'){
breakWord = function(oEl){
oEl.runtimeStyle.wordWrap = 'break-word';
return true;
}
return breakWord(oEl);
}else if(document.createTreeWalker){
var trim = function (str) {
str = str.replace(/^\s\s*/, '');
var ws = /\s/,
i = str.length;
while (ws.test(str.charAt(--i)));
return str.slice(0, i + 1);
}
breakWord = function(oEl){
var dWalker=document.createTreeWalker(oEl,NodeFilter.SHOW_TEXT,null,false);
var node,s,c = String.fromCharCode('8203'),
//re = /([a-zA-Z0-9]{0,13})/;
re = new RegExp('('+ iRe +'{0,' + iWord + '})');
while (dWalker.nextNode()){
node = dWalker.currentNode;
s = trim(node.nodeValue).split(re).join(c);
node.nodeValue = s;
}
return true;
}
return breakWord(oEl);
}
};
for(var i=0,n=aEls.length; i<n; ++i){
var sUa = navigator.userAgent,
sTn = aEls[i].tagName.toLowerCase() ;
if((/Opera/).test(sUa) || (/Firefox/).test(sUa) || ((/KHTML/).test(sUa) &&
(sTn === 'td' || sTn === 'th')) || bAll){
fnBreakWord(aEls[i]);
}
}
}

具体的なアプリケーションについてはデモ例をご覧ください。

fnWordBreakAll 関数はいくつかのカスタム パラメータを提供します。使用法とパラメータの意味は次のとおりです。

 fnWordBreakAll({word:15,re:'[\\w]',all:true});
パラメータ価値例示する
言葉正の整数、デフォルトは13この数以内の単語は挿入されません。\u8203、13 文字を超える単語はあまりないと思うので、これによりほとんどの単語が分割されなくなります。
正規表現、デフォルト [a-zA-Z0-9]単語の正規表現は、単語がどの文字で構成されているかを判断するために使用されます。\のエスケープに注意してください。
全てブール値、デフォルトは falseすべてのブラウザで実行するかどうかを決定します。デフォルトでは、Opera と Firefox で実行され、クラスが th または td に適用されている場合は Safari でも実行されます。これは主に .word-break-all が定義されていない場合に使用され、IE にスタイルが追加されます。
クラス名有効なクラス名。デフォルトは word-break-all です。関数を実行する要素に対応する属性名

この機能の核となる部分は、Hedger Wang 氏の JavaScript ソリューション「Cross Browser Word Breaker」を改良したもので、これは document.createTreeWalker と split メソッドを使用して、IE 以外のブラウザーで各文字の間に &#8203; を追加します。純粋な中国語のテキストには問題なく使用できますが、同氏が示した例をよく見ると、テキストに英語や数字が含まれている場合、改行の問題は解決しますが、テキストが読みにくくなり、文字間のスペースが広くなることがわかります。そのため、これに基づいて上記の改善を行いました。

<<:  docker windows10共有ディレクトリのマウント失敗の解決策

>>:  TypeScriptの列挙型を詳しく説明する

推薦する

TypeScript ジェネリックを簡単に説明する方法

目次概要ジェネリック医薬品とはビルドシステムジェネリック医薬品の一般的な理解ジェネリッククラスジェネ...

mysql-joinsの具体的な使用方法

目次結合構文: 1. InnerJOIN: (内部結合) 2. LeftJOIN: (左結合) 3....

VSCode 構成 Git メソッドの手順

Git は vscode に統合されており、git コマンドをいくつか記述しなくても、クリックするだ...

さまざまなブラウザに対応するためにCSSで指定フォント@font-faceを導入する際の問題

Web ページを作成するときに、特定のフォントを使用したい場合は、 @font-faceを介して参照...

音楽プレーヤーアプリ(アプリケーションソフトウェア)の分析と再設計 美しい音楽プレーヤーインターフェースの設計方法

無線インタラクションにずっと興味があったので、今回は実践してみようと思います〜この分析と評価は iO...

指定したディレクトリに nginx をインストールする方法の例

会社の要件により、異なる場所にある 2 つの nginx サーバーを同じマシンにインストールする必要...

WeChatアプレットは写真アップロード機能を実現

この記事の例では、WeChatアプレットで写真をアップロードするための具体的なコードを参考までに共有...

vue+tsは要素のマウスドラッグの効果を実現します

この記事の例では、要素のマウスドラッグ効果を実現するためのvue+tsの具体的なコードを参考までに共...

カルーセル効果を実現するためのネイティブJavaScript+CSS

この記事では、参考までに、カルーセル効果の具体的なコードをJavaScript+CSSを使用して実装...

MySQL8インストーラーバージョングラフィックチュートリアル

インストール必要な書類は下部に記載されていますステップ1 mysql-installer-web-c...

入力タイプの制限(複数の方法)

1. 入力・貼り付けできるのは中国語のみ<input onkeyup="value=...

Chrome をクラッシュさせる CSS コードの行

一般的な CSS コードでは、UI レイアウトや互換性に関して軽微な問題が発生するだけです。しかし、...

SSH ポート転送、ローカル ポート転送、リモート ポート転送、動的ポート転送の詳細

パート 1 SSH ポート転送の概要カフェで無料Wi-Fiを利用しているとき、誰かがあなたのパスワー...

Windows システムに MySQL を素早くインストールして展開する方法 (グリーンの無料インストール バージョン)

まずは緑色の無料インストール版のMySQLをダウンロードします。任意のフォルダに入れて構いません。今...

JS+AJAX は、州、市、地区のドロップダウン リストのリンクを実現します。

この記事では、州、市、地区のドロップダウンリストのリンクを実現するためのJS + AJAXの具体的な...