js生成日历

算法:

1. 根据指定年份和月份,计算该月第一天的起始位置和最后一天的结束位置

2.第一个单元格到起始位置,填充上个月日期或空白

3.起始位置和结束位置填充该月日期

4.结束位置之后填充下个月日期或空白


效果图:


JS代码:

var showIds=[];
var selectedId =null;
var selectedMonth = null;
var selectedYear = null;
/**日历初始化,默认当前月份日历
*/
function initCalendar(calendarId){
    var date_now = new Date();
    initCalendarNew(calendarId, date_now.getFullYear(),date_now.getMonth());
}


/**
* calendarId: 日历容器id
* year:4位年
* month: 0~11
*/
function initCalendarNew(calendarId,year,month){
    selectedMonth=month;
    selectedYear=year;
    var cDate = new Date(Date.parse(year+"/"+(month+1)+"/1"));


    var calendar = document.getElementById('calendarId');


    if(calendarId){
        calendar = document.getElementById(calendarId);
    }
    if(calendar!=null){
        calendar.innerHTML="";
        var cTable = document.createElement("table");
        calendar.appendChild(cTable);
        initCalendarHead(cTable);
        //计算month的总天数
        var monthDays = getMonthDays(month+1);
        //计算月份开始位置
        var monthBegin = calcStart(cDate);
        //计算月份结束位置
        var monthEnd = monthDays+monthBegin;
        //最后一行最后一个单元格位置
        var end = monthEnd%7==0?monthEnd:monthEnd+(7-monthEnd%7)
        var tr = null;
        var td = null;
        var week = -1;
        for(var i=0;i<end;i++){
            if(i%7==0){
                tr = cTable.insertRow(-1);
                tr.style.height=38;
            }
            
            td= tr.insertCell(-1);
            week = (i+1)%7;
            //创建单元格
            initCell(td,i-monthBegin,i,i-monthEnd,i>=monthEnd,month,week);
        }
    }
}


/**
* date 单元格位置与该月份第一天单元格位置的差值
* nextMonthDay 单元格位置该月份最后一天单元格位置的差值
* nextFlag 是否为下个月日期
*/
function initCell(cell,date,days,nextMonthDay,nextFlag,month,week){
    //将差值调整为日期。例如:0调整为1号,-1调整为上个月最后一天
    date = date+1;
    var currentDateFlag = date_now.getDate()==date && month==date_now.getMonth();
    var showDaysClass = currentDateFlag?"show_now":"hide";
    var previousFlag = false;
    if(date<1){
        date = getMonthDays(date_now.getMonth())+date;
        previousFlag = true;
    }
    if(nextFlag){
        previousFlag = false;
        date = nextMonthDay+1;
    }


    var showCurClass = currentDateFlag?"current_date":((week==0 || week==6)?"rest_date":"normal_date");
    cell.className=currentDateFlag?"selected":"";
    if(previousFlag){
        showCurClass+="_pre";
        showDaysClass+="_pre";
    }else if(nextFlag){
        showCurClass+="_next";
        showDaysClass+="_next";
    }
    //初始化时,如果是今天则设置为选中
    selectedId = currentDateFlag?days:selectedId;
    cell.align="center";
    var daysHtml = days>0?"第"+days+"天":"";
    var html = "<div id='"+days+"' οnclick='showDayInfo(this)' οnmοuseenter='showDays(this,"+(currentDateFlag)+")'><label class='"+showCurClass+"'>"+date+"</label><br><label id='label_"+days+"' class='"+showDaysClass+"'>"+daysHtml+"</label></div>";
    cell.innerHTML=html;
}


/*初始化日历表头
*/
function initCalendarHead(table){
    var tr = table.insertRow(-1);
    var td = tr.insertCell(-1);
    
    var year = selectedMonth-1<0?selectedYear-1:selectedYear;
    var month = selectedMonth-1<0?selectedMonth+11:selectedMonth-1;
    td.innerHTML="<label class='button white' οnclick='initCalendarNew(\"calendar\","+year+","+month+")' style='width:20px'>&lt;&nbsp;</label>";
    td.colSpan=2;
    td.align="right";
    
    td = tr.insertCell(-1);
    td.innerHTML="<label>"+selectedYear+"年"+(selectedMonth+1)+"月</label><label οnclick='initCalendarNew(\"calendar\","+date_now.getFullYear()+","+date_now.getMonth()+")' class='button white'>今天</label>";
    td.colSpan=3;
    td.align="center";
    
    td = tr.insertCell(-1);
    year = selectedMonth+1>11?selectedYear+1:selectedYear;
    month = selectedMonth+1>11?selectedMonth-11:selectedMonth+1;
    td.innerHTML="<label οnclick='initCalendarNew(\"calendar\","+year+","+month+")' class='button white' style='width:20px'>&nbsp;&gt;</label>";
    td.align="left";
    td.colSpan=2;


    tr = table.insertRow(-1);
    tr.height="30px";
    var data = ["一","二","三","四","五","六","日"];
    for(var i=0;i<data.length;i++){
        td = tr.insertCell(-1);
        td.width="50px";
        td.align="center"
        td.innerHTML="<label style='font-size:12px'>周"+data[i]+"</label>";
    }
}


