用vue 简单写的日历

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>自制日历</title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
        <style type="text/css">
            .calendar{
                position: relative;
                width: 350px;
                height: 50px;
            }
            .header{
                border: 1px solid black;
                position: relative;
                width: 342px;
                text-align: center;
            }
            .year{
                display: inline-block;
                width: ;
            }
            .month{
                display: inline-block;
            }
            .week{
                padding: 0;
                margin: 0;
            }
            .item{
                float: left;
                list-style: none;
                width: 48px;
                height: 21px;
                text-align: center;
                padding: 0;
                margin: 0;
                border-left:1px solid black ;
                border-bottom: 1px solid black;
            }
            .item:last-child{
                border-right: 1px solid black;
            }
            ul{
                margin: 0;
                padding: 0;
                height: 21px;
            }
            .active{
                background-color: dodgerblue;
            }
            .last,.prev{
                background-color: #ccc;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <div class="calendar">
                <div class="header">
                    <div class="year">{{year+"年"}}</div>
                    <div class="month">{{month+"月"}}</div>
                </div>
                <ul class="week">
                    <li class="item"></li>
                    <li class="item"></li>
                    <li class="item"></li>
                    <li class="item"></li>
                    <li class="item"></li>
                    <li class="item"></li>
                    <li class="item"></li>
                </ul>
                <ul class="dayList" v-for="(line,lineIndex) in showData" >
                    <li class="item" v-for="(showDay,dayIndex) in line"  :class="{active:day==showDay}">{{showDay}}</li>
                </ul>
            </div>
            <!--按钮组-->
            <button type="button" @click="nextMonth">下一月</button>
            <button type="button" @click="nextYear">下一年</button>
        </div>
    </body>
    
    <script type="text/javascript">
        new Vue({
            el:"#app",
            data:{
                //记录年月日
                year:"",
                month:"",
                day:"",
                //要展示和绑定的数据
                showData:[[],[],[],[],[],[]],
                prevDay:-1,//第1行占多少天
                weekDay:7,//星期天数
                allDay:42,//6行一共的天数
                monthDay:[],//保存当前年每月的天数
            },
            created:function(){
                var date = new Date();
                this.year = date.getFullYear();
                this.month = date.getMonth()+1;
                this.day = date.getDate();
                this.monthDay = this.getMonthDay(this.year);
                this.week = this.getWeek(this.year);
                //初始化数据
                this.changeDay();
            },
            methods:{
                //判断是不是闰年
                isLearYear:function(year){
                    var condition1 = year % 4 == 0;
                    var condition2 = year % 100 !=0;
                    var condition3 = year % 400 ==0;
                    return condition1 && condition2 || condition3;
                },
                //获得当前年的每月的天数
                getMonthDay:function(year){
                    var _arr=[31,31,30,31,30,31,31,30,31,30,31];
                    if(this.isLearYear(year)){
                        //闰年    
                        _arr.splice(1,0,29);
                        return _arr; 
                    }else{
                        //平年
                        _arr.splice(1,0,28);
                        return _arr;
                    }
                },
                //当前年的一月一日是星期几
                getWeek:function(year){
                    var _arr=["Mon","Web","Sat","Thu","Fri","Sat","Sun"];
                    var week = new Date(year+","+1+","+1).toString().split(" ")[0];
                    return _arr.indexOf(week);
                }
                ,
                //修改天数数据
                changeDay:function(){
                    var _arr=[[],[],[],[],[],[]];
                    var index = Number(this.month-1);
                    var day =1;
                    //初始化
                    if(index == 0 ){
                        //1月
                        this.prevDay == this.week;
                        this.$set(this,"prevDay",this.week);
                    }else{
                        var allPrevDay=0;
                        for(var i=0;i<index;i++){
                            allPrevDay+=this.monthDay[i];
                        }
                        this.prevDay = (allPrevDay+this.week) % this.weekDay;                            
                    }
                    //第一行
                    for(var i=0;i<7;i++){
                        if(i<this.prevDay){
                            _arr[0].push("");
                        }else{
                            _arr[0].push(day);
                            day++;
                        }
                    }
                    //第二到第四行
                    for(var j=0;j<3;j++){
                        for(var k=0;k<7;k++){
                            _arr[j+1].push(day);
                            day++;
                        }
                    }
                    //第五行
                    for(var q=0;q<7;q++){
                        if(day > this.monthDay[index]){
                            _arr[4].push("");
                        }else{
                            _arr[4].push(day);
                            day++;
                        }
                    }
                    //第六行
                    for(var s=0;s<7;s++){
                        if(day>this.monthDay[index]){
                            _arr[5].push("");
                        }else{
                            _arr[5].push(day);
                            day++
                        }
                    }
                    //第五和第六可以合并成2层嵌套循环
                    this.$set(this,"showData",_arr);
                },
                nextMonth:function(e){
                    if(this.month == 12){
                        this.$set(this,"month",1);
                        this.$set(this,"year",this.year+1);
                        this.$set(this,"monthDay",this.getMonthDay(this.year));
                        this.week = this.getWeek(this.year);
                    }else{
                        this.$set(this,"month",this.month+1);
                    }
                    this.day=1;
                    this.changeDay();
                },
                nextYear:function(e){
                    this.$set(this,"year",this.year+1);
                    this.$set(this,"monthDay",this.getMonthDay(this.year));
                    this.week = this.getWeek(this.year);
                    this.day=1;
                    this.changeDay();
                },
                
            }
        });
    </script>
</html>

 

posted @ 2017-07-27 01:27  烂拖鞋  阅读(1406)  评论(0编辑  收藏  举报