微信小程序:实现日历功能

一、功能描述

实现日历功能

二、 代码实现

1. index.wxml

 1 <view class='wrap'>
 2     <view>
 3         <view class='date-show'>
 4             <view class='lt-arrow' bindtap='lastMonth'>
 5                 <image src='/images/left_arrow.png' mode='aspectFit'></image>
 6             </view>
 7             {{year}}年{{month}}月
 8             <view class='rt-arrow' bindtap='nextMonth'>
 9                 <image src='/images/right_arrow.png' mode='aspectFit'></image>
10             </view>
11         </view>
12     </view>
13     <view class='header'>
14         <view wx:for='{{date}}' class='{{(index == todayIndex) && isTodayWeek ? "weekMark" : ""}}'>{{item}}<view></view></view>
15     </view>
16     <view class='date-box'>
17         <view wx:for='{{dateArr}}' class='{{isToday == item.isToday ? "nowDay" : ""}}' data-date='{{item.isToday}}'>            
18             <view class='date-head'>
19                 <view>{{item.dateNum}}</view>
20             </view>
21             <!-- <view class='date-weight'>{{item.weight}}</view> -->
22         </view>
23     </view>
24 </view>

2. index.js

 1 Page({
 2   data: {
 3     year: 0,
 4     month: 0,
 5     date: ['日', '一', '二', '三', '四', '五', '六'],
 6     dateArr: [],
 7     isToday: 0,
 8     isTodayWeek: false,
 9     todayIndex: 0
10   },
11   onLoad: function () {
12     let now = new Date();
13     let year = now.getFullYear();
14     let month = now.getMonth() + 1;
15     this.dateInit();
16     this.setData({
17       year: year,
18       month: month,
19       isToday: '' + year + month + now.getDate()
20     })
21   },
22   dateInit: function (setYear, setMonth) {
23     //全部时间的月份都是按0~11基准,显示月份才+1
24     let dateArr = [];                        //需要遍历的日历数组数据
25     let arrLen = 0;                            //dateArr的数组长度
26     let now = setYear ? new Date(setYear, setMonth) : new Date();
27     let year = setYear || now.getFullYear();
28     let nextYear = 0;
29     let month = setMonth || now.getMonth();                    //没有+1方便后面计算当月总天数
30     let nextMonth = (month + 1) > 11 ? 1 : (month + 1);
31     let startWeek = new Date(year + ',' + (month + 1) + ',' + 1).getDay();                            //目标月1号对应的星期
32     let dayNums = new Date(year, nextMonth, 0).getDate();                //获取目标月有多少天
33     let obj = {};
34     let num = 0;
35 
36     if (month + 1 > 11) {
37       nextYear = year + 1;
38       dayNums = new Date(nextYear, nextMonth, 0).getDate();
39     }
40     arrLen = startWeek + dayNums;
41     for (let i = 0; i < arrLen; i++) {
42       if (i >= startWeek) {
43         num = i - startWeek + 1;
44         obj = {
45           isToday: '' + year + (month + 1) + num,
46           dateNum: num,
47           weight: 5
48         }
49       } else {
50         obj = {};
51       }
52       dateArr[i] = obj;
53     }
54     this.setData({
55       dateArr: dateArr
56     })
57 
58     let nowDate = new Date();
59     let nowYear = nowDate.getFullYear();
60     let nowMonth = nowDate.getMonth() + 1;
61     let nowWeek = nowDate.getDay();
62     let getYear = setYear || nowYear;
63     let getMonth = setMonth >= 0 ? (setMonth + 1) : nowMonth;
64 
65     if (nowYear == getYear && nowMonth == getMonth) {
66       this.setData({
67         isTodayWeek: true,
68         todayIndex: nowWeek
69       })
70     } else {
71       this.setData({
72         isTodayWeek: false,
73         todayIndex: -1
74       })
75     }
76   },
77   lastMonth: function () {
78     //全部时间的月份都是按0~11基准,显示月份才+1
79     let year = this.data.month - 2 < 0 ? this.data.year - 1 : this.data.year;
80     let month = this.data.month - 2 < 0 ? 11 : this.data.month - 2;
81     this.setData({
82       year: year,
83       month: (month + 1)
84     })
85     this.dateInit(year, month);
86   },
87   nextMonth: function () {
88     //全部时间的月份都是按0~11基准,显示月份才+1
89     let year = this.data.month > 11 ? this.data.year + 1 : this.data.year;
90     let month = this.data.month > 11 ? 0 : this.data.month;
91     this.setData({
92       year: year,
93       month: (month + 1)
94     })
95     this.dateInit(year, month);
96   }
97 })

3. index.wxss

  1 .date-show{
  2     position: relative;
  3     width: 250rpx;
  4     font-family: PingFang-SC-Regular;
  5     font-size: 40rpx;
  6     color: #282828;
  7     text-align: center;
  8     margin: 59rpx auto 10rpx;
  9 }
 10 .lt-arrow,.rt-arrow{
 11     position: absolute;
 12     top: 1rpx;
 13     width: 60rpx;
 14     height: 60rpx;
 15   padding-right: 0.6rem;
 16 }
 17 .lt-arrow image,.rt-arrow image{
 18     width: 40rpx;
 19     height: 40rpx;
 20 }
 21 .lt-arrow{
 22     left: -110rpx;
 23     /* transform: rotate(180deg); */
 24 }
 25 .rt-arrow{
 26     right: -100rpx;
 27 }
 28 .header{
 29     font-size: 0;
 30     padding: 0 24rpx;
 31 }
 32 .header>view{
 33     display: inline-block;
 34     width: 14.285%;
 35     color: #333;
 36     font-size: 30rpx;
 37     text-align: center;
 38     border-bottom: 1px solid #D0D0D0;
 39     padding: 39rpx 0;
 40 }
 41 .weekMark{
 42     position: relative;
 43 }
 44 .weekMark view{
 45     position: absolute;
 46     bottom: 0;
 47     left: 0;
 48     width: 100%;
 49     border-bottom: 1px solid #22A7F6;
 50 }
 51 .date-box{
 52     font-size: 0;
 53     padding: 10rpx 0;
 54 }
 55 .date-box>view{
 56     position: relative;
 57     display: inline-block;
 58     width: 14.285%;
 59     color: #020202;
 60     font-size: 40rpx;
 61     text-align: center;
 62     vertical-align: middle;
 63     margin: 15rpx 0;
 64 }
 65 .date-head{
 66     height: 60rpx;
 67     line-height: 60rpx;
 68     font-size: 26rpx;
 69 }
 70 .nowDay .date-head{
 71     width: 60rpx;
 72     border-radius: 50%;
 73     text-align: center;
 74     color: #fff;
 75     background-color: #22A7F6;
 76     margin: 0 auto;
 77 }
 78 .date-weight{
 79     font-size: 22rpx;
 80     padding: 15rpx 0;
 81 }
 82 .nowDay .date-weight{
 83     color: #22A7F6;
 84 }
 85 .one{
 86     position: absolute;
 87     bottom: 0;
 88     right: 5rpx;
 89     width: 20rpx;
 90     height: 20rpx;
 91     border-radius: 50%;
 92     background-color: red;
 93 }
 94 .two{
 95     position: absolute;
 96     bottom: 30rpx;
 97     right: 5rpx;
 98     width: 20rpx;
 99     height: 20rpx;
100     border-radius: 50%;
101     background-color: blue;
102 }

猜你喜欢

转载自www.cnblogs.com/huiAlex/p/9463037.html