堀北真希うさぎ
主な作品
人気女優をモデルにした創作キャラクタを用いたイラストの一例とアニメーション動画

ページ案内

インターネットエクスプローラ 7.0までに対しても注釈リスト各項目に※印を打つには。

インターネットエクスプローラ 7.0まででも注釈の記述に用いた<ul>要素の各項目(<li>要素)の冒頭に※印が打てるようにするためのスクリプトを解説します。

インターネットエクスプローラ 7.0までに対しても注釈リスト各項目に※印を打つには・目次。

まず初めに。

文章に注釈を添える際、どのようにマークアップするかにも依りますが、最も妥当な方法は特別なクラス名を与えた<ul>要素としてしまうと言うのが考えられます。

CSS第二水準を正しく実装している環境であれば、この注釈リストの各項目の冒頭に※印(日本語の場合)を与える事で注釈である事が依り明確に出来ますが、インターネットエクスプローラ 7.0までは正式には第二水準非対応のためこのような事が出来ず、リストのマーカに※印の画像を使う事で代用するしかありません。

しかし、DOMを活用すれば、インターネットエクスプローラ 7.0でもテキストの※印をマーカに使う事が出来ます。

スクリプトを作るに当たって注意したい事。

インターネットエクスプローラは、アクティヴスクリプトを無効に出来るようになっております。

従って、セキュリティ上の理由からスクリプトを無効にしている場合であっても、CSSに依り適切なスタイルを与えておく必要があります。

ただ、普通に順不同リストとしてのスタイルで表示させておけば、普通の段落とは異なるブロックであると視認する事は可能と思われますので、スクリプトを無効にしたときのスタイルを考えるのが面倒なら普通の順不同リストと同じスタイルで表示させれば良いでしょう。

今回仮定している注釈リストのスタイル。

ここでは、以下のようなスタイルが与えられているものと仮定します。

ul.notes>li {
    list-style-type: none;   /* オペラの一部ヴァージョンでマーカを消すのに必要。*/
    display: block;
    margin-left: 0;
    text-indent: -1em;
    }

ul.notes>li:before {
    display: inline;
    content: "\203b";        /* content: "※"; では一部で文字化けする事がある。*/
    }

//    IE 7.0対策。
*+html ul.notes>li {
    list-style-type: disc;
    display: list-item;
    text-indent: 0;
    }
  1. インターネットエクスプローラ 6.0まででは、これらのプロパティをいずれも認識出来ず、従って普通の順不同リストと同じスタイルとなるでしょう。
  2. インターネットエクスプローラ 7.0では二番目が認識出来ないので、※印のテキストが与えられず、しかしその一方で、一番目のプロパティ定義が有効となってしまうので、三番目でキャンセルするようにします。
  3. その他の環境では三番目のみ無意味となり(文法上は合法ですが、セレクタが指定する要素は存在し得ない)、従って初めの二つのプロパティ定義に従ったレンダリングを行う事でしょう。

スクリプトの利用方法。

スクリプトは、HTML文書とは別のファイルで保存し、注釈リストを含むHTML文書では当該スクリプトを<head>要素内に<script>要素で埋め込むように記述します。

スクリプトはHTML文書の読込が完了すると自動的に処理スクリプトを起動して、インターネットエクスプローラ 7.0でも注釈用のリストの各項目冒頭に※印がテキストで打たれるようになります。

スクリプトの例。

以下のようなスクリプトを書いて、それをHTML文書からリンクすれば、アクティヴスクリプトを有効にしたインターネットエクスプローラでは、全ての<q>要素の内容にかぎ括弧が与えられて表示される事になります。

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;
        }

    //    **** 全ブラウザ対象の処理 ****

    //    **** IE 7.0までのみ対象の処理 ****
    if (!document.all || window.opera ||
         navigator.userAgent.indexOf('Trident/')>-1 &&
         navigator.userAgent.indexOf('MSIE 7.')<0) return;

    //    注釈リストのスタイル補正。
    eles=document.getElementsByTagName('ul');
    var i=-1;
    while (++i<eles.length) {
        k=' '+(eles[i].getAttribute('className') || '')+' ';
        if (k.indexOf(' '+noteClass+' ')>-1) {
            eles[i].setAttribute('className',k.split(' '+noteClass+' ').join(' '));
            var eles2=eles[i].childNodes;
            k=-1;
            while (++k<eles2.length) {
                a=eles2[k].innerHTML;
                eles2[k].innerHTML='※'+a;
                eles2[k].style.textIndent='-1em';
                eles2[k].style.listStyleImage='none';
                eles2[k].style.listStyleType='none';
                }
            continue;
            }
        }
    //    注釈リストのスタイル補正処理はここまで。
}

ここで、五行目の var noteClass='notes'; の右辺は注釈リストに与えたクラス名を指定します。

からくり。

文書内にある全ての<ul>要素ノードのうち、注釈リストに与えたクラス名を持つものを対象に、その直下の要素(原則として>li>要素)の冒頭に※印を与えると言うものです。

このとき、※印は通常のテキストとして附与されるため、text-indentプロパティに-1emを与える事で一文字分左にずらしております。

尚、<ul>要素に与えたスタイルのうち、注釈リストに与えたクラス名を取り除いたクラス名を改めて与えるようにしておりますが、これは

から、このような処理を行っております。

スクリプトについての注意事項。

今回挙げた処理では、注釈リストの項目に<p>要素などのブロックレヴェル要素が冒頭に入っている場合におかしな表示になる事があります。

これについては、要素の内容を吟味して調整する必要がありますが、そうするとコードがちょっと複雑になってしまいますので、今回は割愛させていただきました。

しらぎくのウェブサイト作成入門サイトマップ



marguerite.site@gmail.com