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の列挙型を詳しく説明する

推薦する

小さなアイコンのフロントエンド処理ソリューションのグラフィカルな説明

序文この記事を始める前に、複数選択の質問をしてみましょう。フロントエンド開発でビルド ツールを使用す...

CSS3 FlexBox の伸縮自在なレイアウトを 10 分で理解する

基本的な紹介特徴Flexbox は、よりシンプルで効率的なレイアウト方法を提供する CSS 表示タイ...

ReactのPropsの簡単な比較

目次クラスコンポーネントのプロパティ比較浅い同等の浅い比較機能コンポーネントの簡単な比較先週面接に行...

Dockerを使用してGitlabを素早くデプロイする方法

1. GitLabイメージをダウンロードする docker pull gitlab/gitlab-c...

Ubuntu 18.04 Linux システムに JDK と Mysql をインストールする方法

プラットフォームの展開1. JDKをインストールするステップ1. OracleJDKをダウンロードす...

HTML(CSSスタイル仕様)を読む必要があります

CSS スタイル仕様1. クラスセレクター2. タグセレクター3. IDセレクター4. CSSスタイ...

HTML における要素の水平および垂直中央揃えに関する議論

ページをデザインするときには、ログイン ウィンドウを中央に配置するなど、DIV を中央に配置し、ペー...

JavaScript は、シンプルな虫眼鏡の最も完全なコード分析を実装します (ES5)

この記事では、参考までに、シンプルな虫眼鏡を実装するためのJavaScriptの具体的なコードを紹介...

Amoeba を使用して MySQL データベースの読み取り/書き込み分離を実装する方法の詳細な説明

MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...

nginx が動的と静的の分離を実装する方法の例

目次server1にnginxをデプロイするサーバーにlnmpを展開するノード3にhttpdをデプロ...

Ubuntu で時刻同期に NTP を使用する

NTP は、ネットワーク上で時間を同期するための TCP/IP プロトコルです。通常、クライアントは...

HTML と CSS の命名規則の概要

CSS命名規則 ヘッダー: ヘッダーコンテンツ: コンテンツ/含むフッターナビゲーション: navサ...

PXEを使用してCentOS7.6を自動的にインストールする方法の詳細なチュートリアル

1. 需要ベースには 300 台の新しいサーバーがあり、CentOS7.6 オペレーティング システ...