html+css+js實(shí)現(xiàn)一個(gè)簡(jiǎn)易日歷

0.效果預(yù)覽

簡(jiǎn)易

只實(shí)現(xiàn)了日歷最基礎(chǔ)的功能寓落,當(dāng)前日期紅色顯示,可通過(guò)上方的左右按鈕查看上一月或下一月的日期搔预。

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

當(dāng)前顯示月份和日期下面將在JS中添加曲伊。

3.JS部分及原理講解

先介紹兩個(gè)常用的和時(shí)間有關(guān)的函數(shù)织阅,相信大多數(shù)人都接觸過(guò)~

①判斷某年是否是閏年

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

二月大概是十二個(gè)月份中最不安分的一個(gè)月。

②判斷某年某月某日是星期幾

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

在這之前用數(shù)組存放每個(gè)月有多少天绎签,我這里將二月的天數(shù)設(shè)置成了0枯饿,之后再?zèng)Q定是加28還是29。

/*判斷某年某月某日是星期幾诡必,默認(rèn)日為1號(hào)*/
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;      //余數(shù)為0代表那天是周日奢方,為1代表是周一,以此類推
}

這個(gè)函數(shù)是為了判斷某年某月的1號(hào)是星期幾而設(shè)定的擒权,實(shí)際上可以不設(shè)置day這個(gè)參數(shù)袱巨,加上了day這個(gè)變量,允許使用者在查某日的日期是星期幾時(shí)也能調(diào)用這個(gè)函數(shù)碳抄。

③日歷添加部分

根據(jù)當(dāng)前日期決定日歷顯示哪個(gè)月的日期愉老,根據(jù)那月的1號(hào)是星期幾決定1號(hào)的添加位置,前方用空格子填充剖效。該月添加完后后方也用空格子補(bǔ)齊嫉入。

/*顯示日歷*/
function showCld(year, month, firstDay){
    var i;
    var tagClass = "";
    var nowDate = new Date();
    
    var days;//從數(shù)組里取出該月的天數(shù)
    if(month == 2){
        if(isLeap(year)){
            days = 29;
        }
        else{
            days = 28;
        }
    }
    else{
        days = monthDay[month-1];
    }

    /*當(dāng)前顯示月份添加至頂部*/
    var topdateHtml = year + "年" + month + "月";
    var topDate = document.getElementById('topDate');
    topDate.innerHTML = topdateHtml;    
    
    /*添加日期部分*/
    var tbodyHtml = '<tr>';
    for(i=0; i<firstDay; i++){//對(duì)1號(hào)前空白格的填充
        tbodyHtml += "<td></td>";
    }
    var changLine = firstDay;
    for(i=1; i<=days; i++){//每一個(gè)日期的填充
        if(year == nowDate.getFullYear() && month == nowDate.getMonth()+1 && i == nowDate.getDate()) {
            tagClass = "curDate";//當(dāng)前日期對(duì)應(yīng)格子
        } 
        else{ 
            tagClass = "isDate";//普通日期對(duì)應(yīng)格子,設(shè)置class便于與空白格子區(qū)分開(kāi)來(lái)
        }  
        tbodyHtml += "<td class=" + tagClass + ">" + i + "</td>";
        changLine = (changLine+1)%7;
        if(changLine == 0 && i != days){//是否換行填充的判斷
            tbodyHtml += "</tr><tr>";
        } 
    }
    if(changLine!=0){//添加結(jié)束璧尸,對(duì)該行剩余位置的空白填充
        for (i=changLine; i<7; i++) {
            tbodyHtml += "<td></td>";
        }
    }//實(shí)際上不需要填充后方咒林,但強(qiáng)迫癥必須整整齊齊!   
    tbodyHtml +="</tr>";
    var tbody = document.getElementById('tbody');
    tbody.innerHTML = tbodyHtml;
}

調(diào)用后爷光,日歷就可以完整顯示了~

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

兩者沒(méi)多大差別垫竞,別忘了要綁定到按鈕上:

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛀序,隨后出現(xiàn)的幾起案子欢瞪,更是在濱河造成了極大的恐慌,老刑警劉巖徐裸,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遣鼓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡重贺,警方通過(guò)查閱死者的電腦和手機(jī)骑祟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門回懦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人次企,你說(shuō)我怎么就攤上這事怯晕。” “怎么了缸棵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵贫贝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蛉谜,道長(zhǎng)稚晚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任型诚,我火速辦了婚禮客燕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狰贯。我一直安慰自己也搓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布涵紊。 她就那樣靜靜地躺著傍妒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摸柄。 梳的紋絲不亂的頭發(fā)上颤练,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音驱负,去河邊找鬼嗦玖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跃脊,可吹牛的內(nèi)容都是我干的宇挫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酪术,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼器瘪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绘雁,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橡疼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咧七,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體衰齐,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡任斋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年继阻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耻涛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘟檩,死狀恐怖抹缕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墨辛,我是刑警寧澤卓研,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站睹簇,受9級(jí)特大地震影響奏赘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜太惠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一磨淌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凿渊,春花似錦梁只、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至彩掐,卻和暖如春构舟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堵幽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工旁壮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谐檀。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓抡谐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桐猬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子麦撵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353