0.效果预览

只实现了日历最基础的功能,当前日期红色显示,可通过上方的左右按钮查看上一月或下一月的日期。

1.HTML部分

 1 <body>
2 <div id="cldFrame">
3 <div id="cldBody">
4 <table>
5 <thead>
6 <tr>
7 <td colspan="7">
8 <div id="top">
9 <span id="left">&lt;</span>
10 <span id="topDate"></span>
11 <span id="right">&gt;</span>
12 </div>
13 </td>
14 </tr>
15 <tr id="week">
16 <td>日</td>
17 <td>一</td>
18 <td>二</td>
19 <td>三</td>
20 <td>四</td>
21 <td>五</td>
22 <td>六</td>
23 </tr>
24 </thead>
25 <tbody id="tbody">
26 </tbody>
27 </table>
28 </div>
29 </div>
30 </body>

2.CSS部分

 1  1 #cldFrame{
2 2 position: relative;
3 3 width: 440px;
4 4 margin: 50px auto;
5 5 }
6 6 #cldBody{
7 7 margin: 10px;
8 8 position: absolute;
9 9 width: 420px;
10 10 }
11 11 #top{
12 12 position: relative;
13 13 height: 60px;
14 14 text-align: center;
15 15 line-height: 60px;
16 16 }
17 17 #topDate{
18 18 font-size: 30px;
19 19 }
20 20 .curDate{
21 21 color: red;
22 22 font-weight: bold;
23 23 }
24 24 table{
25 25 background-color: #f7f7f7;
26 26 }
27 27 #week td{
28 28 font-size: 15px;
29 29 }
30 30 td{
31 31 height: 60px;
32 32 width: 60px;
33 33 text-align: center;
34 34 font-family: Simsun;
35 35 font-size: 20px;
36 36 }
37 37 #left, #right{
38 38 position: absolute;
39 39 width: 60px;
40 40 height: 60px;
41 41 }
42 42 #left{left: 0px;}
43 43 #right{right: 0px;}
44 44 #left:hover, #right:hover{
45 45 background-color: rgba(30, 30, 30, 0.2);
46 46 }

当前显示月份和日期下面将在JS中添加。

3.JS部分及原理讲解

先介绍两个常用的和时间有关的函数,相信大多数人都接触过~

①判断某年是否是闰年

1 1 /*判断某年是否是闰年*/
2 2 function isLeap(year) {
3 3 if((year%4==0 && year%100!=0) || year%400==0){
4 4 return true;
5 5 }
6 6 else{
7 7 return false;
8 8 }
9 9 }

二月大概是十二个月份中最不安分的一个月。

②判断某年某月某日是星期几

1 var monthDay = [31,0,31,30,31,30,31,31,30,31,30,31];

在这之前用数组存放每个月有多少天,我这里将二月的天数设置成了0,之后再决定是加28还是29。

 1  1 /*判断某年某月某日是星期几,默认日为1号*/
2 2 function whatDay(year, month, day=1) {
3 3 var sum = 0;
4 4 sum += (year-1)*365+Math.floor((year-1)/4)-Math.floor((year-1)/100)+Math.floor((year-1)/400)+day;
5 5 for(var i=0; i<month-1; i++){
6 6 sum += monthDay[i];
7 7 }
8 8 if(month > 2){
9 9 if(isLeap(year)){
10 10 sum += 29;
11 11 }
12 12 else{
13 13 sum += 28;
14 14 }
15 15 }
16 16 return sum%7; //余数为0代表那天是周日,为1代表是周一,以此类推
17 17 }

这个函数是为了判断某年某月的1号是星期几而设定的,实际上可以不设置day这个参数,加上了day这个变量,允许使用者在查某日的日期是星期几时也能调用这个函数。

③日历添加部分

根据当前日期决定日历显示哪个月的日期,根据那月的1号是星期几决定1号的添加位置,前方用空格子填充。该月添加完后后方也用空格子补齐。

 1 /*显示日历*/
