微信小程序日历弹框组件

参考文章:https://blogai.cn/posts/46

calendar.json

{
  "usingComponents": {},
  "disableScroll": true
}

calendar.wxml

<view class="titleDate">
  <button class="cu-btn" bindtap="lastMonth">
    <text class="cuIcon-back"><</text>
  </button>
  {{currentYear}} - {{currentMonth+1}}
  <button class="cu-btn" bindtap="nextMonth">
    <text class="cuIcon-right">></text>
  </button>
</view>

<view class="title">
  <view wx:for='{{weeks}}' wx:key='index'>{{item}}</view>
</view>
<view class="calender  {{anmation? 'animation-slide-skew':''}}">
  <view wx:for='{{monthNum+week}}' class="cal-body {{index-week+1==currentDay&&nowMonth==currentMonth&&nowYear==currentYear?'now':''}}" wx:key='index' data-day="{{index-week+1}}" bindtap="choseDay">
    <view class="{{index-week+1>0?'cal-text ':''}} {{choseDay==index-week+1&&currentMonth==choseMonth?'chose':''}}">{{index-week+1 >0?index-week+1:''}}</view>
  </view>
</view>
<view>
</view>
<picker-view wx:if='{{datePick}}' class="picker" mask-class='mask' indicator-class='indicator' bindchange="bindChange">
  <picker-view-column class='column'>
    <view wx:for='{{24}}' style="line-height:50rpx;" wx:key='index'>{{index
      <10? '0'+index:index}}</view>
  </picker-view-column>
  <picker-view-column class='column'>
    <view wx:for='{{60}}' style="line-height:50rpx;" wx:key='imdex'>{{index
      <10? '0'+index:index}}</view>
  </picker-view-column>
</picker-view>

<view>您选择的是:{{choseDate}} {{choseHours}} : {{choseMin}}</view>

<view>
  <view class="toToday" bindtap="initDay">今</view>
</view>

calendar.wxss

/* pages/sigle/calendar/calendar.wxss */

page {
  background: #fff;
}

.datePick {
  margin-top: 20rpx;
}

.indicator {
  height: 50rpx;
  width: 80%;
  margin-left: 10%;
  border-radius: 10rpx;
}

.column {
  text-align: center;
  color: cornflowerblue;
  font-weight: bold;
  font-size: 34rpx;
}

.picker {
  height: 150rpx;
  width: 80%;
  margin: 0 auto;
}

.text {
  width: 150px;
  height: 60px;
  margin-left: 20px;
}

.move {
  width: 100px;
  height: 60px;
  position: absolute;
  right: 0;
  transform: translateX(100px);
  background: rgb(245, 51, 93);
}

.calender {
  margin: 0 auto;
  width: 90%;
  height: 600rpx;
  color: rgb(68, 68, 68);
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  grid-column-gap: 20rpx;
  transition: height 1s;
}

.titleDate {
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 32rpx;
  font-weight: bold;
}

.cu-btn {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 60rpx !important;
}

.title {
  border-bottom: 4rpx solid cornflowerblue;
  font-size: 30rpx;
  font-weight: bold;
  height: 80rpx;
  line-height: 80rpx;
  text-align: center;
  margin: 0 auto;
  width: 90%;
  color: rgb(93, 98, 136);
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  grid-column-gap: 20rpx;
}

.cal-body {
  width: 80rpx;
  margin-top: 20rpx;
  font-size: 30rpx;
  font-weight: bold;
  height: 80rpx;
  text-align: center;
}

.cal-body .cal-text {
  line-height: 80rpx;
  border-bottom: 1rpx dashed rgba(100, 148, 237, 0.747);
}

.now {
  background: cornflowerblue;
  color: #fff;
  font-size: 32rpx;
  font-weight: bold;
  border-radius: 50%;
  box-shadow: 2rpx 2rpx 12rpx cornflowerblue;
}

.chose {
  background: rgb(20, 20, 20);
  color: #fff;
  font-size: 32rpx;
  font-weight: bold;
  border-radius: 14rpx;
  box-shadow: 2rpx 2rpx 12rpx rgb(122, 122, 122);
}

.toToday {
  text-align: center;
  width: 100rpx;
  height: 100rpx;
  border-radius: 50%;
  line-height: 100rpx;
  position: absolute;
  bottom: 30rpx;
  font-weight: bold;
  right: 30rpx;
  color: #fff;
  background: cornflowerblue;
  box-shadow: 2rpx 2rpx 20rpx rgba(123, 154, 211, 0.808);
}

calendar.js

const weeks = ['日', '一', '二', '三', '四', '五', '六']

