JS实现日历表

有需要的可以用一下,这是一个简单的demo.

HTML:

<table>
			<thead>
				<tr>
					<th colspan="2">
						<span class="left">«</span>
					</th>
					<th colspan="3">
						<span class="time"></span>
					</th>
					<th colspan="2"><span class="right">»</span>
					</th>
				</tr>
				<tr>
					<th>日</th>
					<th>一</th>
					<th>二</th>
					<th>三</th>
					<th>四</th>
					<th>五</th>
					<th>六</th>
				</tr>
			</thead>
			<tbody class="main">
			</tbody>
		</table>

CSS:

<style>
			table {
				width: 320px;
				background: #ffffff;
				color: #000000;
			}

			td,
			th {
				text-align: center;
				height: 30px;
			}
		</style>

JS:

<script>
			var oTime = document.querySelector(".time") //头部年月标题显示
			var oMain = document.querySelector(".main") //主体日历数字显示
			var leftBtn = document.querySelector(".left"); //点击左边的按钮,月份减少
			var rightBtn = document.querySelector(".right"); //点击右边的按钮,月份增加
			var time = new Date(); //获取当前系统时间
			leftBtn.onclick = function() {
				time.setMonth(time.getMonth() - 1);
				getPrevDays(time);
				getCurrentDays(time);
				minHead(time);
				mainList(time, getPrevDays(time), getCurrentDays(time));
			}
			rightBtn.onclick = function() {
				time.setMonth(time.getMonth() + 1);
				getPrevDays(time);
				getCurrentDays(time);
				minHead(time);
				mainList(time, getPrevDays(time), getCurrentDays(time));
			}

			function minHead(time) {
				oTime.innerText = time.getFullYear() + "年" + (time.getMonth() + 1) + "月"
			}

			function mainList(time, prevDays, currentDays) {
				var beforeCount = prevDays.length + currentDays.length;
				var cellList = document.querySelectorAll("td");
				for (var i = 0; i < prevDays.length; i++) { //上一个月所占格子
					cellList[i].innerHTML = "<font color='#D3D5DA'>" + prevDays[i] + "</font>"
				}
				for (var i = 0; i < currentDays.length; i++) { //当前月所占格子
					if (currentDays[i] == time.getDate()) { //当天日期高亮显示
						cellList[i + prevDays.length].innerHTML = "<font color='blue'>" + currentDays[i] + "</font>";
					} else { //当月日期白色突出
						cellList[i + prevDays.length].innerHTML = "<font color='#000000'>" + currentDays[i] + "</font>";
					}
				}
				for (var i = 1; i <= (42 - beforeCount); i++) { //下个月所占格子
					cellList[i + beforeCount - 1].innerHTML = "<font color='#D3D5DA'>" + i + "</font>"
				}
			}

			function createCells() {
				for (var i = 0; i < 6; i++) { //6行
					var oTr = document.createElement("tr");
					for (var j = 0; j < 7; j++) { //7列
						var oTd = document.createElement("td");
						oTr.appendChild(oTd);
					}
					oMain.appendChild(oTr);
				}
			}

			function getPrevDays(time) { //获得上一个在本月所占的天数
				var time = new Date(time); //拷贝一份时间,避免时间修改发生冲突
				var list = []; //上一个月所占的天数
				time.setDate(1); //设置成当月1号,便于查看是星期几;
				var day = time.getDay() == 0 ? 7 : time.getDay(); //如果是0,说明数字第一行需要空出来放上一个月的时间
				//获取上一个月的天数
				time.setDate(0); //系统自动计算到上一个月的最后一天
				var maxDay = time.getDate(); //得到上一个月的最后一天时间
				for (var i = maxDay; i > (maxDay - day); i--) {
					//根据maxDay和day之间的关系,把上一个月的时间放到list中
					list.push(i);
				}
				list.reverse(); //日期升序排列
				return list;
			}

			function getCurrentDays(time) { //获取当前月的天数
				var time = new Date(time); //拷贝时间,原因同上
				time.setDate(1); //确保不会出现跨越现象  如果当前时间是1月31号就会出现跨越到三月份的事情
				var list = [];
				//下面代码是为了获取上一个月的天数
				time.setMonth(time.getMonth() + 1) //修改时间到下一个月
				time.setDate(0); //修改时间日期是0
				var maxDay = time.getDate();
				//获取到上一个月的日期并放到数组中
				for (var i = 1; i <= maxDay; i++) {
					list.push(i);
				}
				return list;
			}
			createCells(); //创建6行7列表格
			getPrevDays(time); //获取上一个月在当前月所占的格子数
			getCurrentDays(time); //获取当前月所占的格子数
			minHead(time); //显示头部标题
			mainList(time, getPrevDays(time), getCurrentDays(time)); //显示主题日历
		</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