2 function showCld(year, month, firstDay){
3 var i;
4 var tagClass = "";
5 var nowDate = new Date();
6
7 var days;//从数组里取出该月的天数
8 if(month == 2){
9 if(isLeap(year)){
10 days = 29;
11 }
12 else{
13 days = 28;
14 }
15 }
16 else{
17 days = monthDay[month-1];
18 }
19
20 /*当前显示月份添加至顶部*/
21 var topdateHtml = year + "年" + month + "月";
22 var topDate = document.getElementById('topDate');
23 topDate.innerHTML = topdateHtml;
24
25 /*添加日期部分*/
26 var tbodyHtml = '<tr>';
27 for(i=0; i<firstDay; i++){//对1号前空白格的填充
28 tbodyHtml += "<td></td>";
29 }
30 var changLine = firstDay;
31 for(i=1; i<=days; i++){//每一个日期的填充
32 if(year == nowDate.getFullYear() && month == nowDate.getMonth()+1 && i == nowDate.getDate()) {
33 tagClass = "curDate";//当前日期对应格子
34 }
35 else{
36 tagClass = "isDate";//普通日期对应格子,设置class便于与空白格子区分开来
37 }
38 tbodyHtml += "<td class=" + tagClass + ">" + i + "</td>";
39 changLine = (changLine+1)%7;
40 if(changLine == 0 && i != days){//是否换行填充的判断
41 tbodyHtml += "</tr><tr>";
42 }
43 }
44 if(changLine!=0){//添加结束,对该行剩余位置的空白填充
45 for (i=changLine; i<7; i++) {
46 tbodyHtml += "<td></td>";
47 }
48 }//实际上不需要填充后方,但强迫症必须整整齐齐!
49 tbodyHtml +="</tr>";
50 var tbody = document.getElementById('tbody');
51 tbody.innerHTML = tbodyHtml;
52 }

调用后,日历就可以完整显示了~

1     var curDate = new Date();
2 var curYear = curDate.getFullYear();
3 var curMonth = curDate.getMonth() + 1;
4 showCld(curYear,curMonth,whatDay(curYear,curMonth));

④下一月与上一月

 1 function nextMonth(){
2 var topStr = document.getElementById("topDate").innerHTML;
3 var pattern = /\d+/g;
4 var listTemp = topStr.match(pattern);
5 var year = Number(listTemp[0]);
6 var month = Number(listTemp[1]);
7 var nextMonth = month+1;
8 if(nextMonth > 12){
9 nextMonth = 1;
10 year++;
11 }
12 document.getElementById('topDate').innerHTML = '';
13 showCld(year, nextMonth, whatDay(year, nextMonth));
14 }
15 function preMonth(){
16 var topStr = document.getElementById("topDate").innerHTML;
17 var pattern = /\d+/g;
18 var listTemp = topStr.match(pattern);
19 var year = Number(listTemp[0]);
20 var month = Number(listTemp[1]);
21 var preMonth = month-1;
22 if(preMonth < 1){
23 preMonth = 12;
24 year--;
25 }
26 document.getElementById('topDate').innerHTML = '';
27 showCld(year, preMonth, whatDay(year, preMonth));
28 }

两者没多大差别,别忘了要绑定到按钮上:

1     document.getElementById('right').onclick = function(){
2 nextMonth();
3 }
4 document.getElementById('left').onclick = function(){
5 preMonth();
6 }

更多有趣的功能等待着你去添加~

------------------------------------------------------------------------------------------

转载:https://www.jianshu.com/p/641820efee44

