javascript画全年日历

news2024/11/28 20:57:14

        前些日子闲聊群里有人提了用js画全年日历的需求,趁闲暇时间画了个小demo,下面还是先上效果图吧。

        高亮显示的是今天的日期和标记要高亮显示的日期,也添加了点击事件的钩子,自己可以实现钩子函数,从而操作点击的日期值。

下面还是先上dai

/**
 * 日历视图
 */
class DateView{
	/**
	 * [constructor 构造]
	 * @param  {[type]} option [description]
	 * @return {[type]}        [description]
	 */
	constructor(option){
		this.FtColor=option?.FtColor==undefined?"#000":option?.FtColor;
		this.BdColor=option?.BdColor==undefined?"#fff":option?.BdColor;
		this.BgColor=option?.BgColor==undefined?"#fff":option?.BgColor;
		this.FtSize=option?.FtSize==undefined?"30px":option?.FtSize;
		this.padding=option?.padding==undefined?"10px":option?.padding;
		this.parent=option?.parent==undefined?"body":option?.parent;
		this.index=0;
	}
	/**
	 * [setFtColor 设置字体颜色]
	 * @param {[type]} FtColor [description]
	 */
	setFtColor(FtColor){
		this.FtColor=FtColor;
		return this;
	}
	/**
	 * [setBdColor 设置边框颜色]
	 * @param {[type]} BdColor [description]
	 */
	setBdColor(BdColor){
		this.BdColor=BdColor;
		return this;
	}
	/**
	 * [setBgColor 设置背景颜色]
	 * @param {[type]} BgColor [description]
	 */
	setBgColor(BgColor){
		this.BgColor=BgColor;
		return this;
	}
	/**
	 * [setFtSize 设置字体大小]
	 * @param {[type]} FtSize [description]
	 */
	setFtSize(FtSize){
		this.FtSize=FtSize;
		return this;
	}
	/**
	 * [setPadding 设置padding]
	 * @param {[type]} padding [description]
	 */
	setPadding(padding){
		this.padding=padding;
		return this;
	}
	/**
	 * [setParent 设置日历容器]
	 * @param {[type]} parent [description]
	 */
	setParent(parent){
		this.parent=parent;
		return this;
	}
	/**
	 * [drawDateByMonth 取得某一月的日历视图]
	 * @param  {[type]} yearOrmonth [年或月]
	 * @param  {[type]} Month       [月]
	 * @param  {[type]} callBack    [钩子函数,点击日期后的动作]
	 * @param  {[type]} width       [控件宽度]
	 * @param  {[type]} tagData     [需要高亮显示的日期数据如['2023.1.12','2023.1.13']]
	 * @return {[type]}             [description]
	 */
	drawDateByMonth(yearOrmonth,Month,callBack,width,tagData){
		let date=new Date();
		let year,month;
		if(yearOrmonth==undefined){
			year=date.getFullYear();
			month=date.getMonth()+1;
		}else if(yearOrmonth!=undefined&&yearOrmonth>12){
			year=yearOrmonth;
			if(Month==undefined){
				throw new Error("缺少参数“月份”");
			}
			month=Month;
		}else{
			year=date.getFullYear();
			month=yearOrmonth;
		}
		if(year<1900||year>2100){
			throw new Error("年份超出了限定区间1900-2100");
		}
		let html=`<style>
			.dateView${this.index}{
				position: relative;
				${width};
				margin-left:10px;
				color:${this.FtColor};
				font-size: ${this.FtSize};
				background: ${this.BdColor};
				display:inline-block;
				vertical-align:top;
				padding:10px;
			}
			.dateView${this.index} tr{
				background: ${this.BdColor};
			}
			.dateView${this.index} tr td{
				background: ${this.BgColor};
				padding: ${this.padding};
				cursor:pointer;
			}
			.dateView${this.index}Tag{
				color:${this.BgColor};
				background: ${this.FtColor} !important;
			}
		</style>
		<table class="dateView${this.index}">
		<tr>
			<td colspan="7">${month}月</td>
		</tr>
		<tr>
			<td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td><td>七</td>
		</tr>`;

		let days=this.getDaysByYearAndMonth(year,month);//本月多少天
		let firstDay=new Date(year+"/"+month+"/1 1:1:1").getDay();//本月第一天是星期几
		firstDay=firstDay==0?6:firstDay-1;
		let weeks=Math.ceil((days+firstDay)/7);//本月有几周
		let dateArr=[];
		for(var i=1;i<weeks*7+1;i++){
			if((i-firstDay<=0)||(i-firstDay>days)){
				dateArr.push("");
			}else{
				dateArr.push(i-firstDay);
			}
		}
		function splitArray(array, size){
		  let data = [];
		  for (let i = 0; i < array.length; i += size) {
		    data.push(array.slice(i, i + size))
		  }
		  return data
		}
		dateArr=splitArray(dateArr,7);
		tagData=tagData==undefined?[]:tagData;
		let today=new Date();
		today=today.getFullYear()+"-"+(today.getMonth()+1)+"-"+today.getDate();
		tagData.push(today);
		for(var i in dateArr){
			html+=`<tr>`;
			for(var j in dateArr[i]){
				var t=`${year}-${month}-${dateArr[i][j]}`;
				if(tagData.indexOf(t)>=0){
					html+=`<td class="dateView${this.index}Tag" t="${t}">${dateArr[i][j]}</td>`;
				}else{
					html+=`<td t="${t}">${dateArr[i][j]}</td>`;
				}
			}
			html+=`</tr>`;
		}
		if(this.parent=="body"){
			document.body.insertAdjacentHTML("beforeend",html);
		}else{
			document.querySelector(this.parent).insertAdjacentHTML("beforeend",html);
		}
		if(callBack!=undefined){
			document.querySelector(`.dateView${this.index}`).addEventListener('click',function(e){
				if(e.target.getAttribute("t")!=null){
					callBack(e.target.getAttribute("t"));
				}
			});
		}
		
		this.index++;
	}
	/**
	 * [getDaysByYearAndMonth 根据年月取得月份的天数]
	 * @param  {[type]} year  [年]
	 * @param  {[type]} month [月]
	 * @return {[type]}       [description]
	 */
	getDaysByYearAndMonth(year,month){
		if([1,3,5,7,8,10,12].indexOf(month)>=0){
			return 31;
		}else if(month==2){
			if(year%100==0){
				if(year%400==0){
					return 29;
				}else{
					return 28;
				}
			}else{
				if(year%4==0){
					return 29;
				}else{
					return 28;
				}
			}
		}else{
			return 30;
		}
	}
	/**
	 * [drawDateByYear 画出某一年全年的日历]
	 * @param  {[type]} year     [年]
	 * @param  {[type]} cols     [一行显示几个月份]
	 * @param  {[type]} callBack [钩子函数,点击日期后的动作]
	 * @param  {[type]} tagData  [需要高亮显示的日期数据如['2023.1.12','2023.1.13']]
	 * @return {[type]}          [description]
	 */
	drawDateByYear(year,cols,callBack,tagData){
		year=year==undefined?new Date().getFullYear():year;
		cols=cols==undefined?5:cols;
		let width="width:"+Math.floor(100/cols-1)+"%";
		console.log(width)
		for(var i=1;i<=12;i++){
			this.drawDateByMonth(year,i,callBack,width,tagData);
		}
	}
}




