vue实现简单日历

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 
  4 <head>
  5     <meta charset="UTF-8">
  6     <title>日历</title>
  7     <style>
  8 * {
  9   padding: 0;
 10   margin: 0;
 11 }
 12 
 13 ul {
 14   list-style-type: none;
 15 }
 16 
 17 #calendar {
 18   width: 450px;
 19   height: 300px;
 20   margin: 100px auto;
 21   border-radius: 2px;
 22   box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
 23     0 1px 3px 0 rgba(0, 0, 0, 0.12);
 24 }
 25 
 26 .title {
 27   font-size: 20px;
 28   letter-spacing: 3px;
 29   display: flex;
 30   justify-content: space-between;
 31   background-color: #ed8079;
 32   color: #ffffff;
 33 }
 34 
 35 .title .arrow {
 36   padding: 20px;
 37   cursor: pointer;
 38 }
 39 
 40 .year-month {
 41   display: flex;
 42   flex-direction: column;
 43   align-items: center;
 44   justify-content: space-around;
 45 }
 46 
 47 .weekdays {
 48   margin: 0;
 49   padding: 10px 0;
 50   display: flex;
 51   flex-wrap: wrap;
 52   justify-content: space-around;
 53 }
 54 
 55 .weekdays li {
 56   display: inline-block;
 57   width: 13.6%;
 58   text-align: center;
 59 }
 60 
 61 .days {
 62   padding: 0;
 63   background: #ffffff;
 64   margin: 0;
 65   display: flex;
 66   flex-wrap: wrap;
 67   justify-content: space-around;
 68 }
 69 
 70 .days li {
 71   display: inline-block;
 72   width: 14.2%;
 73   text-align: center;
 74   padding-bottom: 8px;
 75   padding-top: 8px;
 76 }
 77 
 78 .days li .active {
 79   padding: 4px 10px;
 80   border-radius: 50%;
 81   background: #ed8079;
 82   color: #fff;
 83 }
 84 
 85 .days li .other {
 86   padding: 5px;
 87   color: gainsboro;
 88 }
 89 
 90 .days li:hover {
 91   background: #e1e1e1;
 92 }
 93 </style>
 94 </head>
 95 
 96 <body>
 97     <div id="calendar">
 98         <!-- 标题 -->
 99         <div class="title">
100             <div class="arrow" 
101             @click="changeMonth('pre')"
102             ></div>
103             <div class="year-month">
104                 <span>{{currentYear}}年{{currentMonth}}月</span>
105             </div>
106 
107             <div class="arrow"
108              @click="changeMonth('next')"
109              ></div>
110         </div>
111         <!-- 星期行 -->
112         <ul class="weekdays">
113             <li 
114             v-for='(val,key) in weeks' 
115             >
116             <span :style='chooseStyle(key)'>
117                 {{val}}
118             </span>
119 
120             </li>
121 
122         </ul>
123         <!-- 日期 -->
124         <ul class="days">
125             <li 
126             v-for='(val,key) in days'
127             >
128                 <span 
129                 :class='chooseClass(val.day)'
130                 >
131                 {{val.day.getDate()}}</span>
132             </li>
133         </ul>
134     </div>
135     <script src="../vue.js"></script>
136 <script>
137 new Vue({
138   el: "#calendar",
139   data: {
140     currentDay: 1,
141     currentMonth: 1,
142     currentYear: 1970,
143     currentWeek: 1,
144     weeks: ["", "", "", "", "", "", ""],
145     days: []
146   },
147   created() {
148     this.init();
149   },
150   methods: {
151     init(data) {
152       let day;
153 
154       if (data) {
155         day = new Date(data);
156       } else {
157         let now = new Date();
158         day = new Date(this.formDate(now.getFullYear(), now.getMonth() + 1, 1));
159       }
160 
161       this.currentDay = day.getDate();
162       this.currentYear = day.getFullYear();
163       this.currentMonth = day.getMonth() + 1;
164 
165       this.currentWeek = day.getDay();
166 
167       if (!this.currentWeek) {
168         this.currentWeek = 7;
169       }
170 
171       this.days.length = 0;
172       let str = this.formDate(
173         this.currentYear,
174         this.currentMonth,
175         this.currentDay
176       );
177 
178       for (let i = 2 - this.currentWeek ; i < 37 - this.currentWeek; i++) {
179         let d = new Date(str);
180         d.setDate(i);
181         this.days.push({
182           day: d
183         });
184       }
185 
186       // //获取上月末至本月第一天的日期
187       //   for (let i = this.currentWeek - 1; i >= 0; i--) {
188       //     let d = new Date(str);
189       //     d.setDate(d.getDate() - i);
190       //     this.days.push({
191       //       day: d
192       //     });
193       //   }
194 
195       // //获取剩余的日期
196       //   for (let i = 1; i <= 35 - this.currentWeek; i++) {
197       //     let d = new Date(str);
198       //     d.setDate(d.getDate() + i);
199       //     this.days.push({
200       //       day: d
201       //     });
202       //   }
203     },
204 
205     //其他月加class名'other',今天加class名'active'
206     chooseClass(day) {
207       if (day.getMonth() + 1 != this.currentMonth) return "other";
208 
209       let a = new Date() - day;
210       if (a > 0 && a < 86400000) return "active";
211     },
212     //改变周六日显示颜色
213     chooseStyle(key) {
214       if (key === 5 || key === 6) return "color:#f1aaab";
215     },
216     //切换月份
217     changeMonth(a) {
218       let d = new Date(this.formDate(this.currentYear, this.currentMonth, 1));
219 
220       // setDate(0); 上月最后一天
221       // setDate(-1); 上月倒数第二天
222       // setDate(n) 参数n为 上月最后一天的前后n天
223       a === "pre" ? d.setDate(0) : d.setDate(35);
224 
225       this.init(this.formDate(d.getFullYear(), d.getMonth() + 1, 1));
226     },
227     //返回字符串个格式的日期
228     formDate(year, month, day) {
229       return year + "-" + month + "-" + day;
230     }
231   }
232 });
233 </script>
234 </body>
238 </html>

 

posted @ 2019-02-12 22:24  紫诺花开  阅读(5311)  评论(1编辑  收藏  举报