JavaScript簡單日歷實現-小程序版

images.jpg

這個日歷應該是網頁中常見的小功能了,這個也是window下的時間顯示器,這篇文章,就來實現下這個效果的小程序版本,哈哈,求個贊! 這個可以當做小程序學習的一個很好的實例啦,底部有下載鏈接,有需要的可以下載查看源碼~去我個人網站瀏覽效果更好一些哈傳送門zhengyepan

image

一、實現的思路

寫js的時候,最重要的就是思路了,先有思路在用思路去做細節實現。首先呢,我來說下我的思路,不同人寫同種效果可能有不同思路,不能說誰的思路厲害,但是有句話說的好,不管黑貓白貓,能抓到老鼠的就是好貓,同樣道理。當然了,嚴謹的思路更加容易維護代碼啦~

思路:

  • 當月有多少天

  • 當月第一天星期幾

  • 日歷一行有七個格子,對應周日到周六(周日算一周的開始),每月最多31天,最少28天,根據前兩個條件來決定要顯示多少行,如果當月第一天不是周日的話,則第一排前面的格子有上月天數的填滿,如果當月最后一天不是周六,則剩下的格子有下月天數補上。

  • 4.我需要是我只要傳入一個年份月份參數給一個函數,它就會自動渲染日歷格子 例如:calendar(year,month)

根據上面的思路我們來具體實現它。

wxml

<!--wxml-->
<view class="calendar">
      <view class="flex calendar-choose">
            <view class="tc mouth-wrap">
                  <view class="fl prev-mouth" data-handle="prev" bindtap="handleMonth">
                        <text class="iconfont icon-zuoyouqiehuan"></text>
                  </view>
                  <view class="mouth-picker">
                         <picker value="{{cur_month}}" range="{{monthList}}" bindchange="chooseMonth">
                              <view class="picker">{{cur_month+1}}月</view>
                        </picker> 
                  </view>
                  <view class="fr next-mouth"  data-handle="next" bindtap="handleMonth">
                        <text class="iconfont icon-zuoyouqiehuan1"></text>
                  </view>
            </view>
            <view class="year-wrap">
                   <picker class="tr" value="{{itemIndex}}" range="{{yearList}}" style="width:200rpx;" bindchange="chooseYear">
                         <view class="picker">{{yearList[itemIndex]}}年</view>
                   </picker>
                  <view class="iconfont icon-xia"></view>
            </view>
      </view>
       <view>
            <view class="flex week-list">
                  <view class="week-itm" wx:for="{{weeklist}}">{{item}}</view>
            </view>
            <view class="flex days-list">
                  <view class="day lm" wx:for="{{lastMonthDaysList}}" data-handle="prev" bindtap="handleMonth">
                        <text>{{item}}</text>
                  </view>
                  <block  wx:for="{{currentMonthDaysList}}">
                        <view class="day">
                              <text>{{item}}</text>
                        </view>
                  </block>
                  <view class="day nm" wx:for="{{nextMonthDaysList}}" data-handle="next" bindtap="handleMonth">
                        <text>{{item}}</text>
                  </view>
            </view> 
      </view>  
</view>

wxss

