最近做的一个项目中,需要用到一个日历来记录你的签到,网上找了一些,感觉挺庞大的,所以就自己写了一个,记录一下自己写这个日历的经过

html代码:

<table cellspacing="0">
<thead>
<tr class="thead">
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
<th>Sat</th>
<th>Sun</th>
</tr>
</thead>
  <tbody id="tbody">
<!--因为一个月最多五个星期-->
<tr class="firstLine">
<td colspan=""></td>
</tr>
<tr class="secondLine"></tr>
<tr class="thirdLine"></tr>
<tr class="fourLine"></tr>
<tr class="fiveLine"></tr>
</tbody>
</table>

 css代码:

table {
border-collapse: separate;
border-width: 0px 0px 1px 1px;
margin: 10px auto;
font-size: 20px;
}
td, th {
width: 81px;
height: 45px;
text-align: center;
vertical-align: middle;
color: #5d6b7a;
position: relative;
font-size: 16px;
} .thead th{
background-color: #ffa6a6;
color: white;
height: 50px;
font-weight: bold;
font-size: 14px;
}
/*匹配所有表格的奇数行*/
tbody tr:nth-child(2n+1){
background: #fff;
} /*匹配所有的偶数行*/
tbody tr:nth-child(2n){ background:#f5f8fc; }

 js代码如下:

        var today = new Date(); 

        today.setDate(1);  

//      获取每个月的第一天是星期几,这样决定日历在开始的位置
var week = today.getDay(); //获取当前月最后一天时间
var last=new Date(today.getFullYear(), today.getMonth()+1,0); // 获取最后一天是几号
var lastDate=last.getDate(); // 每个月1号的起始位置。比如1号时星期2,那么第一行就缩进1格,所以是week-1;
$('tbody tr').eq(0).find('td:first').attr('colspan',week-1); var firstNum=Number(7-week+1); //1号往后的位置还有多少天,+1是因为求出的星期几时起始位置

     //每一行的数字
var firstLine='';
var secondLine='';
var thirdLine='';
var fourLine='';
var fiveLine=''; // 第一个星期天数
for(var i=0;i<firstNum;i++){
firstLine+='<td>'+(i+1)+'</td>';
}
// 第二个星期天数
for(var i=firstNum;i<firstNum+7;i++){
secondLine+='<td>'+(i+1)+'</td>';
}
// 第三个星期天数
for(var i=firstNum+7;i<firstNum+7+7;i++){
thirdLine+='<td>'+(i+1)+'</td>';
}
// 第四个星期天数
for(var i=firstNum+7+7;i<firstNum+7+7+7;i++){
fourLine+='<td>'+(i+1)+'</td>';
}

//如果 有第五个星期,因为不是从1号不是星期一算起的,所以可能有第五个星期
if(lastDate-firstNum+7+7+7+7>0){ for(var i=firstNum+7+7+7;i<lastDate;i++){ fiveLine+='<td>'+(i+1)+'</td>';
}
$('.fiveLine').append(fiveLine);
}

$('.firstLine').append(firstLine);
$('.secondLine').append(secondLine);
$('.thirdLine').append(thirdLine);
$('.fourLine').append(fourLine);

  上面的做法可以做出一个正常的日历,不过有点傻瓜式的。不过观察js,我们可以发现这样的规律

就是for循环后面的 i +有一定规律的,每次都是+7的倍数。所以,我们整理一下,将上面的代码变成:

改变后:

html代码变为:

<table cellspacing="0">
<thead>
<tr class="thead">
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
<th>Sat</th>
<th>Sun</th>
</tr>
</thead>
<tbody id="tbody"></tbody>
</table>

 css代码保持不变:

table {
border-collapse: separate;
border-width: 0px 0px 1px 1px;
margin: 10px auto;
font-size: 20px;
}
td, th {
width: 81px;
height: 45px;
text-align: center;
vertical-align: middle;
color: #5d6b7a;
position: relative;
font-size: 16px;
} .thead th{
background-color: #ffa6a6;
color: white;
height: 50px;
font-weight: bold;
font-size: 14px;
}
/*匹配所有表格的奇数行*/
tbody tr:nth-child(2n+1){
background: #fff;
} /*匹配所有的偶数行*/
tbody tr:nth-child(2n){ background:#f5f8fc; }

 

js代码改变为:

	var today = new Date(); 

        today.setDate(1);  

//      获取每个月的第一天是星期几,这样决定日历在开始的位置
var week = today.getDay(); //获取当前月最后一天时间
var last=new Date(today.getFullYear(), today.getMonth()+1,0); // 获取最后一天是几号
var lastDate=last.getDate(); //1号的位置还有多少天,+1是因为求出的星期几时起始位置
var firstNum=Number(7-week+1); var y = last.getYear();
var m = last.getMonth()+1;
var d = last.getDate(); //获取当前月一共有几周
var weekNum=getMonthWeek(y, m, d); for(var i=0;i<weekNum;i++){
var dateList='';
var trList='';
// 第一个星期和最后一个星期分开处理 // 第一个星期
if(i<1){ for(var k=0;k<firstNum;k++){ dateList+='<td style="background:#fff;">'+(k+1)+'</td>';
} trList='<td style="background:#fff;" colspan="'+(week-1)+'">'+dateList+'</td>'; }else if(i<(weekNum-1)){ for(var k=firstNum+7*(i-1);k<firstNum+7*i;k++){
dateList+='<td>'+(k+1)+'</td>';
} trList='<tr>'+dateList+'</td>'; // 最后一个星期
}else{ for(var k=firstNum+7*(i-1); k<lastDate;k++){ dateList+='<td>'+(k+1)+'</td>';
} trList='<tr>'+dateList+'</td>';
} $('#tbody').append(trList); } //获取当前月一共有几周的函数
function getMonthWeek (a, b, c) { var date = new Date(a, parseInt(b) - 1, c);
var w = date.getDay();
var d = date.getDate();
return Math.ceil((d + 6 - w) / 7);
};

  

最后的效果图如下:当然样式要自己处理一下。最后部分的js其实还可以简化,这里就暂时不简化了。这个日历只是用来记录签到的

不可以自己选择月份,都是当前月的日历而已

【原】js 签到用日历的更多相关文章

  1. 原生js日历选择器,学习js面向对象开发日历插件

    在web开发过程中经常会碰到需要选择日期的功能,一般的操作都是在文本框点击,然后弹出日历选择框,直接选择日期就可以在文本框显示选择的日期.开发好之后给用户使用是很方便,但如果每一个日历选择器都要临时开 ...

  2. 原 JS监听回车事件

    原 JS监听回车事件 发表于2年前(2014-06-04 10:16)   阅读(6101) | 评论(0) 11人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC 源创会火热报名中,奖品多多哦  ...

  3. 一个js简单的日历显示效果的函数

    用一个函数简单的实现一个月份的日历,效果如下: 这个日历效果有高亮显示,我实现的思维比较简单. 我把上面的日历效果用表格table生成,分成两个部分. 第一个部分:就是前面的第一排,我用一行<t ...

  4. javascript js写特效日历

    <!doctype html public "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 纯JS写出日历

    封装代码: (function(cmf){ cmf.showDcalendar=function(){ var fnname=cmf.fn var id="cmfrili2" va ...

  6. js超简单日历

    用原生js写了一个超级简单的日历.当做是练习js中的Date类型. 思路: 获取某个日期,根据年份计算出每个月的天数. 利用Date中的getDay()知道该月份的第一天为星期几. 循环创建表格,显示 ...

  7. js 面向对象 模拟日历

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 自己用js写的日历(在考勤中使用,显示员工的日期的考勤情况)

    1.HTML部分 <div id="AttendanceDataDetailDiv"> <div class="A_close"> &l ...

  9. js写个日历

    其实我是一个对时间和日期不怎么感兴趣的人,小学的时候感觉时间或者日期那块就让我很晕,因为有时候是100进制有时候是60进制,搞的我对日历一直很不感兴趣,最近不知道为什么想写一个日历了,可想而知,这个玩 ...

随机推荐

  1. [BZOJ1854][Scoi2010]游戏(二分图匹配/并查集)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1854 分析:很裸的一道二分图匹配对吧,但是在hzwer的blog上看见神奇的并查集做法 ...

  2. Xen

    Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(“移植”)以在Xen ...

  3. java发送邮件

    1.需要用到javax.mail怎么下载呢?百度javax.mail就会看见http://www.oracle.com/technetwork/java/index-138643.html实际上这个项 ...

  4. PHP 异常

    <?php /* PHP 异常处理 什么是异常? PHP 5 提供了一种新的面向对象的错误处理方法. 异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程. 这种情况称为异常. 当异常被 ...

  5. Linux不重启的情况下添加硬盘

    众所周知,SATA和SCSI是支持热插拔的,但是新装了这类支持热插拔的驱动器,系统不会马上识别的,往往我们需要重启系统来识别,但是有另外一种方法可以很方面的让系统识别新的设备.作为系统管理员,需要了解 ...

  6. viewSub惰性装载器

    在需要的时候才解析,不耗费资源 <ViewStub android:id="@+id/stub" android:layout_width="wrap_conten ...

  7. git 查看生成对象

    1. find .   查看目录中所有对象 2. find .git/objects 查看所有对象 3. git cat-file -p 散列值  输出文件内容

  8. 【CodeVS 1199】【NOIP 2012】开车旅行

    http://codevs.cn/problem/1199/ 主要思想是倍增,对于第一个回答从后往前扫,依次插入平衡树中. 我写的splay,比较繁琐. #include<cmath> # ...

  9. Kernel Methods (2) Kernel function

    几个重要的问题 现在已经知道了kernel function的定义, 以及使用kernel后可以将非线性问题转换成一个线性问题. 在使用kernel 方法时, 如果稍微思考一下的话, 就会遇到以下几个 ...

  10. c# 导入导出Excel

    1.引用两个js Codaxy.Xlio.dllCodaxy.Xlio.XmlSerializers.dll 2.导出 public string EntityListToExcel(string p ...