DOMをスタイルに用いる例の一つとして、強調したい文字に傍点を与える処理を書いてみましょう。
CSSを用いて無理矢理擬似傍点を実現する事は可能ですが、この方法には幾つかの欠点があります。
だからと言って、CSSでフォントの幅をピクセル単位で強制するのはアクセシビリティの見地から問題があります。
また、フォントが等幅フォントで無い場合には高確率でずれが生じるでしょう。
この問題点を克服するには一文字ずつに背景画像を指定する事ですが、まさかそのためだけにいちいちタグを書くなんて幾ら何でも馬鹿げております。
しかし、JAVAスクリプトとDOMを用いてプログラム任せにしておけばそれ程面倒では無いでしょう。
ここでは、傍点を綺麗に打てる様にするためのスクリプトを紹介しましょう。
スクリプトは自由に改変していただいて構いませんが、そのためにも本記事で紹介しているスクリプトの前提条件を仕様として挙げておきます。
となります。
その他の特定の<em>要素は除外したいと言う場合については、後ほどヒントを挙げておきますが、この二重<em>を除外する処理がヒントとなる事でしょう。
尚、半角の英数字が一個だけ孤立している状態では、その文字に対して傍点を打つ事とします。
尚、文字参照は必ず;で終わっている事とします。
万が一;が漏れている場合は普通の半角文字列と見なして処理されます。
スクリプトは、HTML文書とは別のファイルで保存し、傍点を打ちたいHTML文書では当該スクリプトを文書中の任意の箇所に<script>要素で埋め込むように記述します。
スクリプトはHTML文書の読込が完了すると自動的に傍点処理スクリプトを起動して傍点が綺麗に描かれるようになります。
実際の傍点を打つコードは以下の通りです。
onload4setStyle=window.onload;window.onload=setStyle;function setStyle() {if (onload4setStyle) onload4setStyle();// 対応出来ない環境を弾く。if (!document.getElementById ||navigator.userAgent.indexOf('Opera/6')>-1 ||navigator.userAgent.indexOf('Opera 6')>-1) {return;}// **** 全ブラウザ対象の処理 **** // <em>要素に傍点を打つ処理(全ブラウザ対象)。var i,j,k,l,m,n;var eles=new Array();var eles2=new Array();// 本処理。eles=document.getElementsByTagName('em');j=-1;while (++j<eles.length) {// <em>要素の下位要素となっている<em>要素は弾く。(平成22年 3月13日)l=' '+(eles[j].getAttribute('class') || eles[j].getAttribute('className') || '')+' ';if (l.indexOf(' __doubleEM__ ')>-1) continue;// 二重の<em>要素は弾く。(平成22年 3月13日)eles2=eles[j].getElementsByTagName('em');if ((k=eles2.length)>0) {while (--k>=0) {l=(eles2[k].getAttribute('class') || eles2[k].getAttribute('className') || '')+' __doubleEM__';eles2[k].setAttribute('class', l);eles2[k].setAttribute('className', l);}continue;}i=eles[j].innerHTML; l='';while(i!='') {// タグ。m=i.substring(0,1); i=i.substring(1,i.length);if (m=='<' && (n=i.indexOf('>')+1)>0) {l+=m+i.substring(0,n);i=i.substring(n,i.length);continue;}// 文字参照。if (m=='&' && (n=i.indexOf(';')+1)>0) {l+=m+i.substring(0,n);i=i.substring(n,i.length);continue;}// 半角記号。if (' (){}[]+-=*/\\!?,."#$%\'~;:@'.indexOf(m)>-1) {l+=m; continue;}// 半角英数字。if ('abcdefghijklmnopqrstuvwxyz0123456789'.indexOf(m.toLowerCase())>-1) {if (i!='' && 'abcdefghijklmnopqrstuvwxyz0123456789'.indexOf(i.substring(0,1).toLowerCase())>-1) {m+=i.substring(0,1);i=i.substring(1,i.length);}}l+='<span style="background: transparent url(\'傍点画像への絶対URL\') no-repeat 50% 0; margin: 0; padding: 6px 0 0; ">'+m+'</span>';}eles[j].innerHTML=l;eles[j].style.background='transparent';eles[j].style.margin='0';eles[j].style.padding='0';eles[j].style.fontWeight='normal';eles[j].style.fontStyle='normal';}// <em>要素に傍点を打つ処理はここまで。 // **** IE 7.0までのみ対象の処理 ****}
このスクリプトの処理の流れは以下の通りになります。
onload4setStyleにその内容を退避させ、代わりにsetStyle()を実行させるようにします。
setStyle()の冒頭で変数onload4setStyleに退避させた処理が実行されるようになっております。setStyle()では、
特別なクラス名をそれらに与え、その上で元の<em>要素の以下の処理を行わないものとします。
<であれば、それはタグの始まりと見なし、その後の>までを纏めて切り出してそのまま出力文字列に加えます。&であれば、それは文字参照の始まりと見なし、その後の;までを纏めて切り出してそのまま出力文字列に加えます。と言うスタイルを設定しております。
今回紹介したコードはご自由に改変してお使いいただけます。
そのためにも、幾つかのヒントを挙げておきます。
例えば、<code>要素内にある<em>要素には傍点を付けられると却って見難くなるので傍点を付けたくないと言うような場合です。
実際のコードでは、二重の<em>要素について弾いておりますが、他の要素の場合は、getElementsByTagName() メソッドなどで特定の要素を抽出し、それらの下位にある<em>要素に対して上記で用いた特別なクラス名を付け加える事で弾く事が可能になります。
画像については何らかの都合で非表示にしている事もあり、その場合強調されている事が伝わらない事も考えられます。
その問題を考慮するのであれば、以下のようにすれば良いでしょう。
コードとしては、<em>要素に新たな背景を与える処理では以下のように変更すれば良いでしょう。
eles[j].style.background='通常の背景色とは異なる色url("背景色の画像への絶対URL")';
こうする事で、
と言う訳です。
では、画像を用いず、例えば ・などを各文字の上に表示させる事で傍点を表現する事は出来ないのでしょうか。
CSSの仕様を見れば、不可能ではありません。
しかも、この方法なら、
と言う利点もあります。
しかし、その一方で、実装が正しくないと巧く表示されないと言う点があります。
制作者が試して見たところ、
と言う問題がありました。
また、CSSの仕様上の問題もあります。
と言うのは、CSSの仕様上仕方がありません。
更に、
と言う問題も残ります。
結局、この方法は望ましいものではあるものの、ちょっと無理のようです。
Copyright ©平成21年-平成24年 さいたま・しらぎくさいと 版権所有
marguerite.site@gmail.com