/**app.wxss**/
.calendar{overflow-x:hidden;}
.calendar-choose{height:100rpx;line-height:100rpx;background:#fefefe;padding:0 30rpx;
font-size:34rpx;color:#353535;border-bottom: 1rpx solid #e5e5e5;}
.calendar .mouth-wrap{flex: 1;display: flex;justify-content: space-between;}
.mouth-wrap .iconfont{color:#b6b6b6;font-size: 50rpx;}
.calendar .mouth-wrap>view{display: inline-block;text-align: center;}
.calendar .mouth-picker{width:200rpx;}
.calendar .prev-mouth{width:100rpx;}
.calendar .next-mouth{width:100rpx;}
.calendar .year-wrap{width:200rpx;-webkit-display: flex;display: flex;
-webkit-justify-content:center;justify-content: center;}
.calendar .year-wrap .picker{text-align: center;}
.calendar .week-list{line-height: 60rpx;background:#b9c4c9;}
.calendar .week-list .week-itm{flex:1;text-align: center;font-size:28rpx;color:#fff;}
.calendar .days-list{-webkit-flex-wrap: wrap;flex-wrap: wrap;width:99.995%;}
.calendar .days-list .day{width: 14.285%;height:60rpx;border-right:1rpx solid #e5e5e5;
border-bottom:1rpx solid #e5e5e5;color:#333;position: relative;text-align: center;line-height: 60rpx;}
.calendar .days-list .lm,.calendar .days-list .nm{color:#b6b6b6;}
.calendar .day .ep{color:#333;}

最關鍵的wxs(也就是js啦,因為都寫在一起瀏覽效果不佳,我把wxs分開寫哈,)


Page({
  data: {
    weeklist: ['日', '一', '二', '三', '四', '五', '六'],
    itemIndex: 10,   //當前年份的數組下標    
  },                 //這個值和年份的前后一致的值相等,要注意就是年份訪問時一當前年為切割點,
  /**                //前后年份范圍的數值相等比較好計算,當然看需求而定啦。
   * 生命周期函數--監聽頁面加載
   */
  onLoad: function (options) {
    var that = this;    
    var cur_year = new Date().getFullYear();   //獲取當前年
    var cur_month = new Date().getMonth();    //獲取當前月
    that.setData({
      dataTime: cur_year + "-" + cur_month + "-01"
    });

    that.calendar(cur_year, cur_month);
    //拿到當前的年月,渲染第一次進來小程序的日期數據
    that.setData({
      cur_year,
      cur_month,
    });

  },
 //頁面相關事件處理函數--監聽用戶下拉動作

onPullDownRefresh: function () {

},

/**
 頁面上拉觸底事件的處理函數
 **/
onReachBottom: function () {

},

/*
 用戶點擊右上角分享
 */
onShareAppMessage: function () {
  return {
    title: '簡單日歷實現小程序版本',
    desc: '簡單日歷實現小程序版本',
    path: '/pages/index/index'
  };
},
  //日歷方法  ,參數是只要穿入年和月就可以渲染出來當前年月的日歷,
  //用let來代替var,let是es6的,也是用來聲明變量的,只是沒有變量提升,更加嚴謹
  calendar: function (year, month) {
      let fullDay = parseInt(new Date(year, month + 1, 0).getDate()),//當前月總天數
      startWeek = parseInt(new Date(year, month, 1).getDay()),  //當前月第一天周幾
      lastMonthDay = parseInt(new Date(year, month, 0).getDate()),   //上個月的天數
      totalDay = (fullDay + startWeek) % 7 == 0 ? (fullDay + startWeek) : fullDay + startWeek + (7 - (fullDay + startWeek) % 7);//元素總個數
    //年份范圍  我是取當前年的前后十年
    let newYearList = [], newMonthList = [], curYear = new Date().getFullYear();
    for (var i = curYear - 10; i < curYear + 10; i++) {
      newYearList.push(i);
    }
    //月份范圍
    for (var i = 1; i <= 12; i++) {
      newMonthList.push(i);
    }

    let lastMonthDaysList = [], currentMonthDaysList = [], nextMonthDaysList = [];
    // 遍歷日歷格子
    for (let i = 0; i < totalDay; i++) {
      if (i < startWeek) {
         //當月第一天不是周日的情況下,前面有幾個格式是上月的,就渲染上月的天數
        lastMonthDaysList.push(lastMonthDay - startWeek + 1 + i);  

      } else if (i < (startWeek + fullDay)) {

       //當月天數
        currentMonthDaysList.push(i + 1 - startWeek);     

      } else {
        //當月最后一天不是周六的時候,剩下的各自就渲染下月的天數
        nextMonthDaysList.push((i + 1 - (startWeek + fullDay)));    
      }
    }

    this.setData({
      monthList: newMonthList,//月份
      yearList: newYearList, //年份范圍
      lastMonthDaysList,   //上月總天數
      currentMonthDaysList, //當前月總天數
      nextMonthDaysList  //下月總天數
    });
    //要注意獲取的年份是從0開始算起的,所以需要添加一來顯示,這是中國地區的習慣啦
    var tmonth = month + 1;     

     //讓小程序的標題也跟著改變
    wx.setNavigationBarTitle({ title: year + "年" + tmonth + "月" })     
  },

  //選擇月
  //當用picker選擇月份的時候,月份就要發生改變,然后把新的年月傳入calendar參數中,重新渲染日歷
  chooseMonth: function (e) {    
    //獲取的月份和我們想要顯示的月份相差一,所以需要做判斷  
    var chose_month = parseInt(e.detail.value) + 1 == 13 ? 1 : parseInt(e.detail.value);   
    this.setData({
      cur_month: chose_month,
    });
    //小程序修改data的數據是用setData()方法
    this.calendar(this.data.cur_year, this.data.cur_month)    

  },


  //選擇年
  chooseYear: function (e) {    //同選擇月份一樣
    var idx = e.detail.value;
    var y = this.data.yearList[idx];
    console.log(idx)
    this.setData({
      itemIndex: idx,
      cur_year: y,
    });
    this.calendar(y, this.data.cur_month);

  },
  //操作月  操作月的函數我寫成了一個,
  //也可以分開來寫,所以大家可以精簡,我這是為了讓大家看清晰~
  handleMonth: function (e) {    
    const handle = e.currentTarget.dataset.handle;
    const cur_year = this.data.cur_year;
    const cur_month = this.data.cur_month;
    const index = this.data.itemIndex;
    if (handle === 'prev') {
      let newMonth = cur_month - 1;
      let newYear = cur_year;
      let idx = index;
      if (newMonth < 0) {
        newYear = cur_year - 1;
        idx = index - 1;
        newMonth = 11;
      }

      this.calendar(newYear, newMonth);
      this.setData({
        cur_year: newYear,
        cur_month: newMonth,
        itemIndex: idx
      });

    } else {
      let newMonth = cur_month + 1;
      let newYear = cur_year;
      let idx = index;
      if (newMonth > 11) {
        newYear = cur_year + 1;
        idx = index + 1;
        newMonth = 0;
      }

      this.calendar(newYear, newMonth);
      this.setData({
        cur_year: newYear,
        cur_month: newMonth,
        itemIndex: idx
      });
    }
  }
})
小程序,小程序日歷版

如果你還有什么不清楚的,歡迎討論交流,共同進步~

原創文章,并且,這個日歷在我做的項目已經上線了,如果認為對你有幫助,求贊求關注~~~謝謝

給個小程序包,有需要的可以來下載哦

去下載源碼

歡迎訪問我的個人網站zhengyepan

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • 想要實現的效果 點擊日期選擇框出現日歷 有個日期控制欄幫助選擇日期, 包括年、月、日的選擇和今天 日歷格子,初次點...
    softbone閱讀 5,305評論 2 9
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,711評論 25 708
  • 本文發表至今已有一段時間,錯別字多、文筆混亂、內容過于陳舊。本人建議讀者不必細究,大概瀏覽即可,最新的開發指南還是...
    Oopsguy閱讀 6,249評論 2 19
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協議。它實...
    香橙柚子閱讀 24,011評論 8 183
  • 曉寧: 最近情緒很低落吧,仿佛又陷入了從前那種絕望的感覺。本來抱著極大期待的心態找到了一個新的平臺,特地更換了新的...
    邵曉寧閱讀 390評論 17 10