Index |
HOME > プログラムTOP > JavaScript |
||
単月カレンダー(休日付)
JavaScript製単月カレンダーのサンプルです。ここでは、当月一ヶ月を表示するカレンダーのつくり方を紹介しています。このカレンダーは、日曜、土曜、休日の背景色を設定して見分けがつくようにしています。対象ブラウザは、IE4以上、NN6以上、Safari、Firefox などのブラウザとなります。
sasaraan programming ![]() Exposition ■変数の宣言
var aHoliday = new Array(2,9,0,11,0,21,0,29,0,3,4,5,0,0,17,0,0,18,23,0,9,0,3,23,0,23,-1);
var aDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var aWeek = new Array("日", "月", "火", "水", "木", "金", "土");
var nDate = new Date(); // 現在の日時のDateオブジェクト
var nYear = nDate.getFullYear(); // 現在の年
var nMonth = nDate.getMonth(); // 現在の月
var nToday = nDate.getDate(); // 今日の日にち
var nDays; // 月の日数
var nFirstDay; // 月初の曜日
var i, j, k;
上記中、aDaysは各月の日数、aWeekは表示する曜日名の配列です。aHolidayは日曜以外の祝日の日にちを配列にしたものです。各月の区切りは 0、配列の終端を -1 で表しています。記述量はかさみますが、各月ごとに配列をつくり、多次元配列にしてもかまいません。この方が視認性は良くなります。(* 上記サンプルは2006年の例です)なお、getMonthメソッドの取得値は 0から始まる(0→1月, 1→2月, ...)ので注意が必要です。 ■月の日数、月初の曜日、該当月の祝日のインデックスの取得// ひと月の日数を取得(28...31)
nDays = aDays[nMonth];
if (nMonth == 1) { /* うるう年のチェック */
if (nYear % 400 == 0) nDays =29;
else if (nYear % 100 == 0) nDays = 28;
else if (nYear % 4 == 0) nDays= 29;
}
// 月初の曜日の取得
nDate.setDate(1);
nFirstDay = nDate.getDay(); // 月初日の曜日(0...6)
// 祝日を該当月までスキップ(現在位置を k に格納して維持)
for (i=0, k=0; i<=nMonth-1; k++) {
if (aHoliday[k] == 0) i++;
}
表示月が2月の場合は、うるう年かどうかをチェックする必要があります。年が4で割り切れればうるう年、ただし100で割り切れればうるう年でなく、400で割り切れればうるう年となります。月初の曜日はDateオブジェクトの日にちに 1 を設定すれば月初を示すDateオブジェクトを取得できます。ここから getDayメソッドで曜日を取得します。取得値は、0(日曜)〜6(土曜)の整数です。 また、描画する日にちが祝日かどうかをチェックする際、すばやく配列(aHoliday)にアクセスできるよう、該当つきのインデックスを取得しておきます。チェックする際は、インデックスを格納した変数 k の位置から始めればよいことになります。 ■カレンダーの描画
// 年月の描画(○年○月)
document.write("<table style='width:160px; border:1px solid gray; font-size:12px; line-height:16px;'>");
document.write("<tr><th colspan='7' style='padding:0; border-bottom:solid gray 1px'>");
document.write(nYear, "年 ", nMonth+1, "月");
document.write("</th></tr>");
// 曜日の描画(日...土)
document.write("<tr>");
for (i = 0; i < 7; i++) {
document.write("<td style='padding:0; border:0; text-align:center;'>", aWeek[i], "</td>");
}
document.write("</tr>");
// 日にちの描画(1...28-31)
document.write("<tr>");
for (i = -nFirstDay, j = 0; i < nDays; i++) {
var sStyle = " padding:0; text-align:center; "; // スタイル
if (i < 0) { /* 1日まで空白で埋める */
document.write("<td style='", sStyle, "'> </td>");
} else { /* 1日〜末日までを挿入 */
if ((i+1) == nToday) {
sStyle += " background-color:#99ff99; "; // 今日
} else if ((i+1) == aHoliday[k]) {
sStyle += " background-color:#ffcccc; "; // 祭日
k++;
} else if (j==0) {
sStyle += " background-color:#ffcccc; "; // 日曜
} else if (j==6) {
sStyle += " background-color:#ccccff; "; // 土曜
} else {
sStyle += " background-color:transparent; "; // 平日
}
document.write("<td style='", sStyle, "'>", i+1, "</td>");
}
if (++j == 7 && i != nDays) { /* 土曜日で月末に達していなければ改行 */
document.write("</tr><tr>");
j = 0;
}
}
document.write("</tr></table>");
土曜、日曜、祝日、今日の日にちの背景色を平日と区別しています。この設定は日にちの描画の箇所で行っています。なお、ループは月初の曜日インデックスをマイナスした位置からスタートさせています。この値がマイナスのうちは前月の日付であることを示します。
|
|||
www.sasaraan.net |
(c) morijoh |