html+css+js实现一个简易日历的更多相关文章

  1. avalon.js实现一个简易日历

    使用MVVM框架avalon.js实现一个简易日历   最近在做公司内部的运营管理系统,因为与日历密切相关,同时无需触发条件直接显示在页面上,所以针对这样的功能场景,我就用avalon快速实现了一个简 ...

  2. 使用MVVM框架avalon.js实现一个简易日历

    最近在做公司内部的运营管理系统,因为与日历密切相关,同时无需触发条件直接显示在页面上,所以针对这样的功能场景,我就用avalon快速实现了一个简易日历,毕竟也是第一次造日历这种轮子,所以这里记录下我当 ...

  3. 使用 js 实现一个简易版的动画库

    使用 js 实现一个简易版的动画库 具有挑战性的前端面试题 animation css refs https://www.infoq.cn/article/0NUjpxGrqRX6Ss01BLLE x ...

  4. 使用 js 实现一个简易版的模版引擎

    使用 js 实现一个简易版的模版引擎 regex (function test() { this.str = str; })( window.Test = ...; format() { let ar ...

  5. 使用 js 实现一个简易版的 drag & drop 库

    使用 js 实现一个简易版的 drag & drop 库 具有挑战性的前端面试题 H5 DnD js refs https://www.infoq.cn/article/0NUjpxGrqRX ...

  6. 使用 js 实现一个简易版的 GIPHY 动图搜索 web 应用程序

    使用 js 实现一个简易版的 GIPHY 动图搜索 web 应用程序 具有挑战性的前端面试题 API JAMstack refs https://www.infoq.cn/article/0NUjpx ...

  7. 使用 js 实现一个简易版的 async 库

    使用 js 实现一个简易版的 async 库 具有挑战性的前端面试题 series & parallel 串行,并行 refs https://www.infoq.cn/article/0NU ...

  8. 使用 js 实现一个简易版的 vue 框架

    使用 js 实现一个简易版的 vue 框架 具有挑战性的前端面试题 refs https://www.infoq.cn/article/0NUjpxGrqRX6Ss01BLLE xgqfrms 201 ...

  9. JS写一个简单日历

    JS写一个日历,配合jQuery操作DOM <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  10. 【html css js】实现一个简易日历

    ——[效果预览] 实现了日历最基础的功能,当前日期红色显示,可通过上方的左右按钮查看上一月或下一月的日期. ——[代码部分] 1. HTML <body> <div class=&q ...

随机推荐

  1. Blazor和Vue对比学习(进阶.路由导航一):基本使用

    Blazor和Vue都是单文件组件SPA,路由的实现逻辑非常相似,页面路径的改变都是组件的切换,但因为各自语言的特性,在实现方式上有较大差异. 一.安装 1.Vue:Router是Vue的一个插件.如 ...

  2. Kafka教程(三):原理及存储

    一.思维导图 1.实时更新连接 https://www.mubucm.com/doc/1GRE2U7qYuj 2.思维导图图片 二.具体内容   8.系统架构   架构推导   拓扑结构   多对多 ...

  3. 【Shell案例】【awk和循环、NR、格式打印、全局变量、$0、通配符】12、打印每一行出现的数字个数

    写一个 bash脚本以统计一个文本文件 nowcoder.txt中每一行出现的1,2,3,4,5数字个数并且要计算一下整个文档中一共出现了几个1,2,3,4,5数字数字总数. 示例: 假设 nowco ...

  4. python面向对象推导流程

    举例:猫狗大战 # 1.例如我们要编写一个猫狗对战小游戏 # 首先我们要定义一个猫,和一只狗 cat1 = { 'name': '小白猫', 'type': '宠物猫', 'attack_val': ...

  5. JS传值与应用

    问题提出:在进行页面书写的时候,有时候需要进行动态页面拼接,在动态拼接的时候,涉及到函数的调用,函数的传值可能是HTML标签,或者含有json的标签,这样在传值时就有可能出现问题,由于"&q ...

  6. 04.Javascript学习笔记3

    1.箭头函数 箭头函数是一种更短的函数表达式. const age = birthyear => 2022 - birthyear; console.log(age(2000)) 箭头左边的bi ...

  7. C# 正则表达式常用的符号和模式解析

    〇.正则表达式的基本语法符号 若只简单匹配固定字符串,则无需任何修饰符,例如:需要匹配字符串 77,则可直接写:new Regex("77"). 下边例举一下常用的符号:(知道下面 ...

  8. Java关键词synchronized解读

    目录 1 引入Synchronized 2 Synchronized的使用 2.1 对象锁 2.1.1 Synchronized修饰实例方法 2.1.2 Synchronized修饰代码块 2.2 类 ...

  9. HBase详解(05) - HBase优化 整合Phoenix 集成Hive

    HBase详解(05) - HBase优化 整合Phoenix 集成Hive HBase优化 预分区 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维 ...

  10. 递归实现指数型枚举 (n个可选可不选)

    递归实现指数型枚举 从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案. 输入格式 输入一个整数 n. 输出格式 每行输出一种方案. 同一行内的数必须升序排列,相邻两个数用恰好 1 ...