全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

纯js模仿windows系统日历

在网上看了几篇关于生成日历的js 教程于是自己也整理了一个想法思路 大家有什么建议欢迎提出

首先这个项目里面本人认为的几个难点:

1、如何定义每一个月的第一天位置

每个月的第一天都不是固定的星期几,所以第一天的输出需要动动脑筋把它放到对应的星期里面

2、每个月的最后一天有时候因为行数不够输出不了怎么办?

下面会有答案 ^_^

思路:

1、定义好每一个月份的日期天数

2、获取当前的系统日期初始化数据

3、输出日历

    2.1、先获取当前月的第一天是星期几(这一点与日历的排版至关重要!)
    2.2、获取当前月的天数
    2.3、获取当前月有多少个星期(即要输出多少行 行数这里我会预留多一行)
    2.4、获取当前年份和月份 用作显示

下面便是完整的代码:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>js 日历</title>
 <style type="text/css">
  *{
  border: 0;
  padding: 0;
  margin: 0;
  font-family: "微软雅黑";
  }
  a{
  text-decoration: none;
  color: #000;
  }
  li{
  list-style-type: none;
  }
  .calendar_wrap{
  width: 350px;
  margin: 0 auto;
  padding: 0;
  border: 1px solid #000;
  }
  .calendar_list{
  width: 100%;
  margin-top: 10px;
  }
  .calendar_list tr{
  width: 100%;
  }
  .calendar_list tr td{
  text-align: center;
  height: 45px;
  }
  .control_bar{
  word-spacing: -6px;
  }
  .control_bar span,.control_bar b{
  display: inline-block;
  text-align: center;
  word-spacing: 0px;
  }
  .left-bt,.right-bt{
  width: 50px;
  }
  #reduce_bt,#add_bt{
  width: 50%;
  height: 25px;
  border-radius: 50%;
  }
  #reduce_bt:focus{
  outline: none;
  }
  #add_bt:focus{
  outline: none;
  }
  #current_date{
  width: 250px;
  }
  #resetBt{
  display: block;
  text-align: center;
  color: #fff;
  cursor: pointer;
  width: 120px;
  line-height: 40px;
  background-color: #FF7F27;
  margin: 0 auto;
  }
  #date_list tr td:hover{
  background-color: #ccc;
  cursor: default;
  }
 </style>
