html+css+js实现一个简易日历

0.效果预览

简易

只实现了日历最基础的功能,当前日期红色显示,可通过上方的左右按钮查看上一月或下一月的日期。

1.HTML部分

<body>
    <div id="cldFrame">
        <div id="cldBody">
            <table>
                <thead>
                    <tr>
                        <td colspan="7">
                            <div id="top">
                                <span id="left">&lt;</span>
                                <span id="topDate"></span>
                                <span id="right">&gt;</span>
                            </div>
                        </td>
                    </tr>
                    <tr id="week">
                        <td>日</td>
                        <td>一</td>
                        <td>二</td>
                        <td>三</td>
                        <td>四</td>
                        <td>五</td>
                        <td>六</td>
                    </tr>
                </thead>
                <tbody id="tbody">
                </tbody>
            </table>
        </div>
    </div>
</body>

2.CSS部分

#cldFrame{
    position: relative;
    width: 440px;
    margin: 50px auto;
}
#cldBody{
    margin: 10px;
    position: absolute;
    width: 420px;
}
#top{
    position: relative;
    height: 60px;
    text-align: center;
    line-height: 60px;
}
#topDate{
    font-size: 30px;
}
.curDate{
    color: red;
    font-weight: bold;
}
table{
    background-color: #f7f7f7;
}
#week td{
    font-size: 15px;
}
td{
    height: 60px;
    width: 60px;
    text-align: center;
    font-family: Simsun;
    font-size: 20px;
}
#left, #right{
    position: absolute;
    width: 60px;
    height: 60px;
}
#left{left: 0px;}
#right{right: 0px;}
#left:hover, #right:hover{
    background-color: rgba(30, 30, 30, 0.2);
}
Html+Css

当前显示月份和日期下面将在JS中添加。

3.JS部分及原理讲解

先介绍两个常用的和时间有关的函数,相信大多数人都接触过~

①判断某年是否是闰年

/*判断某年是否是闰年*/
function isLeap(year) {
    if((year%4==0 && year%100!=0) || year%400==0){
        return true;
    }
    else{
        return false; 
    }
}

二月大概是十二个月份中最不安分的一个月。

②判断某年某月某日是星期几

var monthDay = [31,0,31,30,31,30,31,31,30,31,30,31];

在这之前用数组存放每个月有多少天,我这里将二月的天数设置成了0,之后再决定是加28还是29。

/*判断某年某月某日是星期几,默认日为1号*/
function whatDay(year, month, day=1) {
    var sum = 0;
    sum += (year-1)*365+Math.floor((year-1)/4)-Math.floor((year-1)/100)+Math.floor((year-1)/400)+day;
    for(var i=0; i<month-1; i++){
        sum += monthDay[i];
    }
    if(month > 2){
        if(isLeap(year)){ 
            sum += 29; 
        }
        else{
             sum += 28; 
        }
    }
    return sum%7;      //余数为0代表那天是周日,为1代表是周一,以此类推
}

这个函数是为了判断某年某月的1号是星期几而设定的,实际上可以不设置day这个参数,加上了day这个变量,允许使用者在查某日的日期是星期几时也能调用这个函数。

③日历添加部分

根据当前日期决定日历显示哪个月的日期,根据那月的1号是星期几决定1号的添加位置,前方用空格子填充。该月添加完后后方也用空格子补齐。

/*显示日历*/
function showCld(year, month, firstDay){
    var i;
    var tagClass = "";
    var nowDate = new Date();
    
    var days;//从数组里取出该月的天数
    if(month == 2){
        if(isLeap(year)){
            days = 29;
        }
        else{
            days = 28;
        }
    }
    else{
        days = monthDay[month-1];
    }

    /*当前显示月份添加至顶部*/
    var topdateHtml = year + "年" + month + "月";
    var topDate = document.getElementById('topDate');
    topDate.innerHTML = topdateHtml;    
    
    /*添加日期部分*/
    var tbodyHtml = '<tr>';
    for(i=0; i<firstDay; i++){//对1号前空白格的填充
        tbodyHtml += "<td></td>";
    }
    var changLine = firstDay;
    for(i=1; i<=days; i++){//每一个日期的填充
        if(year == nowDate.getFullYear() && month == nowDate.getMonth()+1 && i == nowDate.getDate()) {
            tagClass = "curDate";//当前日期对应格子
        } 
        else{ 
            tagClass = "isDate";//普通日期对应格子,设置class便于与空白格子区分开来
        }  
        tbodyHtml += "<td class=" + tagClass + ">" + i + "</td>";
        changLine = (changLine+1)%7;
        if(changLine == 0 && i != days){//是否换行填充的判断
            tbodyHtml += "</tr><tr>";
        } 
    }
    if(changLine!=0){//添加结束,对该行剩余位置的空白填充
        for (i=changLine; i<7; i++) {
            tbodyHtml += "<td></td>";
        }
    }//实际上不需要填充后方,但强迫症必须整整齐齐!   
    tbodyHtml +="</tr>";
    var tbody = document.getElementById('tbody');
    tbody.innerHTML = tbodyHtml;
}

调用后,日历就可以完整显示了~

    var curDate = new Date();
    var curYear = curDate.getFullYear();
    var curMonth = curDate.getMonth() + 1;
    showCld(curYear,curMonth,whatDay(curYear,curMonth));

④下一月与上一月

function nextMonth(){
    var topStr = document.getElementById("topDate").innerHTML;
    var pattern = /\d+/g;
    var listTemp = topStr.match(pattern);
    var year = Number(listTemp[0]);
    var month = Number(listTemp[1]);
    var nextMonth = month+1;
    if(nextMonth > 12){
        nextMonth = 1;
        year++;
    }
    document.getElementById('topDate').innerHTML = '';
    showCld(year, nextMonth, whatDay(year, nextMonth));
}
function preMonth(){
    var topStr = document.getElementById("topDate").innerHTML;
    var pattern = /\d+/g;
    var listTemp = topStr.match(pattern);
    var year = Number(listTemp[0]);
    var month = Number(listTemp[1]);
    var preMonth = month-1;
    if(preMonth < 1){
        preMonth = 12;
        year--;
    }
    document.getElementById('topDate').innerHTML = '';
    showCld(year, preMonth, whatDay(year, preMonth));
}

两者没多大差别,别忘了要绑定到按钮上:

    document.getElementById('right').onclick = function(){
        nextMonth();
    }
    document.getElementById('left').onclick = function(){
        preMonth();
    }

更多有趣的功能等待着你去添加~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335