JavaScript 实现自定义考勤日历组件

作者:青柠

时间:2026-10-22

浏览:309

本文介绍了一个基于 JavaScript 实现的自定义考勤日历组件。该组件解决了开源日历绑定数据不便的问题,通过简单的 HTML、CSS 和 JS 文件实现日期展示与样式控制。文章提供了核心源码及 GitHub 下载链接,并说明了如何扩展功能以适配考勤业务需求。

文章目录

JavaScript 实现自定义考勤日历组件

简介

现有的开源日历库在将自定义数据绑定到日历单元格时往往不够灵活。鉴于工作需求,需要开发一个考勤日历功能,考虑到日历逻辑并不复杂,因此自行编写了一个简易版本。该版本样式简洁,用户可根据需求进行扩展。使用时只需绑定获取数据的方法即可,当前版本未内置月份选择功能,开发者可自行扩展,代码中已预留日期设置接口。在自定义扩展时,请确保保持原有代码结构不变,仅增加必要方法。

核心脚本文件

attendanceCalendar.js

代码已多次更新,请直接访问 GitHub 下载最新版本,链接如下:

修复了第一行日期数量计算的 Bug,具体修改涉及以下方法:


 function initCalendarBody() {
  $content = document.createElement("div");
  addClass($content, "div_calendar_body");
  $elem.appendChild($content);
  addCalendarHead();

  //日期计算bug,例:2017-01
  var num = 0;
  do {
   var length = 0;
   if (num == 0) {
    //出星期天外,星期数(1~6)和第一行显示的日期数(7~2),相加的结果都为8
    length = firstWeekDay == 0 ? 1 : 8 - firstWeekDay;
    num = length;
    createLine(length - 1, 1);
   }
   else {
    var length = mds - num > 6 ? 7 : mds - num;
    num = num + length;
    createLine(length - 1);
   }
  }
  while (num < mds)
  showCurrentDate();
 }

 function createLine(num, type) {
  var newDiv = document.createElement("div");
  for (var i = 0; i <= num; i++, index++) {
   var span = document.createElement("span");
   var span_text = document.createTextNode(index + 1);
   //单个日期元素的操作
   if (attendances && attendances.length > 0) {
    bindAttendance(span, attendances[index]);
   }
   span.appendChild(span_text);
   newDiv.appendChild(span);
  }
  if (type == 1) {
   addClass(newDiv, "first_div")
  }
  else {
   addClass(newDiv, "last_div")
  }
  $content.appendChild(newDiv);
 }

样式定义

CSS 部分,日期元素主要使用三种颜色进行区分显示。


.div_calendar {
 width: 450px;
 margin: 0 auto;
 text-align: center;
 display: -webkit-box;
}

/** 日历标题 */
.div_calendar_title {
 width: 450px;
 margin: 0 auto;
 text-align: center;
}

/** 日历主体 */
.div_calendar_body {
 width: 350px;
 text-align: center;
}

/** 日元素 */
.div_calendar span {
 width: 50px;
 display: inline-block;
 text-align: center;
 line-height: 50px;
}

/** 正常 */
.div_calendar span.normal {
 color: blue;
}

/** 迟到 */
.div_calendar span.late {
 color: red;
}

/** 缺勤 */
.div_calendar span.absense {
 color: #666;
}

/** 缺勤 */
.div_calendar span.today {
 border-radius: 50%;
 background: cornflowerblue;
}

/** 日历第一行日期 */
.div_calendar .first_div {
 text-align: right;
}

/** 日历末行日期 */
.div_calendar .last_div {
 text-align: left;
}

/** 日期显示div */
.div_calendar .div_currentDate {
 text-align: right;
}

.div_calendar .changeDate {
 cursor: pointer;
}

.div_calendar .div_currentDate span {
 width: inherit;
}

.div_calendar .div_currentDate span em {
 margin: 5px;
}

HTML 结构示例

calendar.html


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <link href="css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="div_calendar_title"><h1>自定义日历</h1></div>
<div id="calendar_div" class="div_calendar">
</div>
<script src="script/attendanceCalendar.js"></script>
</body>
</html>

示例演示:

JavaScript 实现自定义考勤日历组件

代码已多次更新,请直接访问 GitHub 下载最新版本,链接如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章