function getWeelDay(year, month, day) {
  return new Date(year)
}
Page({

  /**
   * 页面的初始数据
   */
  data: {
    weeks: ['日', '一', '二', '三', '四', '五', '六'],
    datePick: false
  },
  start_(e) {
    this.setData({
      Start: e.touches[0].pageX,
      animation: false
    })
    console.log('start', this.data.Start)
  },
  move_(e) {
    let x = e.touches[0].pageX - this.data.Start
    if (x > -100 && x < 0) {
      this.setData({
        movex: x
      })
    }

    this.setData({
      show: e.touches[0].pageX - this.data.Start > 0 ? 'hide' : 'show'
    })
    console.log('move', x)
  },
  end_(e) {
    if (this.data.show == 'show') {
      this.setData({
        movex: -100,
        animation: true
      })
    } else {
      this.setData({
        movex: 0,
        animation: true
      })
    }
    // this.setData({
    //    ListTouchDirection: null
    // })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    // let date = new Date()
    // let currentYear = date.getFullYear(),
    // currentMonth = date.getMonth(),
    // currentDay = date.getDate()

    // let monthNum = new Date(currentYear,currentMonth+1,0).getDate()
    // let week = new Date(currentYear, currentMonth, 1).getDay()
    // this.setData({
    //    currentYear:currentYear,
    //    currentMonth:currentMonth,
    //    currentDay:currentDay,
    //    monthNum: monthNum,
    //    week: week,
    //    nowYear: currentYear,
    //    nowMonth: currentMonth,
    //    nowDay: currentDay
    // })
    this.initDay()

  },
  initDay() {
    //获取当前选择的年月日
    let date = new Date()
    let currentYear = date.getFullYear(),
      currentMonth = date.getMonth(),
      currentDay = date.getDate()

    //获取当年,当月的天数 getDate(),此时month+1
    let monthNum = new Date(currentYear, currentMonth + 1, 0).getDate()
    //获取该月1号是周几,注意此时month不加1
    let week = new Date(currentYear, currentMonth, 1).getDay()
    this.setData({
      currentYear: currentYear,
      currentMonth: currentMonth,
      currentDay: currentDay,
      monthNum: monthNum,
      week: week,
      nowYear: currentYear, //这里的now代表今天对应的日期,存在data中,点击回到今天时再从data中取出
      nowMonth: currentMonth,
      nowDay: currentDay
    })

  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function() {

  },
  bindChange(e) {
    console.log(e.detail.value[0], e.detail.value[1])
    this.setData({
      choseHours: e.detail.value[0],
      choseMin: e.detail.value[1]
    })
  },
  choseDay(e) {
    let index_ = e.currentTarget.dataset.day
    if (index_ > 0) {
      if (this.data.choseMonth == this.data.currentMonth && this.data.choseDay == index_) {
        this.setData({
          choseDay: '',
          choseYear: '',
          choseMonth: '',
          choseDay: '',
          datePick: false
        })
      } else {
        console.log(this.data.currentYear, this.data.currentMonth, index_)
        let choseDate = this.data.currentYear + '' + this.data.currentMonth + '' + index_
        this.setData({
          choseDate: choseDate,
          choseYear: this.data.currentYear,
          choseMonth: this.data.currentMonth,
          choseDay: index_,
          datePick: true
        })
      }

    }

  },
  lastMonth() {
    this.setData({
      anmation: true
    })
    //计算余数,除以12之后的余数便是要减的月份数
    let Remainder = this.data.currentMonth % 12;
    if (this.data.currentMonth < 1) {
      //parseInt(this.data.currentMonth / 12) 计算整数,得到的值就是要减的年
      //如果当前选择的月份是负数,需要减整数后再-1
      var currentYear = this.data.currentYear - 1 - parseInt(this.data.currentMonth / 12)
      var currentMonth = 12 - Math.abs(Remainder) - 1
    } else {
      var currentYear = this.data.currentYear + parseInt(this.data.currentMonth / 12)
      var currentMonth = Remainder - 1
    }
    let monthInt = parseInt(this.data.currentMonth / 12)

    // let currentDay = this.data.currentDay;
    let monthNum = new Date(currentYear, currentMonth + 1, 0).getDate()
    let week = new Date(currentYear, currentMonth, 1).getDay()
    this.setData({
      currentYear: currentYear,
      currentMonth: currentMonth,
      monthNum: monthNum,
      week: week
    })
    setTimeout(() => {
      this.setData({
        anmation: false
      })
    }, 1000)
    console.log(currentYear, currentMonth, week, monthNum)
  },
  nextMonth() {
    this.setData({
      anmation: true
    })
    let Remainder = (this.data.currentMonth + 1) % 12;
    if (Remainder < 0) {
      var currentYear = this.data.currentYear - 1 - parseInt(Remainder / 12)
      var currentMonth = 12 - Math.abs(Remainder)
    } else {
      console.log(Remainder)
      var currentYear = Remainder == 0 ? this.data.currentYear + 1 : this.data.currentYear + parseInt(Remainder / 12)
      var currentMonth = Remainder
    }
    let monthInt = parseInt(this.data.currentMonth / 12)

    // let currentDay = this.data.currentDay;
    let monthNum = new Date(currentYear, currentMonth + 1, 0).getDate()
    let week = new Date(currentYear, currentMonth, 1).getDay()
    this.setData({
      currentYear: currentYear,
      currentMonth: currentMonth,
      monthNum: monthNum,
      week: week
    })
    setTimeout(() => {
      this.setData({
        anmation: false
      })
    }, 1000)
    console.log(currentYear, currentMonth, week, monthNum)
  }
})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值