typedef的使用

在C语言中&#xff0c;有一个关键字叫做typedef&#xff0c;有些人对此感到很疑惑。不熟悉此知识的同学都会对编程失去细心&#xff0c;直接劝退&#xff08;因为之前我就是这样&#xff09;。、 因为好不容易认识了C语言中所有的关键字&#xff08;就是类型吧&#xff0c;像啥…

c语言:指针与数组

目录 使用指针访问数组 使用第一个元素获取数组首地址 使用数组名获取数组首地址 使用指针访问数组等价于下标访问 使用指针访问数组 指针类型的加减运算可以使指针内保存的首地址移动。指针类型加n后。首地址向后移动 n * 步长 字节。 指针类型减n后。首地址向前移动 n *…

Notion开源平替知识库软件AFFiNE本地部署与公网访问远程协作

文章目录 前言1. 使用Docker安装AFFINE2. 安装cpolar内网穿透工具3. 配置AFFINE公网访问地址4. 实现公网远程访问AFFINE5. 结语 前言 本篇文章讲解Notion开源平替全能知识库工具AFFINE如何本地部署&#xff0c;并实现公网远程访问。AFFiNE 是一个全新的开源项目&#xff0c;旨…

LeetCode Hot100 148.排序链表

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 class Solution {public ListNode sortList(ListNode head) {return sortList(head, null);}private ListNode sortList(ListNode head, ListNode tail) {if (head null)retur…

Linux NAPI ------------- epoll边缘触发模式

Linux处理网络数据包的一般流程 分组到达内核的时间是不可预测的。所有现代的设备驱动程序都使用中断来通知内核有分组到达。 网络驱动程序对特定于设备的中断设置了一个处理例程&#xff0c;因此每当该中断被引发时&#xff08;即分组到达&#xff09;&#xff0c;内核都调用…

【Sprin Aop基于注解简单案例之所有通知以及实现 快速复习Aop】

通知类型包括&#xff1a; ● 前置通知&#xff1a;Before 目标方法执行之前的通知 ● 后置通知&#xff1a;AfterReturning 目标方法执行之后的通知 ● 环绕通知&#xff1a;Around 目标方法之前添加通知&#xff0c;同时目标方法执行之后添加通知。 ● 异常通知&#xff1a;A…

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 &#xff08;lftp&#xff09;匿名用户的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…

MyBatisPlus基础入门笔记

MyBatisPlus基础入门笔记&#xff0c;源码可见下载链接 大家阅读时可善用目录功能&#xff0c;可以提高大家的阅读效率 下载地址&#xff1a;MyBatisPlus源码笔记 初识MyBatisPlus 入门案例 SpringBoot整合MyBatis&#xff08;复习&#xff09; 创建SpringBoot工程勾选使用的…

Spring Boot整合 Spring Security

Spring Boot整合 1、RBAC 权限模型 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09; 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限&#xff0c;它们之间的关系如下图所示 SELECT…

智慧工地源码:为施工企业提供专业落地的解决方案

智慧工地利用物联网、大数据、AI等核心技术&#xff0c;实时采集现场数据&#xff0c;自动分析&#xff0c;精准分析、智能决策、科学评价&#xff0c;形成一套数据驱动的新型管理模式。为施工企业提供生产提效、安全可控、成本节约的项目管理解决方案&#xff0c;提升项目部管…

每周一算法:树形动态规划

树形动态规划 树形动态规划一般用于处理求树上最优值的问题。大多数动态规划问题都是在一维二维这种规则的背景下的&#xff0c;可以解决的问题比较局限&#xff0c;而树作为一种特殊的图&#xff0c;可以描述比较复杂的关系&#xff0c;再加上树的递归定义&#xff0c;是一种…

linux系统的u盘/mmc/sd卡等的支持热插拔和自动挂载行为

1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统&#xff08;DevFS&#xff09;的替代品&#xff0c;是 Linux 内核的设备管理器。总的来说&#xff0c;它取代了 devfs 和 hotplug&#xff0c;负责管理 /dev 中的设备节点。同时…

openHarmony添加system_basic权限安装报错

openHarmony添加system_basic权限安装报错 12/14 13:49:57: Install Failed: [Info]App install path:D:\huawei\project\FCTTest\entry\build\default\outputs\default\entry-default-signed.hap, queuesize:0, msg:error: failed to install bundle. error: install failed …

【ET8框架入门】0.ET框架介绍

ET8 新特性 多线程多进程架构,架构更加灵活强大&#xff0c;多线程设计详细内容请看多线程设计课程抽象出纤程(Fiber)的概念&#xff0c;类似erlang的进程&#xff0c;非常轻松的创建多个纤程&#xff0c;利用多核&#xff0c;仍然是单线程开发的体验纤程调度: 主线程&#xf…

LeetCode Hot100 23.合并K个升序链表

题目&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 方法&#xff1a;分治&#xff0c;类似于归并 class Solution {public ListNode mergeKLists(ListNode[] lists) {return mer…

MySQL:从MySQL看主从架构高可用性实现

目录 1 主备延迟 1.1 主备延迟 1.2 主备延迟的来源 1.2.1 主备机性能有差距 1.2.2 备库压力大 1.2.3 大事务 1.3 主备延迟的排查思路 3&#xff09;查看MySQL状态 2 主备切换策略 2.1 可靠性优先策略 2.2 可用性优先策略 2.3 常见切换技术 从进入互联网时代开始&a…

深度学习第5天:GAN生成对抗网络

☁️主页 Nowl &#x1f525;专栏 《深度学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 一、GAN1.基本思想2.用途3.模型架构 二、具体任务与代码1.任务介绍2.导入库函数3.生成器与判别器4.预处理5.模型训练6.图片生成7.不同训练轮次的结果对比 一…

KylinV10 将项目上传至 Github

KylinV10 将项目上传至 Github 银河麒麟操作系统 V10 是在 Ubuntu 的基础上开发的&#xff0c;所以适用于 Ubuntu 的也适用于 KylinV10 一般上传至 GitHub&#xff0c;有两种方式&#xff0c;一种是 HTTPS&#xff0c;一种是 SSH&#xff0c;但是在 KylinV10 操作系统 HTTPS 的…

大数据----31.hbase安装启动

二.Hbase安装 先前安装&#xff1a; Zookeeper 正常部署 首先保证 Zookeeper 集群的正常部署&#xff0c;并启动之。 三台机器都执行&#xff1a;zkServer.sh startHadoop 正常部署 Hadoop 集群的正常部署并启动。 主节点上进行 &#xff1a;start-all.sh 1.HBase 的获取 一定…

【Python网络爬虫入门教程1】成为“Spider Man”的第一课:HTML、Request库、Beautiful Soup库

Python 网络爬虫入门&#xff1a;Spider man的第一课 写在最前面背景知识介绍蛛丝发射器——Request库智能眼镜——Beautiful Soup库 第一课总结 写在最前面 有位粉丝希望学习网络爬虫的实战技巧&#xff0c;想尝试搭建自己的爬虫环境&#xff0c;从网上抓取数据。 前面有写一…