js实现日历 完整版

<template><div id="calendar"><!-- 年份 月份 --><div class="title"><div class="label">活动日历</div><div class="total">当前活动 {{ list.length }}</div></div><div class="content"><ul class="month"><!--点击会触发pickpre函数,重新刷新当前日期 @click(vue v-on:click缩写) --><li class="arrow"><span@click="pickPre(currentYear, currentMonth, 'year')"style="margin-right: 20px">❮❮</span><span @click="pickPre(currentYear, currentMonth, 'month')"></span></li><li class="year-month"><span class="choose-year">{{ currentYear }}</span><span class="choose-month">{{ currentMonth }}</span></li><li class="arrow"><span @click="pickNext(currentYear, currentMonth, 'month')"></span><span@click="pickNext(currentYear, currentMonth, 'year')"style="margin-left: 20px">❯❯</span></li></ul><!-- 星期 --><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="(item, index) in days" :key="index"><!--本月--><!--如果不是本月  改变类名加灰色--><spanv-if="item.month != currentMonth"class="other-month"@click="clickOtherItem(item)">{{ +item.date }}</span><!--如果是本月  还需要判断是不是这一天--><span v-else><!--今天  同年同月同日--><spanclass="current-month"@click="clickItem(item)":class="{'current-day':item.day.getFullYear() == new Date().getFullYear() &&item.day.getMonth() == new Date().getMonth() &&item.day.getDate() == new Date().getDate(),active: item.value === activeTime,'not-allow': !item.hasActivity,'has-activity': item.hasActivity,}">{{ +item.date }}</span></span></li></ul></div></div>
</template><script>
export default {name: "",components: {},mixins: [],props: {},computed: {},watch: {},data() {return {currentDay: 1,currentMonth: 1,currentYear: 1970,currentWeek: 1,days: [],activeTime: "2023-09-21",list: ["2023-09-20", "2023-09-21", "2023-09-11"],};},created() {this.initData(null);},mounted() {},methods: {// 点击其他月份的 判断clickOtherItem(item) {if (item.month < this.currentMonth) {this.pickPre(this.currentYear, this.currentMonth, "month");} else {this.pickNext(this.currentYear, this.currentMonth, "month");}},clickItem(item) {if (!item.hasActivity) return;this.activeTime = item.value;},initData: function (cur) {var date;console.log(cur);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,0if (this.currentWeek == 0) {this.currentWeek = 7;}var str = this.formatDate(this.currentYear,this.currentMonth,this.currentDay);this.days.length = 0;// 今天是周日,放在第一行第7个位置,前面6个//初始化本周console.log(this.currentWeek, "this.currentWeek");for (let i = this.currentWeek - 1; i >= 0; i--) {const d = new Date(str);d.setDate(d.getDate() - i);const day = d;const year = d.getFullYear();const month =d.getMonth() + 1 < 10 ? `0${d.getMonth() + 1}` : d.getMonth() + 1;const date = d.getDate() < 10 ? `0${d.getDate()}` : d.getDate();const value = `${year}-${month}-${date}`;const dayobject = {year,month,date,value,day,};this.days.push(dayobject); // 将日期放入data 中的days数组 供页面渲染使用}//其他周for (var i = 1; i <= 35 - this.currentWeek; i++) {var d = new Date(str);d.setDate(d.getDate() + i);const day = d;const year = d.getFullYear();const month =d.getMonth() + 1 < 10 ? "0" + (d.getMonth() + 1) : d.getMonth() + 1;const date = d.getDate() < 10 ? "0" + d.getDate() : d.getDate();const value = year + "-" + month + "-" + date;var dayobject = {year,month,date,value,day,hasActivity: false, // 是否有活动数据};this.days.push(dayobject);}// 拿到日历数组后 根据返回的有活动的列表进行过滤this.days = this.days.map((item) => {if (this.list.indexOf(item.value) !== -1) {this.$set(item, "hasActivity", true);}return item;});},pickPre: function (year, month, type) {if (type === "month") {const preMonth = month - 1 <= 0 ? 12 : month - 1;const preYear = month - 1 <= 0 ? year - 1 : year;this.initData(this.formatDate(preYear, preMonth, 1));} else {this.initData(this.formatDate(year - 1, month, 1));}},pickNext: function (year, month, type) {if (type === "month") {const nextMonth = month + 1 > 12 ? 1 : month + 1;const nextYear = month + 1 > 12 ? year + 1 : year;this.initData(this.formatDate(nextYear, nextMonth, 1));} else {this.initData(this.formatDate(year + 1, month, 1));}},// 返回 类似 2016-01-02 格式的字符串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 lang="less" scoped>
* {box-sizing: border-box;
}
ul,
li {list-style: none;margin: 0;padding: 0;
}
body {font-family: Verdana, sans-serif;background: #e8f0f3;
}
#calendar {width: 440px;height: 400px;display: flex;flex-direction: column;padding: 20px;margin: 0 auto;box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.1),0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
.title {height: 28px;margin-bottom: 10px;display: flex;align-items: center;justify-content: space-between;.label {color: #000;font-family: PingFang SC;font-size: 16px;font-style: normal;font-weight: 600;}.total {height: 28px;padding: 8px 15px;border-radius: 32px;background: rgba(0, 91, 255, 0.1);display: flex;align-items: center;color: #005bff;font-family: PingFang SC;font-size: 14px;font-style: normal;font-weight: 400;}
}
.content {display: flex;flex: 1;height: 0;flex-direction: column;.month {height: 40.25px;display: flex;justify-content: space-between;padding: 0 10px;align-items: center;.year-month {color: rgba(0, 0, 0, 0.85);text-align: center;font-family: PingFang SC;font-size: 16px;font-style: normal;font-weight: 600;.choose-year {margin-right: 12px;}}.arrow {span:hover {cursor: pointer;color: #005bff;}}}.weekdays {height: 40.25px;display: flex;li {cursor: default;display: flex;align-items: center;justify-content: center;width: calc(100% / 7);height: 40px;color: rgba(0, 0, 0, 0.85);text-align: center;font-family: PingFang SC;font-size: 14px;font-style: normal;font-weight: 400;}}.days {flex: 1;height: 0;display: flex;flex-wrap: wrap;li {display: flex;align-items: center;justify-content: center;width: calc(100% / 7);height: 40px;color: rgba(0, 0, 0, 0.85);text-align: center;font-family: PingFang SC;font-size: 14px;font-style: normal;font-weight: 400;span {width: 34px;height: 34px;line-height: 34px;}.has-activity {display: inline-block;width: 34px;height: 34px;position: relative;}.current-day {color: #005bff;}.active {color: #fff;display: inline-block;width: 34px;height: 34px;background: #005bff;border-radius: 50%;position: relative;}.other-month {color: rgba(0, 0, 0, 0.45);cursor: default;}.current-month:hover {width: 34px;height: 34px;display: inline-block;cursor: pointer;background: #f2f2f2;color: rgba(0, 0, 0, 0.85);border-radius: 50%;}.active:hover {cursor: pointer;color: #fff;display: inline-block;width: 34px;height: 34px;background: #005bff;border-radius: 50%;}.not-allow:hover {cursor: not-allowed;background-color: white;}.has-activity::after {content: "";position: absolute;width: 4px;height: 4px;border-radius: 50%;background-color: #005bff;left: 50%;bottom: 2px;margin-left: -2px;}.active::after {content: "";position: absolute;width: 4px;height: 4px;border-radius: 50%;background-color: white;left: 50%;bottom: 2px;margin-left: -2px;}}}
}
</style>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/103947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt C++的工具箱项目源码,含命令行工具、桌面宠物、文献翻译、文件处理工具、医学图像浏览器、插件市场、设置扩展等工具

一、介绍 1. 基本信息 完整代码下载地址&#xff1a;基于Qt C的工具箱项目源码 TBox是一款基于Qt C的工具箱。用户可以自行选择安装所需的工具&#xff08;以插件的形式&#xff09;&#xff0c;将TBox打造成专属于自己的效率软件。TBox基本界面展示如下&#xff1a; 2. 使用…

小程序首页如何进行装修设置

小程序首页是展示给用户的第一屏&#xff0c;它的装修直接影响到用户对小程序的第一印象。小程序首页的设置在小程序管理员后台->页面设置->首页&#xff0c;下图是小程序首页默认的设置。 下图&#xff0c;是小程序首页的具体表现形式。下面具体解释小程序首页各个设置项…

【PCIE720】基于PCIe总线架构的高性能计算(HPC)硬件加速卡

PCIE720是一款基于PCI Express总线架构的高性能计算&#xff08;HPC&#xff09;硬件加速卡&#xff0c;板卡采用Xilinx的高性能28nm 7系列FPGA作为运算节点&#xff0c;在资源、接口以及时钟的优化&#xff0c;为高性能计算提供卓越的硬件加速性能。板卡一共具有5个FPGA处理节…

树和二叉树 | 一些遇到的小问题

1. TreeNode<T> &a TreeNode<T> &a是一个引用&#xff0c;指向类型为T的TreeNode节点。这个引用可以用来修改或访问该节点的值或属性。 2. *BiTree是什么意思&#xff1a; typedef struct BiTNode{ char data;struct BiTNode* lchild, * rchild; }BiT…

标定板生成网址,可以直接打印,matlab标定工具箱

Camera Calibration Pattern Generator – calib.io matlab 打开标定的成像 cameraCalibrator 点击完成之后 命令行中输入 cameraParams.IntrinsicMatrix

修改ubuntu服务器fs文件最大打开数

起因 在对项目进行压测的时候&#xff0c;请求异常 java.net.SocketException: socket closed&#xff0c;查看nginx代理服务器的日志。tail -f -n500 /var/log/nginx/error.log 显示 文件打开数太多socket() failed (24: Too many open files) while connecting to upstream …

Kubernetes核心组件Services

1. Kubernetes Service概念 Service是kubernetes最核心的概念&#xff0c;通过创建Service&#xff0c;可以为一组具有相同功能的POD&#xff08;容器&#xff09;应用提供统一的访问入口&#xff0c;并且将请求进行负载分发到后端的各个容器应用上。 在Kubernetes中&#xf…

C++ opencv实现letterbox

代码&#xff1a; #include <iostream> #include "string" #include "opencv2/opencv.hpp"cv::Mat preprocess_img(cv::Mat& img, int input_w,int input_h) {int w,h,x,y;float r_winput_w/(img.cols*1.0);float r_hinput_h/(img.rows*1.0);if…

凉鞋的 Godot 笔记 108. 第二个通识:增删改查

在这一篇&#xff0c;我们来学习此教程的第二个通识&#xff0c;即&#xff1a;增删改查。 增删改查我们不只是一次接触到了。 在最先接触的场景窗口中&#xff0c;我们是对 Node 进行增删改查。 在文件系统窗口中&#xff0c;我们是对文件&文件夹进行增删改查&#xff1…

leetCode 583.两个字符串的删除操作 动态规划 + 优化空间复杂度(二维dp、一维dp)

583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1&#xff1a; 输入: word1 "sea", word2 &qu…

基于springboot实现校园闲置物品交易平台系统项目【项目源码+论文说明】

基于springboot实现校园闲置物品交易平台系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&am…

nodejs+vue+elementui酒店客房服务系统mysql带商家

视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时能够正常。 简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术&#xff1a;nodejsvueel…

基于单目相机的2D测量(工件尺寸和物体尺寸)

目录 1.简介 2.基于单目相机的2D测量 2.1 想法&#xff1a; 2.2 代码思路 2.2 主函数部分 1.简介 基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。 工业制造&#xff1a;在工业制造过程中&#xff0c;精确测量是确保产品质量和一致性的关键。基于单目相机的2…

Go语言入门心法(二): 结构体

Go语言入门心法(一) Go语言入门心法(二): 结构体 一: Go语言中结构体认知 go语言中的结构体认知升维:go语言中的结构体本身是一种自定义的数据类型,即然是数据类型,则可以用来声明其他的变量,被声明的变量即为结构体的实例对象go语言中的结构体融合了c语言中的结构体体征和面…

Xshell7和Xftp7超详细下载教程(包括安装及连接服务器附安装包)

1.下载 1.官网地址&#xff1a; XSHELL - NetSarang Website 选择学校免费版下载 2.将XSHELL和XFTP全都下载下来 2.安装 安装过程就是选择默认选项&#xff0c;然后无脑下一步 3.连接服务器 1.打开Xshell7&#xff0c;然后新建会话 2.填写相关信息 出现Connection establi…

JVM 性能调优参数

JVM分为堆内存和非堆内存 堆的内存分配用-Xms和-Xmx -Xms分配堆最小内存&#xff0c;默认为物理内存的1/64&#xff1b; -Xmx分配最大内存&#xff0c;默认为物理内存的1/4。 非堆内存分配用-XX:PermSize和-XX:MaxPermSize -XX:PermSize分配非堆最小内存&#xff0c;默认为物理…

【LeetCode高频SQL50题-基础版】打卡第5天:第26~30题

文章目录 【LeetCode高频SQL50题-基础版】打卡第5天&#xff1a;第26~30题⛅前言超过5名学生的课&#x1f512;题目&#x1f511;题解 求关注者的数量&#x1f512;题目&#x1f511;题解 只出现一次的最大数字&#x1f512;题目&#x1f511;题解 买下所有产品的客户&#x1f…

《进化优化》第4章 遗传算法的数学模型

文章目录 4.1 图式理论4.2 马尔可夫链4.3 进化算法的马尔可夫模型的符号4.4 遗传算法的马尔可夫模型4.4.1 选择4.4.2 变异4.4.3 交叉 4.5 遗传算法的动态系统模型4.5.1 选择4.5.2 变异4.5.3 交叉 4.1 图式理论 图式是描述一组个体的位模式&#xff0c;其中用*来表示不在乎的位…

如何在Ubuntu 20.04.6 LTS系统上运行Playwright自动化测试

写在前面 这里以 Ubuntu 20.04.6 LTS为例。示例代码&#xff1a;自动化测试代码。 如果过程中遇到其他非文本中提到的错误&#xff0c;可以使用搜索引擎搜索错误&#xff0c;找出解决方案&#xff0c;再逐步往下进行。 一、 环境准备 1.1 安装python3 1.1.1 使用APT安装Py…

python+opencv+深度学习实现二维码识别 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…