CooLLYP

1.HTML完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="style.css" />
    <style>
        .datepicker{
            border: 1px solid #ccc;
            border-radius: 4px;
            padding: 5px;
            height: 24px;
            line-height: 24px;
            width: 230px;
            margin: 50px auto;
            display: block;
        }
        .datepicker:focus{
            outline: 0 none;
            border: 1px solid #1abc9c;
        }
    </style>
</head>
<body>
    <input type="text" class="datepicker" />
    <script src="data.js"></script>
    <script src="main.js"></script>
    <script>
        datepicker.init(\'.datepicker\');
    </script>
</body>
</html>

2.css样式如下:

.ui-datepicker-wrapper{
    width: 240px;
    font-size: 16px;
    color: #666;
    box-shadow: 2px 2px 8px 2px rgba(128, 128, 128, 0.3);
    display: none;
    position: absolute;
}
.ui-datepicker-wrapper-show{
    display: block;
}
.ui-datepicker-wrapper .ui-datepicker-header{
    padding: 0 20px;
    height: 50px;
    line-height: 50px;
    text-align: center;
    background: #f0f0f0;
    border-bottom: 1px solid #ccc;
    font-weight: bold;
}
.ui-datepicker-wrapper .ui-datepicker-btn{
    font-family: serif;
    font-size: 20px;
    width: 20px;
    height: 50px;
    line-height: 50px;
    color: #1abc9c;
    text-align: center;
    cursor: pointer;
    text-decoration: none;
}
.ui-datepicker-wrapper .ui-datepicker-prev-btn{
    float: left;
}
.ui-datepicker-wrapper .ui-datepicker-next-btn{
    float: right;
}
.ui-datepicker-wrapper .ui-datepicker-body table{
    width: 100%;
    border-collapse: collapse;
}
.ui-datepicker-wrapper .ui-datepicker-body th,
.ui-datepicker-wrapper .ui-datepicker-body td{
    text-align: center;
    height: 30px;
}
.ui-datepicker-wrapper .ui-datepicker-body th{
    font-size: 12px;
    height: 40px;
    line-height: 40px;
}
.ui-datepicker-wrapper .ui-datepicker-body td{
    font-size: 10px;
    border: 1px solid #f0f0f0;
    cursor: pointer; 
}
.ui-datepicker-wrapper .ui-datepicker-body td.not{
    color: #c0bbbb;
    font-weight: normal;
}
.ui-datepicker-wrapper .ui-datepicker-body td.active{
    background-color: #1abc9c;
    font-weight: normal;
    color: #fff;
}

3.js代码如下:

data.js如下:

(function(){
    var datepicker = {};
    datepicker.getMonthData = function(year, month){
        var ret = [];
        // month  为真实的数据
        if(!year || !month){
        // if(!year && !month){    
            var today = new Date();
            year = today.getFullYear();
            month = today.getMonth() + 1;
        }
        // 当月第一天
        var firstDay = new Date(year, month-1, 1);
        // 当月第一天的星期几
        var firstDayWeekDay = firstDay.getDay();
        // 周日处理
        if(firstDayWeekDay === 0){
            firstDayWeekDay = 7;
        }

        year = firstDay.getFullYear();
        month = firstDay.getMonth() + 1;

        // if(month < 10){
        //     month = "0" + month;
        // }
        //上个月的最后一天 (当月的第0天)
        var lastDayOfLastMonth = new Date(year, month-1, 0);
        //上个月的最后一天的日期
        var lastDateOfLastMonth = lastDayOfLastMonth.getDate();
        //当月第一天前面显示多少上月的数据
        var preMonthDayCount = firstDayWeekDay - 1;
        //当月的最后一天
        var lastDay = new Date(year, month, 0);
        //当月的最后一天的日期
        var lastDate = lastDay.getDate();
        for(var i = 0; i < 7*6; i++){
            //当月对应的日期
            var date = i + 1 - preMonthDayCount;
            var showDate = date; //显示的是哪一天
            var thisMonth = month; //当月
            if(date <= 0){
                //上一月
                thisMonth = month - 1;
                showDate = lastDateOfLastMonth + date;
            }
            else if(date > lastDate){
                //下一月
                thisMonth = month + 1;
                showDate = showDate - lastDate;
            }    

            if(thisMonth === 0){
                thisMonth = 12;
            }
            if(thisMonth === 13){
                thisMonth = 1;
            }
            ret.push({
                year: year,
                month: thisMonth,
                date: date,
                showDate: showDate
            })
        }
        return {
            year: year,
            month: month,
            days: ret,
            lastDate: lastDate
        };
    }
    window.datepicker = datepicker;
})();

main.js如下:

(function(){
    var datepicker = window.datepicker;
    var monthData;
    var $wrapper;
    //querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素。
    datepicker.buildUi = function(year, month){
        monthData = datepicker.getMonthData(year,month);
        var html =  \'<div class="ui-datepicker-header">\'+
                     \'<a href="#" class="ui-datepicker-btn ui-datepicker-prev-btn">&lt;</a>\'+
                     \'<a href="#" class="ui-datepicker-btn ui-datepicker-next-btn">&gt;</a>\'+
                     \'<span class="ui-datepicker-curr-month">\'+monthData.year+\'-\'+padding(monthData.month)+\'</span>\'+
                     \'</div>\'+
                     \'<div class="ui-datepicker-body">\'+
                     \'<table>\'+
                     \'<thead>\'+
                     \'<tr>\'+
                     \'<th>一</th>\'+
                     \'<th>二</th>\'+
                     \'<th>三</th>\'+
                     \'<th>四</th>\'+
                     \'<th>五</th>\'+
                     \'<th>六</th>\'+
                     \'<th>日</th>\'+
                     \'</tr>\'+
                     \'</thead>\'+
                     \'<tbody>\';     
        for(var i = 0; i < monthData.days.length; i++ ){
            var date = monthData.days[i];
            if(i%7 === 0){
                html += "<tr>";
            }
            // html += \'<td data-date="\'+date.date+\'">\'+date.showDate+\'</td>\';
            if(date.date <= 0 || date.date > monthData.lastDate){
                html +=\'<td class="not" data-date="\'+ date.date +\'">\'+date.showDate+\'</td>\';
            }
            else if(date.year === (new Date()).getFullYear() && date.month === ((new Date()).getMonth()+1) && date.date === (new Date()).getDate()){
                html +=\'<td class="active" data-date="\'+ date.date +\'">\'+date.showDate+\'</td>\';
            }
            else{
                html +=\'<td data-date="\'+ date.date +\'">\'+date.showDate+\'</td>\';
            }
            if(i%7 === 6){
                html += "</tr>";
            }
        };
        html += \'</tbody>\'+
                \'</table>\'+
                \'</div>\';
        return html;
    };
    datepicker.render = function(direction){
        var year,month;
        if(monthData){
            year = monthData.year;
            month = monthData.month;
        }
        if(direction === \'prev\'){
            month--;
            if(month === 0){
                month = 12;
                year--;
            }
        }
        if(direction === \'next\'){
            month++;
        }
        // var html = datepicker.buildUi(year, month);
        // $wrapper = document.createElement("div");
        // $wrapper.className = \'ui-datepicker-wrapper\';
        // $wrapper.innerHTML = html;
        // document.body.appendChild($wrapper);
        var html = datepicker.buildUi(year, month);
        $wrapper = document.querySelector(\'.ui-datepicker-wrapper\');
        if(!$wrapper){
            $wrapper = document.createElement("div");
            document.body.appendChild($wrapper);
            $wrapper.className = \'ui-datepicker-wrapper\';
        }
        $wrapper.innerHTML = html;
    }
    datepicker.init = function(input){
        datepicker.render();
        var $input = document.querySelector(input);
        var isOpen = false;
        $input.value = format(new Date());
        $input.addEventListener(\'click\',function(){
            if(isOpen){
                $wrapper.classList.remove(\'ui-datepicker-wrapper-show\')
                isOpen = false;
            }else{
                $wrapper.classList.add(\'ui-datepicker-wrapper-show\')
                var left = $input.offsetLeft;
                var top = $input.offsetTop;
                var height = $input.offsetHeight;
                $wrapper.style.top = top + height + 2 + "px";
                $wrapper.style.left = left + "px"; 
                isOpen = true;
            }
        },false);

        $wrapper.addEventListener(\'click\',function(e){
            var $target = e.target;
            if(!$target.classList.contains(\'ui-datepicker-btn\')){
                return;
            }
            // 上一月
            if($target.classList.contains(\'ui-datepicker-prev-btn\')){
                datepicker.render(\'prev\');
            }
            // 下一月
            else if($target.classList.contains(\'ui-datepicker-next-btn\')){
                datepicker.render(\'next\');
            }
        }, false);

        $wrapper.addEventListener(\'click\',function(e){
            var $target = e.target;
            if($target.tagName.toLowerCase() !== \'td\'){
                return;
            }
            var date = new Date(monthData.year, monthData.month - 1, $target.dataset.date);
            $input.value = format(date);
            $wrapper.classList.remove(\'ui-datepicker-wrapper-show\')
            isOpen = false;
        }, false);

    }

    var padding = function(num){
        if(num <= 9){
            return "0"+num;
        }
        return num;
    }
    function format(date){
        var ret = \'\';
        ret += date.getFullYear() + "-";
        ret += padding(date.getMonth() + 1) + "-";
        ret += padding(date.getDate());
        return ret;
    }
})();

4.最终完成效果如下:

 

分类:

技术点:

相关文章: