位置: IT常识 - 正文

vue自定义日历小组件(vue自定义日历组件)

编辑:rootadmin
vue自定义日历小组件 vue自定义小日历组件一、前言

推荐整理分享vue自定义日历小组件(vue自定义日历组件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue日历组件如何显示节日,vue做日历,vue日历组件如何显示节日,vue日程日历插件,vue实现一个炫酷的日历组件,vue日历组件如何显示节日,vue日历组件如何显示节日,vue做日历,内容如对您有帮助,希望把文章链接给更多的朋友!

自己开发的项目需要用到类似博客侧边栏小日历组件,觉得自己造一个比较随心所欲,更能满足自己的需求,所以决定自己开发一个。最终效果如图所示。

二、日历样式

我的这个日历组件主要分为导航栏区和主要内容区,导航栏按钮样式什么的都是自定义的,很简单,源码有就不罗嗦。主要讲一下日历内容的样式设计。

日历内容都是用<ul>和<li>标签实现的,星期栏和日期栏分别为独立的<ul>,内容为<li>,两个<ul>均采用网格布局,星期栏1行7列,日期内容为6行7列,在css样式中设置display为grid,再分别设置行列属性,<li>会自动排布为设定的样式,这里前提是每个<li>要设置为inline-block排布。

关于grid布局可以参考这篇文章:CSS Grid 网格布局教程 - 阮一峰的网络日志 (ruanyifeng.com) 这篇博客讲得非常好。

template示例(完整版见末尾链接下载):

<div id="app"> <div class="calendar-card"> <div class="calendar-bar"> <button class="button button-year-minus">&lt;</button> <button class="button button-month-minus">&lt;</button> <div class="calendar-date">{{date.year}}-{{date.month}}-{{date.date}}</div> <button class="button button-month-plus">&gt;</button> <button class="button button-year-plus">&gt;</button> </div> <div class="calendar-content"> <ul class="ul-week"> <li class="li-week" v-for="item in week">{{item}}</li> </ul> <ul class="ul-day"> <li class="li-day" v-for="item in days">{{item}}</li> </ul> </div> </div> </div>

js代码:

var vm = new Vue({ el:"#app", data:{ date:{ year:2022, month:5, date:11 }, week:["日","一","二","三","四","五","六"], days:[]//用来绑定日期的数组 }, created(){ for(let i=0;i<42;i++){ //生成日期数组(示范) this.days.push(i) } } })

css样式:

.ul-week { display: grid; width: 245px; grid-template-rows: 20px;/*一个值只有一行20px高*/ grid-template-columns: repeat(7, 35px);/*重复7个值代表7列35px宽*/ list-style: none;/*记得清除ul的li标签的·样式*/ text-align: center; font-size: 13px; color: #aaa; margin: 5px 20px 5px 20px; padding-inline-start: 0px;/*清除ul多余样式*/ padding-inline-end: 0px;/*清除ul多余样式*/ border-bottom: 1px solid #eee;/*分隔线*/}.li-week { display: inline-block;/*li标签设为行内排列*/}/*日期内容样式注释参照上面的自己理解*/.ul-day { display: grid; width: 245px; grid-template-rows: repeat(6, 22px);/*6行22px高*/ grid-template-columns: repeat(7, 35px);/*7列35px宽*/ list-style: none; text-align: center; margin: 5px 20px 5px 20px; padding-inline-start: 0px; padding-inline-end: 0px;}.li-day { display: inline-block;/*必须设置为行内排布,否则为列排布,日期是竖着显示,虽然再grid布局下看上去一样*/ font-size: 10px; line-height: 22px; text-align: center; border-radius: 5px; margin: 1px;}三、日历实现1.实现显示当月日历

创建两个data的对象:date和current,date用来存放需要切换的日期,current用来存放今天的年月日

date: { year: "", month: "", date: ""},current: { year: "", month: "", date: "",}

我们前面用days:[]绑定了日期的<li>,总共有6x7=42个<li>,所以每月只要生成对应的包含42个日期元素的days数组,就能够自动更新日历。先不考虑按钮切换年月,先实现本月日历的生成。我们前面讨论的其本质就是生成当月的42元素数组days,下面给出的就是实现的代码,注释会介绍:

/** * 根据参数year和month生成对应年月的日历数组 */createCalendar: function (year, month) { let d = new Date(); //获得date对象 d.setFullYear(year); //设置date为制定年份 d.setMonth(month); //设置date为制定月份(0~11) d.setDate(1); //设置为本月第一天,为了是下面计算第一天是星期几 let dayOfFirstDay = d.getDay(); //获得对应月份第一天是星期几(0~6) this.days = [] //每次生成日历清空日期数组 //向days数组填充每一个日期,包括上个与的末尾和下个月的开头总共42个日期 /** *如何获得上个月末尾和下个月开头? *date对象可以设置年月日,其中设置每月几号为setDate(day) day一般为(1~31) *当day为0时,date设置的日期是上个月最后一天 *当day为-1时,date设置的日期是上个月的倒数第二天,以此类推 *当day设置超过当月天数时,比如三月的32,则会被设置为四月第一天 *所以循环42次,每次设置对应的day,就可以生成完整日期数组,包括上月尾巴和下月的开头 */ for (let i = 0; i < 42; i++) { //每次循环重新设置为每月开头第一天,否则每次循环像本月只有28天,上轮循环到31,切换月份到本月的时候31超过28,date对象的month会被设置为下个月 d.setDate(1); //每次循环重新设置月份,因为setDate()为负数或这超过本月天数,date对象的month会被设置成上个月或下个月,然后在下一轮循环就会出错 d.setMonth(month) d.setDate(i - dayOfFirstDay + 1) //设置本轮循环对应的day,dayOfFirstDay为本月第一天的星期,本月第一天之前的day小于1,也就是0或者负数,需要减去dayOfFirstDay差+1,这里自己体会 if (this.current.date == d.getDate() && this.current.month == d.getMonth() && this.current.year == d.getFullYear()) { //此为判断本次循环是否为当天,当天日期可以做标记以高亮显示,如加上“*”号 this.days.push(d.getDate()+"*") //往数组里push本次循环的日期 } else { this.days.push(d.getDate()) //往数组里push本次循环的日期 } }}

为了在生成日历组件的同时初始化日历,所以需要在create()中做初始化处理

created() { let d = new Date(); //初始化标题显示的年月日 this.date.year = d.getFullYear(); this.date.month = d.getMonth(); this.date.date = d.getDate(); //初始化今天的年月日 this.current.year = d.getFullYear(); this.current.month = d.getMonth(); this.current.date = d.getDate(); //调用createCalendar()生成本月的日历 this.createCalendar(this.current.year,this.current.month)}

最后的效果如下:

vue自定义日历小组件(vue自定义日历组件)

2. 区分本月和其他月

上月末尾日期和下月开头日期与本月日期混在一起,需要做一些样式处理。我们将days数组从原先的存放day数字,改为存放date对象,{year:"2022",month:"5",date:"11",isThisMonth:false},存放年月日,其中isThisMonth

为该日期是否是本月的标记,”1“为非本月,”2“为本月。然后通过css选择器属性来实现。

在createCalendar()中改成如下代码:

createCalendar: function (year, month) { let d = new Date(); d.setFullYear(year); d.setMonth(month); d.setDate(1); let dayOfFirstDay = d.getDay(); this.days = [] for (let i = 0; i < 42; i++) { d.setDate(1); d.setMonth(month) d.setDate(i - dayOfFirstDay + 1) //判断是否为本月并添加标记 let isThisMonth = 2 if (d.getMonth() == month) { isThisMonth = 2 } else { isThisMonth = 1 } if (this.current.date == d.getDate() && this.current.month == d.getMonth() && this.current.year == d.getFullYear()) { isThisMonth = 3 //改为对象 let date = { year: year, month: month, date: d.getDate(), isThisMonth: isThisMonth } this.days.push(date) } else { //改为对象 let date = { year: d.getFullYear(), month: d.getMonth(), date: d.getDate(), isThisMonth: isThisMonth } this.days.push(date) }

css运用选择器属性:

.li-day[isThisMonth="1"] { /*非本月的本月样式*/ color: rgb(190, 190, 190); font-size: 10px;}.li-day[isThisMonth="1"]:hover {/*非本月的本月样式hover*/ background-color: #717de2; color: #fff; font-size: 15px; cursor: pointer;}

对应标签改为:

<ul class="ul-day"> <li class="li-day" v-for="item in days" :isThisMonth="item.isThisMonth">{{item.date}}</li></ul>

即可以实现如下的效果:

3.高亮今天的日期

我们在2的基础上,在isThisMonth判断上再加一个值3,如果当前day是今天,则标记为”3“。在createCalendar()判断是否为今天的代码修改为如下(可以把丑陋的"*"去掉了):

if (this.current.date == d.getDate() && this.current.month == d.getMonth() && this.current.year == d.getFullYear()) { //标志为3代表是今天 isThisMonth=3 let date = { year: year, month: month, date: d.getDate(), isThisMonth: isThisMonth } this.days.push(date) }

css样式里添加如下代码:

.li-day[isThisMonth="3"] { border-radius: 5px; color: rgb(255, 255, 255); background-color: #79bbff; font-weight: 600; }

则实现了今天的日期高亮的效果:

4.实现切换年月从而切换日历

给button绑定事件,本质就是修改data中的date.year和date.month,并且每次修改年月都要调用createCalendar()重新更新日历。代码如下,其中的逻辑很简单,看下代码就懂的:

plusMonth: function () { if (this.date.month == 11) { this.date.month = 0; this.plusYear(false) //切换月份超过当年范围会导致年份增减,但是直接调用增减年份的函数会导致日历重复更新,所以在增减年份的函数中添加标志位,flase则不更新日历 } else { this.date.month++; } this.createCalendar(this.date.year, this.date.month);},minusMonth: function () { if (this.date.month == 0) { this.date.month = 11; this.minusYear(false) //切换月份超过当年范围会导致年份增减 } else { this.date.month--; } this.createCalendar(this.date.year, this.date.month);},plusYear: function (create) { //freate为flase则不更新日历 if (this.date.year == 2049) { this.date.year = 1970; } else { this.date.year++; } if (create) { this.createCalendar(this.date.year, this.date.month); }},minusYear: function (create) { if (this.date.year == 1970) { this.date.year = 2049; } else { this.date.year--; } if (create) { this.createCalendar(this.date.year, this.date.month); }}

给每个按钮绑定

<button class="button button-year-minus" @click="minusYear">&lt;</button><button class="button button-month-minus" @click="minusMonth">&lt;</button><div class="calendar-date">{{date.year}}-{{date.month+1}}-{{date.date}}</div><button class="button button-month-plus" @click="plusMonth">&gt;</button><button class="button button-year-plus" @click="plusYear">&gt;</button>四、高级功能

给每个日期<li>点击事件@click,绑定handleClick()方法

<ul class="ul-day"> <li class="li-day" v-for="item in days" :isThisMonth="item.isThisMonth" @click="handleClick(item)">{{item.date}}</li></ul>

添加handleClick()方法:

handleClick: function (item) { console.log(item.year + "-" + item.month + "-" + item.date) alert(item.year + "-" + item.month + "-" + item.date) }

后续可以在handleClick()方法中定制自己的处理,例如点击某天实现某些页面的路由等等,可以将改天的年月日作为参数进行请求,实现DatePicker功能。

五、源码下载

所有源码可以在github https://github.com/PengQitao/gram-simple-calendar.git中下载,如果喜欢记得给个⭐star哦

本文链接地址:https://www.jiuchutong.com/zhishi/292393.html 转载请保留说明!

上一篇:在windows server 2016安装Web服务器(IIS)(在Windowsserver2019环境下,配置IP地址使用)

下一篇:Vue项目部署上线全过程(保姆级教程)(vue项目部署上线 需要做哪些准备)

  • wps自动保存时间设置在哪里(怎么设置wps自动保存时间)

    wps自动保存时间设置在哪里(怎么设置wps自动保存时间)

  • 抖音退款显示退款成功钱到哪里了(抖音退款显示退款到抖音月付怎么提现)

    抖音退款显示退款成功钱到哪里了(抖音退款显示退款到抖音月付怎么提现)

  • win11怎么隐藏桌面图标(win11怎么隐藏桌面应用图标)

    win11怎么隐藏桌面图标(win11怎么隐藏桌面应用图标)

  • 微信怎么开通大额红包(微信怎么开通大额支付功能)

    微信怎么开通大额红包(微信怎么开通大额支付功能)

  • 华为nova7怎么设置返回键(华为nova7怎么设置闹钟铃声)

    华为nova7怎么设置返回键(华为nova7怎么设置闹钟铃声)

  • 打开查找对话框的快捷键是(打开查找对话框一点就闪退)

    打开查找对话框的快捷键是(打开查找对话框一点就闪退)

  • 为什么键盘有的字母没反应(为什么键盘有的字母打不出来)

    为什么键盘有的字母没反应(为什么键盘有的字母打不出来)

  • QQ怎样退群不被管理员看见(qq怎样退群不被管理员发现)

    QQ怎样退群不被管理员看见(qq怎样退群不被管理员发现)

  • 拼多多实物兑换怎么兑不了(拼多多实物兑换明日0点再来是什么意思)

    拼多多实物兑换怎么兑不了(拼多多实物兑换明日0点再来是什么意思)

  • 路由器ipv6是什么意思(路由器ipv6啥意思)

    路由器ipv6是什么意思(路由器ipv6啥意思)

  • 图形驱动程序有用么(图形驱动程序有哪些)

    图形驱动程序有用么(图形驱动程序有哪些)

  • c20空开适合多少w电器(c20空开能带多大功率)

    c20空开适合多少w电器(c20空开能带多大功率)

  • dps格式的文件怎么打开(dps格式文件怎么打开)

    dps格式的文件怎么打开(dps格式文件怎么打开)

  • airpods怎么给耳机充电(airpods怎么给耳机盒充电)

    airpods怎么给耳机充电(airpods怎么给耳机盒充电)

  • 域名总长度不能超过多少(域名总长度不能为负数吗)

    域名总长度不能超过多少(域名总长度不能为负数吗)

  • 天猫极速退款额度在哪里看(天猫已经极速退款了还能撤销退款申请吗)

    天猫极速退款额度在哪里看(天猫已经极速退款了还能撤销退款申请吗)

  • 麦克风出错了什么原因(麦克风出错怎么办)

    麦克风出错了什么原因(麦克风出错怎么办)

  • 苹果8plus128g是什么基带(iphone8plus128g够用吗)

    苹果8plus128g是什么基带(iphone8plus128g够用吗)

  • vivo手机照片删除找回(vivo手机照片删除后怎样彻底删除)

    vivo手机照片删除找回(vivo手机照片删除后怎样彻底删除)

  • 京东怎么加好友啊(京东怎么加好友帮忙还款)

    京东怎么加好友啊(京东怎么加好友帮忙还款)

  • set协议的交易流程(简述set协议的基本交易流程)

    set协议的交易流程(简述set协议的基本交易流程)

  • 快手上的黄钻有什么用(快手的黄钻有啥用)

    快手上的黄钻有什么用(快手的黄钻有啥用)

  • 桌面应用程序图标不见了(桌面应用程序图标变成浏览器)

    桌面应用程序图标不见了(桌面应用程序图标变成浏览器)

  • 探探不打开也会活跃吗(探探打开不滑会有活跃记录吗)

    探探不打开也会活跃吗(探探打开不滑会有活跃记录吗)

  • word在电脑哪里找到(电脑word在哪?)

    word在电脑哪里找到(电脑word在哪?)

  • Intmonp.exe是一种什么样的进程 是病毒吗 Intmonp进程注解(intempt)

    Intmonp.exe是一种什么样的进程 是病毒吗 Intmonp进程注解(intempt)

  • 工业企业应缴纳的税金有哪些
  • 营运资产周转次数平均值
  • 用友项目核算科目的项目不能为空
  • 付款申请单是原单据吗
  • 汽车租赁服务开发票税率
  • 抵扣白条账单是怎么回事
  • 微企怎么申请补贴
  • 暂估发票一直未收回
  • 普通发票辨别真伪
  • 应交税费怎么做分录
  • 行业协会的作用定位
  • 应付账款暂估会计处理
  • 年末要计提所得税分录
  • 没有单价数量只有金额的发票可以用吗
  • 企业所得税如何申报操作
  • 股息红利个人所得税扣税失败
  • 固定资产丢失收入怎么办
  • 代扣代缴的增值税怎么做账
  • 咨询费 税
  • 营改增的真实目的
  • 个税前几个月没有工资,累计减除费用会累计吗
  • 自己是公司法人可以给自己发工资吗
  • 13个点的税怎么算税金
  • 购进货物赠送客户增值税处理
  • 设备安装服务几个点
  • 清除文件夹exe病毒工具
  • mac清理垃圾怎么清理
  • pop是什么文件
  • linux标准文件和链接文件
  • 企业税计算方法
  • uniapp怎么运行到手机模拟器
  • 融资租赁综合利息计算
  • php执行linux脚本
  • 会计中持有至到期投资是什么意思
  • java前端开发是做什么的
  • 事业结余是事业单位当年全部收支相抵后的余额
  • 个体工商户可以给自己交社保吗
  • 赠送油卡怎么使用
  • 银行收付款凭证是什么
  • 视同销售的增值税怎么申报
  • 税控服务费减免会计分录
  • 工会筹备金和工会经费滞纳金计算一样吗
  • 什么各级工会的离休退休人员的待遇
  • 外商投资的企业有哪些
  • 商品购进核算
  • 差旅费会计科目怎么做
  • 主营业务成本包括工资吗
  • 建筑业暂估成本票来了后的账务处理
  • 应付暂估会计处理
  • 固定资产领用原因
  • 开具红字发票的当月就要进项税额转出吗?
  • 印花税征税对象包括
  • 开来发票没有付款可以进入费用吗?
  • 股息红利等权益性投资收益
  • Mysql执行sql文件
  • 批量修改 sql
  • mysql分页实现
  • windowmsgserver32是什么
  • dos下运行安装文件
  • linux 修复系统
  • ubuntu系统键盘无用
  • linux系统变卡慢了
  • windows8ip地址怎么设置
  • node. js教程
  • Metaio in Unity3d 教程--- 二. 创建自己的Application
  • css网站布局实录 pdf
  • cocos2dx-3.x(三)、场景切换及可能产生的错误
  • ug语法错误
  • error C2258: illegal pure syntax, must be '= 0'
  • js实现计时器在线时间
  • linux常用shell命令
  • unity动画教程
  • Android 5.1 API 22 所有sdk文件下载地址
  • 常用的javascript对象
  • 广告费扣除限额15%和30%
  • 建筑工程提前投入使用
  • 纳税人的种类包括
  • 烟叶税计税依据是收购烟叶实际支付的价款总额
  • 专票清单用什么纸打印
  • 餐饮业财务主管工作总结
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设