Step.21 - JavaScript で 交互に背景色が変わる表を作る

交互に色が変わる表を作ると、あとで項目が増えたり減ったりして背景色の修正が大変です。JavaScriptで作ると編集が楽になります。

Step テーマ


● for文 (処理のループ)
● %演算子 余りを求める

実行例


▲TOP

リスト


<style type="text/css"><!--
.sotowaku {
width: 11em;
border-style: solid;
border-width: thin;
}
.iro1 { background-color: #DB7093; }
.iro2 { background-color: #D8BFD8; }
// --></style>
 
<script type="text/javascript"><!--
function myFuncTable(){
var myTbl; // 表示項目のテーブル
var myTblColor; // 背景色のテーブル
var myStr; // 作成したタグの文字列
var i; // ループ用
 
myTbl = new Array(
"Aさんのホームページ",
"Bさんのホームページ",
"Cさんのホームページ",
"Dさんのホームページ",
"Eさんのホームページ",
"Fさんのホームページ"
);
myTblColor = new Array( "iro1", "iro2" );
 
myStr = "<div class='sotowaku'>";
for ( i=0; i<myTbl.length; i++){ // テーブル数分ループ
myStr += "<div class='" + myTblColor[i % 2] + "'>"; // 交互に色付け
myStr += myTbl[i]; // 表示項目セット
myStr += "<\/div>";
}
myStr += "<\/div>";
 
return ( myStr );
}
// --></script>
 
<script type="text/javascript"><!--
document.write( myFuncTable() );
// --></script>

↓ このフォームには、上記のリストと同じものが入っています。[CTRL]+[A]で全選択して、コピーできます。
▲TOP
サンプルだけの HTMLは こちらへ

説明


実行例のような単純なテーブルを作ろうとしたら、おそらく下のような タグになると思います。
<div class="iro1">Aさんのホームページ</div>
<div class="iro2">Bさんのホームページ</div>
<div class="iro1">Cさんのホームページ</div>
<div class="iro2">Dさんのホームページ</div>
<div class="iro1">Eさんのホームページ</div>
<div class="iro2">Fさんのホームページ</div>
しかし、BさんとCさんの間にGさんを入れようとすると セルの背景色が ずれるため、修正が大作業になってしまいます。

JavaScriptで テーブルを作ってしまえば、編集が楽になります。
myTbl = new Array(
);
myTblColor = new Array( "iro1", "iro2" );
myTbl は、テーブルに表示する項目の配列です。この順番にテーブルに表示していきます。
myTblColor は、テーブルのセルに交互に付ける背景色の配列です。

for ( i=0; i<myTbl.length; i++){ // テーブル数分ループ
myStr += "<div class='" + myTblColor[i % 2] + "'>"; // 交互に色付け
myStr += myTbl[i]; // データセット
myStr += "<\/div>";
}
データの数だけ、<div> 〜 </div>の行を作成します。

今回は ループ(for文) という if 文の 次にくるプログラムの基本となる命令を使います。

書式は、
for ( 初期値設定; ループ条件; ループ後の処理 ){ ループ内処理 }
です。
初期値設定ループカウンタの初期値をセットします。
ループ条件いつまでループするかの条件式をセットします。
ループ後の処理ループカウンタを加算します。
ループ内処理ループしている間 処理するプログラムを書きこみます。

初期値設定は、for文を始める時に1回のみ処理します。
次に、ループ条件をチェックして、条件を満たしていたら、ループ内処理を行います。
ループ内処理が終われば、ループ後の処理をして、再びループ条件をチェックします。
ループ条件が満たしていなければ、for 文の ループは終わります。

for 文も if 文同様に、処理が 1つだけでなら、括弧{}は省略できます。
for (i=0; i<myTbl.length; i++){ 処理1; 処理2; ・・; }
for (i=0; i<myTbl.length; i++) 処理1;

サンプルでは、6個の配列データを テーブルに書きこみたいので、初期値設定は配列の先頭、つまり0を i にセットします。
i=0;
ループ条件は データの数だけ ループしたいので、配列の数が入っている myTbl.length を使って、
i < myTbl.length;
で、i が myTbl.lengthより小さければ条件成立となり、ループ内処理を行います。
ループ後の処理は 次の配列のデータを参照したいので、i に1を足すという処理を記述します。
i++
※ i++; は i=i+1; と同じです。インクリメントといいます。Step.10参照

for (i=0; i<myTbl.length; i++){ 処理 }
配列の数(myTbl.length) は 6なので i=0〜5 の 6回ループします。

ループ内処理にて、<div> 〜 </div> の行を作成していきます。
myStr += "<div class='" + myTblColor[i % 2] + "'>";
myStr += myTbl[i];
myStr += "<\/div>";

セルの背景色指定に、
myTblColor[ i % 2]
とあります。
% は、余りを求める演算子です。
a = 7 % 2 ; とすれば、a には 1 が入ります。
背景色は 2種類の色を 交互につけていくので、i を2で割った 余りは 0か1なので、myTblColor の0番目と1番目の背景色を交互に取り出せるわけです。


▲TOP

CSSで交互に背景色を変える

~IE8 IE9~ CM FX OP SF
交互に背景色を変えるのは JavaScriptを使わなくても、スタイルシートだけでも実現できます。

<style type="text/css"><!--
div.sample1 {
}
div.sample1 div:nth-child(odd) { background-color: #DB7093; }
div.sample1 div:nth-child(even) { background-color: #D8BFD8; }
// --></style>

<div class="sample1">
<div>Aさんのホームページ</div>
<div>Bさんのホームページ</div>
<div>Cさんのホームページ</div>
<div>Dさんのホームページ</div>
<div>Eさんのホームページ</div>
<div>Fさんのホームページ</div>
</div>


Aさんのホームページ
Bさんのホームページ
Cさんのホームページ
Dさんのホームページ
Eさんのホームページ
Fさんのホームページ

奇数行を nth-child(odd) 、偶数行を nth-child(even) で指定します。

非常に便利なCSSですが IE8以下が対応していないため、まだ実用的ではありません。
▲TOP