let d=new DateView({
	FtSize:"20px",
	FtColor:"#123ae3"
});
d.drawDateByYear(2023,5,function(v){
	alert(v);
},[
	'2023-10-13',
	'2023-9-26',
	'2023-10-12'
]);

使用也很简单,本文开始的效果图,实现代码如下

let d=new DateView({
	FtSize:"20px",
	FtColor:"#123ae3"
});
d.drawDateByYear(2023,5,function(v){
	alert(v);
},[
	'2023-10-13',
	'2023-9-26',
	'2023-10-12'
]);

 其中FtSize为字体大小,Ftcolor为字体颜色,具体设置看构造函数,也有单独的设置字体大小颜色等配置的函数,通过链式操作即可,例如

let d=new DateView({
    FtSize:"20px",
    FtColor:"#123ae3"
});

也可以写成

let d=new DateView();

d.setFtColor("#123ae3").FtSize("20px");

或者也可以不传入任何参数,将默认输出黑白日历

drawDateByYear()方法画出全年的日历,也可以用drawDateByMonth()方法画出某个月的单月日历,默认将日历dom插入到body里,也可以通过传入parent修改日历容器,例如某个div,d.drawDateByYear(2023,5,function(v){
    alert(v);
},[
    '2023-10-13',
    '2023-9-26',
    '2023-10-12'
]);