function getMonthDays(month){
    var monthDays = 31;
    if(month ==4 || month==6 || month==9 || month==11) {
        monthDays = 30;
    }else if(month==2){
        monthDays=28;
        if((selectedYear%4==0&& selectedYear%100!=0) || selectedYear%400==0){
            monthDays = 29;
        }
    }
    return monthDays;
}


function calcStart(date){
    var week = date.getDay();
    week--;
    if(week<0){
        week+=7;
    }
    return week;
}


/**
* 兼容IE
*/
function parseDate(val){
    val = val.replace(/-/g,"/");
    return Date.parse(val);
}


/**
* 鼠标滑过展示提示
*/
function showDays(div,currentFlag){
    if(!currentFlag){
        showIds.push(div.id);
        var obj = null;
        for(var i=0;i<showIds.length;i++){
            obj = document.getElementById('label_'+showIds[i]);
            if(obj){
                obj.className="hide";
           }
        }
    
        //document.getElementById('label_37').style.display="";
        obj = document.getElementById('label_'+div.id);
        if(obj){
            obj.className="show";


            setTimeout(function(){obj.className="hide";showIds.remove(div.id);},1000);
        }


    }
    
}


function message(msg){
    var msgElement = document.getElementById("msg");
    msgElement.innerHTML+=msg+"<br>";
}


function showDayInfo(parentDiv){
    clearSelected();
    document.getElementById(parentDiv.id).parentNode.className="selected";
    selectedId=parentDiv.id;


}


function clearSelected(){
    if(selectedId){
        if(document.getElementById(selectedId)){
            document.getElementById(selectedId).parentNode.className="";
        }
    }
}




Array.prototype.remove = function(obj){
    var length = this.length;
    var result = -1;
    for(var i=0;i<length; i++){
        if(obj==this[i]){
            result = i;
            this.splice(i,1);
            break;
        }
    }
    return result;
}


html页面:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!---->
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />

<title>日历</title>
    <link type="text/css" rel="stylesheet" href="babyCalendar.css"></link>
    <script type="text/javascript" src="babyCalendar.js"></script>
</head>

<body οnlοad="init();">
    <div>
        <div id="calendar"></div>
        <div id="calendarExt"></div>
    </div>
    <div id="msg"></div>
</body>
</html>

css文件:

.show,.show_now{
    font-size:12px;
    color:green;
    display:"";
}

.hide ,.hide_pre,.hide_next{
    display:none;
}
        
.rest_date{
    font-size:18px;
    color:red;
}

.rest_date_pre,.rest_date_next{
    font-size:18px;
    color:gray;
}

.current_date{
    font-size:18px;
    color:green;
}

.normal_date{
    font-size:18px;
     color:blue;

}

.normal_date_pre,.normal_date_next{
    font-size:18px;
    color:gray;
}

.selected{
    background-color:#B0C4DE;
}

div#calendar table,table.thinBorder{
    border-collapse:collapse;
    border:none;
    margin-bottom:5px;
}

div#calendar td{
    border:solid #696969 1px;
}
td.thinBorder{
    border:solid #696969 1px;
    padding:5px 23px 5px 25px;
}
.label_button{
    cursor:pointer;
    border:solid #696969 1px;
    background-image:-webkit-linear-gradient(top,#fff,#999);
    display:inline-block; 
    /*-moz-linear-gradient(top,#000,#fff);
    -o-linear-gradient(top,,#000,#fff);*/
}

.button {
	display: inline-block;
	zoom: 1; /* zoom and *display = ie7 hack for display:inline-block */
	*display: inline;
	vertical-align: baseline;
	margin: 0 2px;
	outline: none;
	cursor: pointer;
	text-align: center;
	text-decoration: none;
	font: 14px/100% Arial, Helvetica, sans-serif;
	padding: 2px 5px 2px;
	text-shadow: 0 1px 1px rgba(0,0,0,.3);
	-webkit-border-radius: 3px; 
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2);
	-moz-box-shadow: 0 1px 2px rgba(0,0,0,.2);
	box-shadow: 0 1px 2px rgba(0,0,0,.2);
}
.button:hover{text-decoration:none;}
.button:active{position:relative;top:1px;}

