热门搜索 :
考研考公
您的当前位置:首页正文

vue.js的原生日历实现方法

2020-11-27 来源:桦陀教育

之前的CSDN编译器有问题,所以现在重新整理出来给大家,本文主要和大家分享vue.js的原生日历实现方法,希望能帮助到大家。

先po上效果图:

这里写图片描述

html代码:

 <script type="text/x-template" id="calendar">
 <p id="">
 <!-- 年份 月份 -->
 <p class="month">
 <ul>
 <!--点击会触发pickpre函数,重新刷新当前日期 @click(vue v-on:click缩写) -->
 <li class="arrow" @click="pickPre(currentYear,currentMonth)">?</li>
 <li class="year-month" @click="pickYear(currentYear,currentMonth)">
 <span class="choose-year">{{ currentYear }}</span>
 <span class="choose-month">{{ currentMonth }}月</span>
 </li>
 <li class="arrow" @click="pickNext(currentYear,currentMonth)">?</li>
 </ul>
 </p>
 <!-- 星期 -->
 <ul class="weekdays">
 <li>一</li>
 <li>二</li>
 <li>三</li>
 <li>四</li>
 <li>五</li>
 <li style="color:red">六</li>
 <li style="color:red">日</li>
 </ul>
 <!-- 日期 -->
 <ul class="days">
 <!-- 核心 v-for循环 每一次循环用<li>标签创建一天 -->
 <li v-for="dayobject in days">
 <!--本月-->
 <!--如果不是本月 改变类名加灰色-->

 <span v-if="dayobject.day.getMonth()+1 != currentMonth" class="other-month">{{ dayobject.day.getDate() }}</span>

 <!--如果是本月 还需要判断是不是这一天-->
 <span v-else>
 <!--今天 同年同月同日-->
 <span v-if="dayobject.day.getFullYear() == new Date().getFullYear() && dayobject.day.getMonth() == new Date().getMonth() && dayobject.day.getDate() == new Date().getDate()"
 class="active">{{ dayobject.day.getDate() }}</span>
 <span v-else>{{ dayobject.day.getDate() }}</span>
 </span>

 </li>
 </ul>
 </p>
 </script>
 <p id="app">
 <calendar></calendar>
 </p>

js代码:

 Vue.component("calendar", {
 template: "#calendar",
 data: function () {
 return {
 currentDay: 1,
 currentMonth: 1,
 currentYear: 1970,
 currentWeek: 1,
 days: [],
 }
 },
 created() { let that = this;
 that.initData(null);
 },
 methods: {
 initData: function (cur) {
 let that = this; let leftcount = 0; //存放剩余数量
 let date; if (cur) {
 date = new Date(cur);
 } else { let now = new Date(); let d = new Date(that.formatDate(now.getFullYear(), now.getMonth(), 1));
 d.setDate(35);
 date = new Date(that.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
 }
 that.currentDay = date.getDate();
 that.currentYear = date.getFullYear();
 that.currentMonth = date.getMonth() + 1;
 that.currentWeek = date.getDay(); // 1...6,0
 if (that.currentWeek == 0) {
 that.currentWeek = 7;
 } let str = that.formatDate(that.currentYear, that.currentMonth, that.currentDay);
 that.days.length = 0; // 今天是周日,放在第一行第7个位置,前面6个
 //初始化本周
 for (let i = that.currentWeek - 1; i >= 0; i--) { let d = new Date(str);
 d.setDate(d.getDate() - i); let dayobject = {}; //用一个对象包装Date对象 以便为以后预定功能添加属性
 dayobject.day = d;
 that.days.push(dayobject); //将日期放入data 中的days数组 供页面渲染使用
 } //其他周
 for (let i = 1; i <= 35 - that.currentWeek; i++) { let d = new Date(str);
 d.setDate(d.getDate() + i); let dayobject = {};
 dayobject.day = d;
 that.days.push(dayobject);
 }

 },
 pickPre: function (year, month) {
 let that = this; // setDate(0); 上月最后一天
 // setDate(-1); 上月倒数第二天
 // setDate(dx) 参数dx为 上月最后一天的前后dx天
 let d = new Date(that.formatDate(year, month, 1));
 d.setDate(0);
 that.initData(that.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
 },
 pickNext: function (year, month) {
 let that = this; let d = new Date(that.formatDate(year, month, 1));
 d.setDate(35);
 that.initData(that.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
 },
 pickYear: function (year, month) {
 alert(year + "," + month);
 }, // 返回 类似 2016-01-02 格式的字符串
 formatDate: function (year, month, day) {
 let y = year; let m = month; if (m < 10) m = "0" + m; let d = day; if (d < 10) d = "0" + d; return y + "-" + m + "-" + d
 },
 }
 }) let vm = new Vue({
 el: '#app',
 })

css代码:

* { margin: 0; padding: 0;}/*日历*/#calendar 
{ width: 98%; 
border: 2px solid #A4A7B0; 
height: 335px; 
margin-left: 0.5%;}.month 
{ width: 92%; height: 48px; 
border: 2px solid #FFFFFF; 
margin-left: 3%; margin-top: 20px;}.month ul 
{ margin: 0; padding: 0; 
display: flex; 
margin-top: 11px; 
justify-content: space-between;}.year-month 
{ flex-direction: column; 
align-items: center; 
justify-content: space-around;}.choose-year 
{ padding: 0 20px; 
font-size: 16px; 
font-weight: 200;}.choose-month 
{ text-align: center; 
font-size: 16px; 
font-weight: 200;}.arrow 
{ width: 3%; 
 height: 25px;}.arrow1 
 { background: url(left.png) no-repeat 0 0 /100% 100%; 
 margin-left: 44px;}.arrow2 
 { background: url(right.png) no-repeat 0 0 /100% 100%; 
 margin-right: 44px;}.month ul li { color: #999; 
 font-size: 20px; 
 text-transform: uppercase; 
 letter-spacing: 3px; 
 list-style: none;}.weekdays 
 { margin: 0; 
 color: #FFFFFF; 
 background: #A4A7B0; 
 width: 96.6%; 
 margin-top: 26px; 
 height: 34px; 
 line-height: 34px; 
 margin-left: 2.2%;}.weekdays li 
 { display: inline-block; 
 text-align: center; 
 color: #11616f; 
 font-size: 14px; 
 font-weight: 100; 
 width: 12.7%;}.days 
 { padding: 0; 
 margin: 0; 
 display: flex; 
 flex-wrap: wrap; 
 justify-content: space-around;}.days 
 li { list-style-type: none; 
 display: inline-block; 
 width: 14.2%; 
 text-align: center; 
 padding-bottom: 3px; 
 padding-top: 7px; 
 font-size: 12.78px; 
 color: rgb(14, 220, 235); 
 font-weight: 200;}.days li span span 
 { height: 29.5px; 
 width: 27px; 
 line-height: 29.5px; 
 display: inline-block;}.days li .class-30 
 { background: url(bg_30.png) no-repeat 0 0 /100% 100%;}.days li .class-60 
 { background: url(bg_60.png) no-repeat 0 0 /100% 100%;}.days li .class-3060 
 { background: url(bg_3060.png) no-repeat 0 0 /100% 100%;}.days li .other-month 
 { padding: 5px; color: #84a8ae;}
Top