</head>
<body>
 <div class="calendar_wrap">
 <div class="control_bar">
  <span class="left-bt"><input type="button" id="reduce_bt" value="<"></span>
  <b id="current_date">2017-02</b>
  <span class="right-bt"><input type="button" id="add_bt" value=">"></span>
 </div>
 <table class="calendar_list" cellspacing="0">
  <thead>
   <tr>
   <td>日</td>
   <td>一</td>
   <td>二</td>
   <td>三</td>
   <td>四</td>
   <td>五</td>
   <td>六</td>
   </tr> 
  </thead>
  <tbody id="date_list"></tbody> 
 </table>
 </div>
 <span id="resetBt">回到现在日期</span>
 <script type="text/javascript">
  var dateScreen = document.getElementById('current_date');//获取显示当前年份月份的div
  var reduceBt = document.getElementById('reduce_bt');//获取减少月份的按钮
  var addBt = document.getElementById('add_bt');//获取增加月份的按钮
  var dateList = document.getElementById('date_list');//获取显示所有日期部分
  var resetBt = document.getElementById('resetBt');//获取重设按钮
  //定义好每月的日期总数 总数按js 获取月份数值的下标方式储存
  var overall_date = [31,28,31,30,31,30,31,31,30,31,30,31];
  var add_date = 1;//定义添加日期数的初始化
  //初始化日历
  //获取现在的日期
  var now_date = new Date();
  var nowFullYear = now_date.getFullYear();
  var nowMonth = now_date.getMonth();
  //执行日历输出函数
  printCalendar();
  //-----------------------------------
  //月份减少按钮点击事件
  reduceBt.onclick = function(){
  nowMonth = nowMonth - 1;
  if (nowMonth == -1) {
  nowFullYear = nowFullYear - 1;
  nowMonth = 11;
  }
  clearRows();
  printCalendar();
  }
  //增加月份按钮点击事件
  addBt.onclick = function(){
  nowMonth+= 1;
  if (nowMonth == 12) {
  nowFullYear+= 1;
  nowMonth = 0;
  } 
  clearRows();
  printCalendar();
  }
  //重设按钮点击事件
  resetBt.onclick = function(){
  var resetDate = new Date();
  nowFullYear = resetDate.getFullYear();
  nowMonth = resetDate.getMonth();
  clearRows();
  printCalendar();
  }
  function printCalendar(){
  var printDate = new cur_date(nowFullYear,nowMonth);//实例cur_date方法
  var printFirstDay = printDate.firstDay;//获取要输出月份第一天的星期
  var printTotalDate = printDate.totalDate;//获取输出日期的总数
  var printMonth = printDate.cur_month;//获取输出的月份
  (printMonth >= 9)?(printMonth = (printMonth + 1)):(printMonth = ("0" + (printMonth + 1)));
  //调整月份的显示格式
  var printYear = printDate.cur_year;//获取输出的年份
  var totalRows = Math.ceil((printTotalDate + (printFirstDay - 1)) / 7) + 1;
  //获取行数
  //利用天数除以7天获得行数并将它向上去整 但是上限是5
  //而考虑到某些月会有6行所以在总行数里面加1 以防万一
  //开始输出
  //首先显示出年和月
  dateScreen.innerText = printYear + "-" + printMonth;
   //开始输出日期
   for (var i = 0; i < totalRows; i++) {
   dateList.insertRow(i);
   for (var j = 0; j < 7; j++) {
   //当天数总量大于额定总量时先终止内部循环
   if (add_date > printTotalDate) {
   break;
   }
   dateList.rows[i].insertCell(j);
   //改变周日和周六的文字颜色
   if (j == 0) {
   dateList.rows[i].cells[j].style.color = "red";
   dateList.rows[i].cells[j].style.fontWeight = "bold";
   }else if(j == 6){
   dateList.rows[i].cells[j].style.color = "green";
   dateList.rows[i].cells[j].style.fontWeight = "bold";
   }
   if (i == 0 && j >= printFirstDay) {
   //当此时是第一行时而且单元格下标大于等于当前月第一天的星期就开始为单元格填入文本
   dateList.rows[i].cells[j].innerText = add_date;
   add_date++;
   }else if(i > 0){
   //第一行以后的单元格就按循环添加即可
   dateList.rows[i].cells[j].innerText = add_date;
   add_date++;
   }
   }
   }
  add_date = 1;//输出完把日期总数重新赋值为1
  }
  //获取当前年、月、第一天是星期几、日期总数
  function cur_date(curYear,curMonth){
  this.cur_firstDate = new Date(curYear,curMonth,1);//获取现在日期的第一天
  this.cur_year = curYear;//获取当前的年
  this.cur_month = curMonth;//获取当前的月
  this.totalDate = is_leapYear(curYear,curMonth);//获取总天数
  this.firstDay = this.cur_firstDate.getDay()//获取每个月的第一天是星期几
  }
  //判断今年是否为闰年
  function is_leapYear(target_year,target_month){
  if ((target_month == 1) && (target_year % 4 == 0) && ((target_year % 100 != 0) || (target_year % 400 != 0))) {
     //当前月是2月且当前年是闰年
     return 29;
  }else{
  //其他月按正常日期总数输出
  return overall_date[target_month];
  }
  }
  function clearRows(){
  var rowsNum = dateList.rows.length;
  while(rowsNum > 0){
   dateList.deleteRow(rowsNum - 1);
   rowsNum--;
  }
  }
 </script>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 日历  # 系统日历  # js原生日历的实例(推荐)  # 原生JS实现日历组件的示例代码  # js实现会跳动的日历效果(完整实例)  # 原生js实现仿window10系统日历效果的实例  # 行数  # 每个月  # 会有  # 单元格  # 前年  # 有什么  # 几个  # 我会  # 看了  # 把它  # 微软  # 考虑到  # 将它  # 至关重要  # 个月  # 填入  # 值为  # 天都  # 几篇  # 周日 


相关文章: 历史网站制作软件,华为如何找回被删除的网站?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何在阿里云香港服务器快速搭建网站?  兔展官网 在线制作,怎样制作微信请帖?  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何在建站宝盒中设置产品搜索功能?  如何确保西部建站助手FTP传输的安全性?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何选择高效响应式自助建站源码系统?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  金*站制作公司有哪些,金华教育集团官网?  如何快速搭建响应式可视化网站?  如何用免费手机建站系统零基础打造专业网站?  如何在Windows环境下新建FTP站点并设置权限?  建站主机CVM配置优化、SEO策略与性能提升指南  网站制作网站,深圳做网站哪家比较好?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Python多线程使用规范_线程安全解析【教程】  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  开源网站制作软件,开源网站什么意思?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  建站之星伪静态规则如何正确配置?  TestNG的testng.xml配置文件怎么写  微信小程序 五星评分(包括半颗星评分)实例代码  黑客如何通过漏洞一步步攻陷网站服务器?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何基于云服务器快速搭建网站及云盘系统?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何在万网主机上快速搭建网站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何快速搭建二级域名独立网站?  如何在云主机上快速搭建网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  微课制作网站有哪些,微课网怎么进?  ,网页ppt怎么弄成自己的ppt?  外贸公司网站制作哪家好,maersk船公司官网?  如何通过虚拟机搭建网站?详细步骤解析  建站之星如何通过成品分离优化网站效率?  如何挑选优质建站一级代理提升网站排名?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。