.white{
	color:#606060;
	border:solid 1px #b7b7b7;
	background:#fff;
	background:-webkit-gradient(linear, left top, left bottom, from(#fff), to(#ededed));
	background:-moz-linear-gradient(top,  #fff,  #ededed);
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed');
}
.white:hover{
	background:#ededed;
	background:-webkit-gradient(linear, left top, left bottom, from(#fff), to(#dcdcdc));
	background:-moz-linear-gradient(top,  #fff,  #dcdcdc);
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dcdcdc');
}
.white:active{
	color:#999;
	background:-webkit-gradient(linear, left top, left bottom, from(#ededed), to(#fff));
	background:-moz-linear-gradient(top,  #ededed,  #fff);
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#ffffff');
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript"> //创建一个数组,用于存放每个月的天数 function montharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11)  { this[0] = m0; this[1] = m1; this[2] = m2; this[3] = m3; this[4] = m4; this[5] = m5; this[6] = m6; this[7] = m7; this[8] = m8; this[9] = m9; this[10] = m10; this[11] = m11; } //实现月历 function calendar() { var monthNames = "JanFebMarAprMayJunJulAugSepOctNovDec"; var today = new Date(); var thisDay; var monthDays = new montharr(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); year = today.getYear() +1900; thisDay = today.getDate(); if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) monthDays[1] = 29; nDays = monthDays[today.getMonth()]; firstDay = today; firstDay.setDate(1); testMe = firstDay.getDate(); if (testMe == 2) firstDay.setDate(0); startDay = firstDay.getDay(); document.write("<div id='rili' style='position:absolute;width:140px;left:300px;top:100px;'>")  document.write("<TABLE width='217' BORDER='0' CELLSPACING='0' CELLPADDING='2' BGCOLOR='#0080FF'>") document.write("<TR><TD><table border='0' cellspacing='1' cellpadding='2' bgcolor='Silver'>"); document.write("<TR><th colspan='7' bgcolor='#C8E3FF'>"); var dayNames = new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六"); var monthNames = new Array("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"); var now = new Date(); document.writeln("<FONT STYLE='font-size:9pt;Color:#330099'>" + "公元 " + now.getYear() + "年" + monthNames[now.getMonth()] + " " + now.getDate() + "日 " + dayNames[now.getDay()] + "</FONT>"); document.writeln("</TH></TR><TR><TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>日</FONT></TH>"); document.writeln("<th bgcolor='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>一</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>二</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>三</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>四</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>五</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>六</FONT></TH>"); document.writeln("</TR><TR>"); column = 0; for (i=0; i<startDay; i++) { document.writeln("\n<TD><FONT STYLE='font-size:9pt'> </FONT></TD>"); column++; } for (i=1; i<=nDays; i++) { if (i == thisDay) { document.writeln("</TD><TD ALIGN='CENTER' BGCOLOR='#FF8040'><FONT STYLE='font-size:9pt;Color:#ffffff'><B>") } else { document.writeln("</TD><TD BGCOLOR='#FFFFFF' ALIGN='CENTER'><FONT STYLE='font-size:9pt;font-family:Arial;font-weight:bold;Color:#330066'>"); } document.writeln(i); if (i == thisDay) document.writeln("</FONT></TD>") column++; if (column == 7) { document.writeln("<TR>");  column = 0; } } document.writeln("<TR><TD COLSPAN='7' ALIGN='CENTER' VALIGN='TOP' BGCOLOR='#0080FF'>") document.writeln("<FORM NAME='clock' onSubmit='0'><FONT STYLE='font-size:9pt;Color:#ffffff'>") document.writeln(" 现在时间:<INPUT TYPE='Text' NAME='face' ALIGN='TOP'></FONT></FORM></TD></TR></TABLE>") document.writeln("</TD></TR></TABLE></div>"); } </SCRIPT>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值