教你用Js实现日历功能(附代码示例)
2995
这表文章教你如何使用Js实现日历功能,其中使用到了一个日期处理类库 moment.js,总体来说还是值得学习一下的~~
示例代码
- <template>
- <div id="calendar">
- <!-- 年份 月份 -->
- <div class="month">
- <ul>
- <!--点击会触发pickpre函数,重新刷新当前日期 @click(vue v-on:click缩写) -->
- <li
- class="arrow hands el-icon-arrow-left"
- @click="pickPre(currentYear, currentMonth)"
- ></li>
- <li class="year-month">
- <span class="choose-year">{{ currentYear }}年</span>
- <span class="choose-month">{{ currentMonth }}月</span>
- </li>
- <li
- class="arrow hands el-icon-arrow-right"
- @click="pickNext(currentYear, currentMonth)"
- ></li>
- </ul>
- </div>
- <!-- 星期 -->
- <ul class="weekdays">
- <li>日</li>
- <li>一</li>
- <li>二</li>
- <li>三</li>
- <li>四</li>
- <li>五</li>
- <li>六</li>
- </ul>
- <!-- 日期 -->
- <ul class="days">
- <!-- 核心 v-for循环 每一次循环用<li>标签创建一天 -->
- <li v-for="(dayobject, i) in days" :key="i">
- <!--本月-->
- <!--如果不是本月 改变类名加灰色-->
- <span
- v-if="dayobject.day.getMonth() + 1 != currentMonth"
- class="other-month"
- @click="getDayTime(dayobject.day)"
- >
- {{ 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="newDate == newsss ? 'active' : ''"
- @click="getDayTime(dayobject.day, i)"
- >
- {{ dayobject.day.getDate() }}
- </span>
- <span
- v-else
- @click="getDayTime(dayobject.day, i)"
- :class="newDate == dayobject.day ? 'active' : ''"
- >
- {{ dayobject.day.getDate() }}
- </span>
- </span>
- </li>
- </ul>
- </div>
- </template>
- <script>
- export default {
- data() {
- return {
- currentDay: 1,
- currentMonth: 1,
- currentYear: 2021,
- currentWeek: 1,
- days: [],
- newDate: this.$formatDateYMD(new Date()),
- newsss: this.$formatDateYMD(new Date()),
- };
- },
- created: function () {
- // 在vue初始化时调用
- this.initData(null);
- },
- methods: {
- initData: function (cur) {
- // var leftcount = 0 // 存放剩余数量
- var date;
- if (cur) {
- date = new Date(cur);
- } else {
- var now = new Date();
- var d = new Date(this.formatDate(now.getFullYear(), now.getMonth(), 1));
- d.setDate(35);
- date = new Date(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
- }
- this.currentDay = date.getDate();
- this.currentYear = date.getFullYear();
- this.currentMonth = date.getMonth() + 1;
- this.currentWeek = date.getDay(); // 1...6,0
- if (this.currentWeek === 0) {
- this.currentWeek = 7;
- }
- var str = this.formatDate(this.currentYear, this.currentMonth, this.currentDay);
- this.days.length = 0;
- // 今天是周日,放在第一行第7个位置,前面6个
- // 初始化本周
- for (var i = this.currentWeek; i >= 0; i--) {
- var d2 = new Date(str);
- d2.setDate(d2.getDate() - i);
- var dayobjectSelf = {}; // 用一个对象包装Date对象 以便为以后预定功能添加属性
- dayobjectSelf.day = d2;
- this.days.push(dayobjectSelf); // 将日期放入data 中的days数组 供页面渲染使用
- }
- // 其他周
- for (var j = 1; j <= 35 - this.currentWeek; j++) {
- var d3 = new Date(str);
- d3.setDate(d3.getDate() + j);
- var dayobjectOther = {};
- dayobjectOther.day = d3;
- this.days.push(dayobjectOther);
- }
- },
- getDayTime(el, index) {
- this.newDate = el;
- console.log(el)
- },
- pickPre: function (year, month) {
- // setDate(0); 上月最后一天
- // setDate(-1); 上月倒数第二天
- // setDate(dx) 参数dx为 上月最后一天的前后dx天
- var d = new Date(this.formatDate(year, month, 1));
- d.setDate(0);
- this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
- },
- pickNext: function (year, month) {
- var d = new Date(this.formatDate(year, month, 1));
- d.setDate(35);
- this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
- },
- // 返回 类似 2022-05-17 格式的字符串
- formatDate: function (year, month, day) {
- var y = year;
- var m = month;
- if (m < 10) m = "0" + m;
- var d = day;
- if (d < 10) d = "0" + d;
- return y + "-" + m + "-" + d;
- },
- },
- };
- </script>
- <style>
- #calendar {
- font-size: 12px;
- width: 100%;
- margin: 0 auto;
- background: #ecf6ff;
- }
- .month {
- width: 100%;
- color: #333333;
- }
- .month ul {
- margin: 0;
- padding: 0;
- display: flex;
- justify-content: space-between;
- height: 35px;
- }
- .year-month {
- display: flex;
- align-items: center;
- justify-content: space-around;
- margin-top: 10px;
- }
- .choose-month {
- text-align: center;
- font-size: 12px;
- }
- .arrow {
- padding: 15px;
- color: #999999;
- }
- .month ul li {
- font-size: 12px;
- text-transform: uppercase;
- letter-spacing: 3px;
- }
- .weekdays {
- margin: 0;
- padding: 10px;
- display: flex;
- flex-wrap: wrap;
- color: #999;
- justify-content: space-around;
- }
- .weekdays li {
- display: inline-block;
- width: 13.6%;
- text-align: center;
- }
- .days {
- padding: 10px;
- margin: 0;
- display: flex;
- flex-wrap: wrap;
- }
- .days li {
- list-style-type: none;
- display: inline-block;
- width: 14.2%;
- text-align: center;
- padding-bottom: 4px;
- padding-top: 10px;
- font-size: 12px;
- color: #000;
- }
- .days li .active {
- padding: 6px 10px;
- border-radius: 50%;
- background: #00b8ec;
- color: #fff;
- }
- .days li .other-month {
- padding: 5px;
- color: gainsboro;
- }
- .days li:hover > span > span {
- padding: 6px 10px;
- border-radius: 50%;
- background: #00b8ec;
- color: #fff;
- cursor: pointer;
- }
- </style>
注意:在运行过程中可能会出现一点小问题,这里我用到了一个日期处理类库 moment.js,如需安装请执行以下命令安装moment.js插件,在main.js 全局配置。
- npm install moment --save
main.js
- import Vue from 'vue'
- import Moment from 'moment';
- Vue.prototype.$Moment = Moment;
- Vue.prototype.$formatDateYMD = function(date) {
- return Moment(date).format('YYYY-MM-DD')
- }
本文网址:https://www.zztuku.com/index.php/detail-12916.html
站长图库 - 教你用Js实现日历功能(附代码示例)
申明:本文转载于《CSDN》,如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!