其中这个匿名函数

function(v){
    alert(v);
}为点击回调的钩子函数,这个是点击相应日期后alert()以下被点击的日期,这个自己根据业务需要实现。

后面这个数组就是要高亮显示的日期

代码都有注释,比较明了了

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

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

相关文章

综述 | 深度强化学习在自动驾驶中的应用

本文是2020年的综述论文《Deep Reinforcement Learning for Autonomous Driving: A Survey》的部分内容节选。翻译稿全文共2万6千字&#xff0c;本文略掉了第3、4节强化学习理论的介绍及扩展部分。摘要随着深度表征学习(deep representation learning)的发展&#xff0c;强化学…

【8】SCI易中期刊推荐——图像处理领域(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

windows下Docker部署Flask的教程

Docker默认安装路径是在C盘&#xff0c;Windows中修改Docker**默认安装****路径方法&#xff1a; 1.先创建 D:\Program Files\Docker 目录 2.运行命令&#xff0c;创建链接 mklink /J "C:\Program Files\Docker" "D:\codeSoftware\Docker"3.点击exe安装…

logstash 向多目标输出多份日志输出syslog

logstash默认情况下是内置了输入syslog日志的&#xff0c;但是不支持输出syslog&#xff0c;需要输出syslog的情况下&#xff0c;就需要手动安装logstash-output-syslog插件。安装方法如下&#xff1a;下载logstash-output-syslog插件&#xff0c;https://rubygems.org/downloa…

SpringBoot 注册自己的Servlet(三种方式)

SpringBoot 注册自己的Servlet&#xff08;三种方式&#xff09; 目录SpringBoot 注册自己的Servlet&#xff08;三种方式&#xff09;方法1:使用servlet3.0规范提供的注解方式注册Servlet1,声明servlet及映射2&#xff0c;加上ServletComponentScan 才会扫描加了这个注解运行结…

LeetCode 62. 不同路径

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 62. 不同路径&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode 62. …

蚂蚁智能内容合规产品,提供一站式营销合规管控解决方案

随着互联网服务的不断深化&#xff0c;产品营销的形式从传统文本、长图文&#xff0c;增加到短视频、直播等新媒介形态&#xff0c;展现形式愈加丰富的同时&#xff0c;也为营销宣传内容合规审核带来了诸多难题。如何解决与日俱增的审核量与合规审核人员有限之间的矛盾&#xf…

旧手机闲置?教你用Termux搭建个移动服务器

目录 前言 准备工作 实践 安装Termux&#xff1a; 运行Termux&#xff1a; 环境配置&#xff1a; 效果展示 写在最后 前言 最近偶然看到网上有人用KSWEB搭建本地服务器&#xff0c;于是突发奇想也想在手机中搭建一个node环境试试&#xff0c;趁着周末有空&#xff0c;…

Vue3商店后台管理系统设计文稿篇(五)

记录使用vscode构建Vue3商店后台管理系统&#xff0c;这是第五篇&#xff0c;主要记录Vue3项目路由知识 文章目录一、Vue3路由二、安装Element Plus三、NPM设置淘宝镜像四、Yarn 设置淘宝镜像正文内容&#xff1a; 一、Vue3路由 路由用于设定访问路径, 将路径和组件映射起来&…

【vue系列-06】vue的组件化编程

深入理解vue的组件一&#xff0c;vue组件1&#xff0c;什么是vue组件2&#xff0c;单文件组件和非单文件组件3&#xff0c;非单组件的基本使用4&#xff0c;vue组件命名规范4.1&#xff0c;一个单词组成4.2&#xff0c;多个单词组成5&#xff0c;组件与组件间的嵌套6&#xff0…

Tomcat结构体系

总体结构Tomcat中最顶层的容器是Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个Server可以包含至少一个Service&#xff0c;用于具体提供服务。Service主要包含两个部分&#xff1a;Connector和Container。从上图可以看出 Tomcat 的心脏就是…

opencv的mat openvino的tensor libtorch的tensor

opencv的mat 对于矩阵数据&#xff0c;在opencv里面是通过使用mat这个数据结构来实现的&#xff0c;我觉得这个数据结构本身设计是用来做图片的存储&#xff0c;所以很多的教程都是关于三维矩阵的&#xff08;其中一个维度是channel&#xff09;&#xff0c;关于三维矩阵的定义…

通讯录小练习:柔性数组和文件操作实现

目录 一.程序功能 二.定义关键类型的头文件与枚举的应用 三.封装柔性数组的增容函数与缩容函数 四.添加联系人功能模块 五 .联系人信息打印模块 六. 查找指定联系人的模块 七.删除指定联系人模块 八.修改指定联系人信息模块 九.排序模块 九.文件操作模块 十.通讯录初…

如何实现外网远程登录访问jupyter notebook?

Jupyter Notebook是一个交互式笔记本&#xff0c;本质是一个 Web 应用程序&#xff0c;支持运行 40 多种编程语言&#xff0c;此前被称为 IPython notebook。Jupyter Notebook 便于创建和共享程序文档、支持实时代码、数学方程、可视化和 markdown&#xff0c;应用场景有数据清…

机器学习基础——k-近邻算法概述和简单实现

本章内容 k-近邻分类算法 从文本文件中解析数据 前言 众所周知&#xff0c;电影可以按照题材分类&#xff0c;然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。没有哪个电影人…

Revit问题:降板表面填充图案和构件上色

一、Revit中如何为降板表面填充不同的图案 在平面图中该如何利用填充图案来区别降板跟楼板&#xff1f; 1、中间的楼板为降板(120)/-150mm,下面我们通过“过滤器”来为其填充表面图案。 2、通过快捷键VV打开“可见性/图形替换”对话框&#xff0c;单击选择“过滤器”一项。 3、…

2023/1 寒假期间自学c++计划安排

寒假一期学习总结 寒假一期学习是在线下进行的&#xff0c;总的来说&#xff0c;非常充实&#xff0c;也很有收获&#xff0c;成体系的学习了 二分&#xff0c;高精度&#xff0c;函数&#xff0c;结构体&#xff0c;STL 等等内容&#xff0c;既开心有学到了知识。 在这7天的集…

最新ios证书申请流程

苹果官方申请ios证书的方法&#xff0c;需要mac电脑&#xff0c;需要使用钥匙串管理先生成csr文件&#xff0c;然后去苹果开发者中心生成证书&#xff0c;然后再用mac电脑导出p12证书。假如我们没有mac电脑&#xff0c;又如何申请证书呢&#xff1f;这个教程我将教会大家如何使…

从汇编的角度了解C++原理——类的储存结构和函数调用

本文用到的反汇编工具是objconv&#xff0c;使用方法可以看我另一篇文章https://blog.csdn.net/weixin_45001971/article/details/128660642。 1、类的储存结构和函数调用 以这段代码为例。 编译后对obj文件反汇编&#xff0c;得到以下汇编代码&#xff0c;配合常量的值来分…

大数据技术架构(组件)——Hive:环境准备2

1.0.1.5、Mysql安装1.0.1.5.1、软件包下载解压缩官网或者直接从百度云盘中下载即可。https://dev.mysql.com/downloads/mysql/1.0.1.5.2、环境变量配置1.0.1.5.2.1、创建系统环境变量MYSQL_HOME1.0.1.5.2.2、将系统环境变量配置到Path上1.0.1.5.2.3、生成Data文件使用系统管理员…