简单日历的制作

今天分享一个日简单历的制作,主要讲解一下jQuery方面的思路,如何实现一个能切换时间的日历,样式方面相信自己做能做的更好。
先上图:在这里插入图片描述
简单看一下html结构:

<div class="box">
            <div class="top">
                <div class="pre"></div>
                <div class="next"></div>
                <div class="time">
                    <span id="year"></span>年<span id="month"></span>月<span id="date"></span>日
                </div>
            </div>
            <table  cellspacing="10">
                <tr>
                    <th class="relax">日<i>休</i></th>
                    <th>一</th>
                    <th>二</th>
                    <th>三</th>
                    <th>四</th>
                    <th>五</th>
                    <th class="relax">六<i>休</i></th>
                </tr>
            </table>
        </div>

上图,方便理解:
在这里插入图片描述
  基础样式很容易就能完成,随便写写都能达到上图效果。通过观察html的代码发现,我只给table设置一行内容,就是日期(日,一,二…)那一行,下面的日期都是通过jquery实现的,ok,接下来说jquery部分。


    //闰年与非闰年数组
    var arr1 = [31,28,31,30,31,30,31,31,30,31,30,31];
    var arr2 = [31,29,31,30,31,30,31,31,30,31,30,31];


    var date = new Date();//获取时间对象

    var year = date.getFullYear();//求年份
    var month = date.getMonth()+1;//求月份

    //设置表格
    function setTable() {

        var getDate = date.getDate();//获取当前是本月的第几天 用于后面设置当天样式
        var oldTime = new Date(year+'-'+month+'-01');//设置时间 
        var firstDay = oldTime.getDay();//求设置时间第本月第一周是第几天
        var lastMonth = month-1;//上一个月 用来得出日历第一行白色天数
        if(lastMonth == 0){
            lastMonth = 12;
        }
        var lastDay = 0;
        var count = 0;
        var arr3 = [];//此数组存储日历中上一个月份与下一个月份出现的那些天

        //count设值
        if(year % 4 == 0 && year % 100 ==0 ){
            count = arr1[month-1];
            lastDay = arr1[lastMonth-1];
        }else{
            count = arr2[month-1];
            lastDay = arr2[lastMonth-1];
        }

        //设置数组 按顺序存储
        for(var n = 0; n < firstDay; n++){
            arr3.unshift(lastDay);//插入元素至数组头部  
            lastDay--;
        }
        var lastDay = 0;
        for(var m = 0; m < 42 - count - firstDay; m++){
            lastDay++;
            arr3.push(lastDay);//插入元素至数组尾部
        }


        //设置年月日
        $('#year').html(year);
        $('#month').html(month);
        $('#date').html(getDate);


        //清空表格
        $('tr:gt('+(0)+')').remove();

        var text = null;

        //设置表格
        var num = 1;
        for(var i = 0; i < 6; i++){//日历一共六行 循环六次
            $('<tr></tr>').appendTo('table');//插入行
            for(var j = 0; j < 7; j++){
                //插入td
                if(firstDay == j && i == 0){//信号量 如果第一周某一天等于之前求得的本月第一天是周几,便从此次开始插入本月天数
                	//插入本月天数 并设置本月天数有的className 具备样式
                    $('<td></td>').html(num).addClass('key').appendTo('tr:eq('+(i+1)+')').click(function ()
                    {
                        $('td').removeClass('active');
                        $(this).addClass('active');
                        text = $(this).html();
                        $('#date').html(text);
                    });
                    //设置当天的样式  如果num等于这天是本月的第多少天 则设置当天样式
                    if(num == getDate){
                        for (var k = 0; k < $('td').length; k++){
                            if($('td').eq(k).html() == getDate){
                                $('td').eq(k).addClass('active');
                            }
                        }
                    }
                    num++;
                }else if( num != 1 && num <= count){//信号量改变 开始插入本月天数
                    $('<td></td>').html(num).addClass('key').appendTo('tr:eq('+(i+1)+')').click(function ()
                    {
                        $('td').removeClass('active');
                        $(this).addClass('active');
                        text = $(this).html();
                        $('#date').html(text);
                    });
                    //设置当天的样式
                    if(num == getDate){
                        for (var k = 0; k < $('td').length; k++){
                            if($('td').eq(k).html() == getDate){
                                $('td').eq(k).addClass('active');
                            }
                        }
                    }
                    num++;
                }else{
                	//插入元素并设置上一个月与下一个月的样式
                    $('<td></td>').html(arr3[0]).addClass('last').appendTo('tr:eq('+(i+1)+')');
                    //插入玩删除数组中第一个元素
                    arr3.shift();
                }
            }
        }

    };

    setTable();



    //上一个月
    $('.pre').click(function () {

        month--;
        if(month == 0){
            month = 12;
            year--;
        }
        setTable();
    }).mousedown(function () {
        $(this).css({
            opacity : 1,
        });
    }).mouseup(function () {
        $(this).css({
            opacity: 0.4,
        });
    });

    //下一个月
    $('.next').click(function () {

        month++;
        if(month == 13){
            month = 1;
            year++;
        }
        setTable();
    }).mousedown(function () {
        $(this).css({
            opacity : 1,
        });
    }).mouseup(function () {
        $(this).css({
            opacity: 0.4,
        });
    });

关键思想就是求出当前月份第一天在那个(一定是第一个)星期是第几天,知道月份就知道了有多少天,例如当前月份第一天在第一个星期是第2天,那么for循环当外层循环 i=0 && 里层循环 j=1时,开始插入浅蓝色样式的td标签。上一个月与下一个月的点击事件也不过是重复这个过程,并不难懂。
  代码有点多,看起来可能有点乱,深蓝色的是当天样式,浅蓝色的是本月天的样式,浅白色就是上一个月与下一个月的样式,无非就是背景色,透明度的变化,很容易设置。每次调用中间删除行很关键,不然table中的行就越来越多了。本人小白,有问题可以指出,欢迎评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值