日历组件

article/2025/8/25 6:24:36

日历组件:

在这里插入图片描述

<template><div class="calendar" @click.stop><div class="input-wrap"><inputtype="text"v-if="dateChangeSets":placeholder="placeholder"class="input dateChangeSets middle-input"@focus="foc"v-model="sel"/><input type="text" v-else class="input middle-input" @input="changees" @focus="foc" v-model="sel" /></div><div class="dp" v-show="show"><div class="dp-header"><a class="dp-h-1" @click="cy(-1)">«</a><a class="dp-h-2" @click="cm(-1)"></a><span class="dp-ym">{{y}}{{m}}</span><a class="dp-h-3" @click="cm(1)"></a><a class="dp-h-4" @click="cy(1)">»</a></div><table class="dp-table"><thead><tr><th><span></span></th><th><span></span></th><th><span></span></th><th><span></span></th><th><span></span></th><th><span></span></th><th><span></span></th></tr></thead><tbody><tr v-for="(cell, index) in data" :key="index"><tdv-for="(item, index) in cell":key="index":class="{'dp-last': m != item.month, 'dp-today': cur == item.data, 'dp-select': sel == item.data}"><span @click="addClickOn(item.data)">{{ item.day }}</span></td></tr></tbody></table><!-- <div class="dp-footer"><a @click="clickNow">{{sel}}</a>  <span class="btn btn-ok" @click="show = false">确定</span></div> --></div></div>
</template><script>
import getCalendar from './getCalendar.js'
export default {props: ['nowDate', 'dateChangeSets', 'placeholder'],model: {prop: 'nowDate',event: 'dateChange'},data () {let d = '' // 用于显示的日历let len = ('' + this.nowDate).length// 为空if (!this.nowDate || (len !== 13 && len !== 10)) {d = new Date()} else {d = len === 13 ? new Date(parseInt(this.nowDate)) : new Date(this.nowDate * 1000)}let sel = ''if (Object.prototype.toString.call(d) === '[object Date]') {// it is a dateif (isNaN(d.getTime())) { // d.valueOf() could also work// date is not validd = new Date()} else {// date is validsel = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()}} else {// not a dated = new Date()}if (!this.nowDate) {sel = ''}let curTime = new Date()let cur = '' + curTime.getFullYear() + '-' + (curTime.getMonth() + 1) + '-' + curTime.getDate() // 当前日期let y = d.getFullYear()let m = d.getMonth() + 1let data = getCalendar(d.getFullYear(), d.getMonth() + 1) // 显示的日历return {cur,sel,y,m,data,firstClick: true,show: false}},created () { },methods: {// flag === -1 月份的后退, flag === 1 月份的前进cm (flag) {// 前进后退月if (flag === -1) {if (this.m === 1) {this.addInitOn(parseInt(this.y) - 1, 12)} else {this.addInitOn(this.y, parseInt(this.m) - 1)}} else {if (this.m === 12) {this.addInitOn(parseInt(this.y) + 1, 1)} else {this.addInitOn(this.y, parseInt(this.m) + 1)}}setTimeout(() => {if (this.firstClick) {this.cm(flag)this.firstClick = falsesetTimeout(() => {this.firstClick = true}, 200)}}, 50)},cy (flag) {// 前进后退年if (flag === -1) {this.addInitOn(parseInt(this.y) - 1, this.m)} else {this.addInitOn(parseInt(this.y) + 1, this.m)}setTimeout(() => {if (this.firstClick) {this.cy(flag)this.firstClick = falsesetTimeout(() => {this.firstClick = true}, 200)}}, 50)},clickNow () {let t = new Date()let y = t.getFullYear()let m = t.getMonth() + 1// let d = t.getDate()this.addInitOn(y, m)},foc () {let self = thisthis.show = truedocument.body.onclick = function () {self.show = falsedocument.body.onclick = null}},changees () {console.log(this.sel, 'sel')this.$emit('changees', this.sel)},addInitOn (y, m) {// TODO:有时会出现13月,切换月份和学年 需要点击俩次this.$emit('init', y, m)this.$on('init', function () {this.data = getCalendar(y, m)this.y = ythis.m = m})},addClickOn (data) {this.sel = datavar ar = data.split('-')var m = ar[1]var y = ar[0]let newDate = new Date(ar[0], ar[1] - 1, ar[2]).getTime() // 更新时间戳if (m !== this.m) {this.y = ythis.m = mthis.data = getCalendar(y, m)}this.show = falsethis.$emit('dateChange', newDate)}}
}
</script><style lang="scss" scoped>
.calendar {position: relative;user-select: none;display: inline-block;
}
.input-wrap {display: inline-block;
}
ul,
li {padding: 0;margin: 0;
}.dp {width: 220px;// height: 280px;height: 250px;border: 1px solid black;box-shadow: 0 0 4px rgba(0, 0, 0, 0.17);border: 1px solid #d9d9d9;border-radius: 6px;position: absolute;top: 38px;background: #fff;z-index: 999;font-size: 12px;color: #666;
}.dp-table {width: 100%;text-align: center;border-collapse: collapse;
}
.dp-table th {padding: 6px 0;border: 0;
}
.dp-table td {padding: 4px 0;line-height: 18px;border: 0;
}
.dp-table th span {display: block;font-weight: normal;
}
.dp-table td span {display: block;width: 23px;height: 23px;line-height: 23px;border: 1px solid transparent;margin: 0 auto;transition: background 0.3s ease;border-radius: 4px;padding: 0;box-sizing: border-box;
}
.dp-table td span:hover {background: #fcf2e9;cursor: pointer;
}.dp-table .dp-last span {color: #ccc;
}.dp-table .dp-today span {border-color: #f5bb50;font-weight: bold;color: #f5bb50;
}.dp-table .dp-select span {background: #f5bb50;color: #fff;border: 1px solid transparent;
}
.dp-table .dp-select span:hover {background: #f5bb50;
}.dp-header {position: relative;text-align: center;height: 34px;line-height: 34px;text-align: center;border-bottom: 1px solid #e9e9e9;
}
.dp-header .dp-ym {font-weight: bold;
}
.dp-header a {color: #999;line-height: 34px;height: 34px;font-size: 24px;display: inline-block;padding: 0 5px;position: absolute;
}
.dp-header a:hover {color: #2db7f5;cursor: pointer;
}
.dp-header .dp-h-1 {left: 7px;
}
.dp-header .dp-h-2 {left: 29px;
}
.dp-header .dp-h-3 {right: 29px;
}
.dp-header .dp-h-4 {right: 7px;
}.dp-footer {height: 34px;border-top: 1px solid #e9e9e9;text-align: center;position: relative;
}
.dp-footer a {display: inline-block;line-height: 34px;height: 34px;cursor: pointer;
}
.dp-footer span {position: absolute;right: 16px;top: 7px;
}
.dp .btn {display: inline-block;text-align: center;vertical-align: middle;cursor: pointer;border: 1px solid #d9d9d9;white-space: nowrap;line-height: 1.5;padding: 1px 6px;font-size: 12px;border-radius: 6px;background-color: #f4f4f4;outline: 0;opacity: 1;color: #fff;background-color: #2db7f5;
}
.dateChangeSets {font-size: 14px !important;font-family: PingFangTC-Regular, PingFangTC !important;font-weight: 400 !important;color: #d6d6d6 !important;
}
</style>

getCalendar.js文件

function getCalendar (y, m) {// 输出一个日历数据源  月份不必减1y = parseInt(y)m = parseInt(m)let time = new Date(y, m - 1, 1)let lastDatelet nextDatelet lastMonth = m - 1let nextMonth = m + 1if (m === 1) {lastDate = '' + (y - 1) + '-' + 12 + '-'nextDate = '' + y + '-' + 2 + '-'lastMonth = 12} else if (m === 12) {lastDate = '' + y + '-' + 11 + '-'nextDate = '' + (y + 1) + '-' + 1 + '-'nextMonth = 1} else {lastDate = '' + y + '-' + (m - 1) + '-'nextDate = '' + y + '-' + (m + 1) + '-'}let maxNumber = 42let r1 = []let r2 = []let r3 = []// 日 ~ 一let lastFix = time.getDay()/*** 格式 一 ~ 日 写法:*  let lastFix = time.getDay() - 1*  lastFix = lastFix < 0 ? lastFix + 7 : lastFix**/let lastMaxDate = new Date(y, m - 1, 0).getDate() // 上个月份最大天数let maxDate = new Date(y, m, 0).getDate() // 当前月份的let i, t// 统计上个月显示天数for (i = 0; i < lastFix; i++) {t = lastMaxDate - lastFix + i + 1r1[i] = { month: lastMonth, day: t, data: lastDate + t }}// 统计这个月显示天数for (i = 0; i < maxDate; i++) {t = i + 1r2[i] = { month: m, day: t, data: '' + y + '-' + m + '-' + t }}// 统计下个月显示天数let nextFix = maxNumber - maxDate - lastFixfor (i = 0; i < nextFix; i++) {t = i + 1r3[i] = { month: nextMonth, day: t, data: nextDate + t }}let result = r1.concat(r2, r3)let ar = []for (i = 0; i < 6; i++) {ar.push(result.splice(0, 7))}return ar
}export default getCalendar

index.js文件,全局注册

import Calendar from './Calendar.vue'const theCalendar = {install: function (Vue) {Vue.component('Calendar', Calendar)}
}
export default theCalendar

全局注册组件(main.js文件中):

import Calendar from './components/common/calendar'
...
Vue.use(Calendar)

使用(无需引用直接使用):

        <Calendarclass="date_choose":nowDate="new Date()"@dateChange="dateChange"></Calendar>

http://chatgpt.dhexx.cn/article/8BSxqlPX.shtml

相关文章

vue-calendar基于vue的日历插件

本文转载于https://www.cnblogs.com/zwhgithub/p/8005414.html vue-calendar-component 基于 vue 2.0 开发的轻量&#xff0c;高性能日历组件占用内存小&#xff0c;性能好&#xff0c;样式好看&#xff0c;可扩展性强原生 js 开发&#xff0c;没引入第三方库 效果 Install …

实用插件(一)日历插件——My97DatePicker

注&#xff1a;My97DatePicker插件仅限pc端使用&#xff0c;若是app项目&#xff0c;建议使用ICalendar或者Mobiscroll。 &#xff08;ICalendar插件在华为手机上存在兼容性问题&#xff0c;日期不能滚动&#xff0c;但使用很简单&#xff1b;Mobiscroll使用起来较为复杂&…

sys-calendar.js带节假日的日历插件

下载地址 sys-calendar.js带节假日的日历插件&#xff0c;代码引用比较多。 dd:

jquery日历插件,可自定义日期内容

效果图&#xff1a; 使用&#xff1a; <link href"static/css/raoCalendar.css" rel"stylesheet" type"text/css"><script src"static/js/jquery.min.js"></script> <script src"static/js/raoCalendar.js…

两款超好用js日历插件(fullcalendar和zabuto_calendar)

这两款插件特别类似,其实用其中一款即可。 先展示一下我用这两款插件制作的排班系统 这个是fullcalendar插件制作的排班页面,左边新建一系列组和组员,可以将人员直接拖拽至右边的日历上,不同组以颜色区别。 这个是将上面的排班内容用zabuto_calendar插件显示出来,黄色区域…

BootStrap日历插件

BootStrap日历插件 前端引入插件三大步骤 引入插件所需的资源文件 <%--引入BootStrap日历插件相关资源文件--%><%--按照资源文件相互依赖的顺序来引入--%><script type"text/javascript" src"jquery/jquery-1.11.1-min.js"></scrip…

jQuery实现移动端手机选择日期日历插件

效果图 calendar.css html, body {color: #333;margin: 0;height: 100%;font-family: "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;font-weig…

uniapp日历插件

日历插件 效果图一、使用方法二、组件编写&#xff0c;两个文件、直接上代码month.vuecalendar.vue 效果图 一、使用方法 <template><view><view class"" click"open"><text>展示日历{{value[0]}}-{{value[1]}}</text><…

calendar.js多种形式日历插件

下载地址 calendar.js是一款强大的日历插件&#xff0c;有多种形式的日历插件&#xff0c;比如&#xff0c;选择年、选择月、范围等。 dd:

日历插件:bootstrap-datetimepicker

1. 简述 前端插件使用步骤&#xff1a; 1)引入开发包&#xff1a;.js,.css 下载开发包&#xff0c;拷贝到项目webapp目录下 把开发包引入到jsp文件中&#xff1a;<link><script> 2)创建容器&#xff1a;<input type"text"…

最棒的 10 款 jQuery 日历插件

RT&#xff0c; 最棒的 10 款 jQuery 日历插件 做个记号&#xff0c;以后就不用再翻来翻去 1、JavaScript Calendar, JSCal2 地址&#xff1a;点击打开链接 2、Date Picker 地址&#xff1a;点击打开链接 3、 jQuery Frontier Calendar 地址&#xff1a;点击打开链接…

vue日历插件vue-calendar

原始效果&#xff1a; 修改后的效果&#xff1a; 接下来&#xff0c;我们使用它&#xff5e; 1.安装 npm i vue-calendar-component --save cnpm i vue-calendar-component --save //国内镜像 2.在使用到日历插件的文件中引入 import Calendar from vue-calendar-componen…

使用JS实现简单的日历插件

实现简单的日历插件 一、简要介绍二、基础代码html部分js部分 一、简要介绍 实现一个如下图所示的日历&#xff0c;这边主要提供html部分和js部分的代码&#xff0c;css部分大家自行编写哦。 二、基础代码 html部分 其实就是一个div容器&#xff0c;为其设置相应的id值。 <…

FullCalendar - 开源的多功能 JavaScript 日历插件

本文字数&#xff1a;747 字 9图 阅读完需&#xff1a;约 4 分钟 点击上方“青年码农”关注 回复“源码”可获取各种资料 FullCalendar 是一个支持 React、Vue、Angular 和原生 JavaScript 的日历插件&#xff0c;FullCalendar 拥有超过 300 种设置&#xff0c;支持模块化导入&…

HTML页面日历插件

web页面显示日历插件。如下图 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>body,td,.p1,.p2,.i {font-family: arial}body {margin: 6px 0 0 0;background-color: #fff;color: #000;}tab…

js日历插件

日历插件&#xff1a;bootstraprap-datetimepicker 前端插件使用步骤&#xff1a; 1.引入开发包&#xff1a; js css 文件 下载开发包&#xff0c;拷贝到项目webapp目录下 把开发包引入到jsp文件中&#xff1a; <link rel"stylesheet" type"text/css&qu…

超好用的js 日历插件 日期插件 日期日历选择控件

前情提要&#xff1a; 主要是目前项目较小&#xff0c;仅需要一个日历插件&#xff0c;就没有选择引用UI框架&#xff0c;单纯找了一个日历插件&#xff0c;外观相对简单大方&#xff0c;还不错&#xff0c;而且只需要2步就可以完成引入&#xff1a; 第一步&#xff08;有2种方…

微信小程序日历插件用法-举例为(爸妈搜日历)

一、添加插件 在小程序管理后台添加插件。 小程序管理后台地址&#xff1a;https://mp.weixin.qq.com/ 设置>第三方设置>插件管理 添加插件&#xff0c;可以直接搜索名称(爸妈搜日历)或者AppID(wx23a9cef3522e4f7c) 二、在小程序app.json文件中引入插件声明 "plugi…

前端ui组件(1):日程排班—11个优秀JavaScript 日历插件

日历是我们生活中重要的一部分。在当今世界,人们大多使用网络或移动日历。它们随处可见,包括在各种软件中:预订应用、旅行软件、项目管理、管理面板等。 出于多种原因,用户可能需要在网站上使用日历。用户需要容果从日历中选择日期来填写表格,或者在填写某些信息时提供日…

好用的日历插件(三款常用的日历插件)

1、laydate https://www.layui.com/laydate/ 全面重写的 layDate 包含了大量的更新&#xff0c;其中主要以&#xff1a;年选择器、年月选择器、日期选择器、时间选择器、日期时间选择器 五种类型的选择方式为基本核心&#xff0c;并且均支持范围选择&#xff08;即双控件&…