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

html代码:

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

 css代码:

  1. table {
  2. border-collapse: separate;
  3. border-width: 0px 0px 1px 1px;
  4. margin: 10px auto;
  5. font-size: 20px;
  6. }
  7. td, th {
  8. width: 81px;
  9. height: 45px;
  10. text-align: center;
  11. vertical-align: middle;
  12. color: #5d6b7a;
  13. position: relative;
  14. font-size: 16px;
  15. }
  16.  
  17. .thead th{
  18. background-color: #ffa6a6;
  19. color: white;
  20. height: 50px;
  21. font-weight: bold;
  22. font-size: 14px;
  23. }
  24. /*匹配所有表格的奇数行*/
  25. tbody tr:nth-child(2n+1){
  26. background: #fff;
  27. }
  28.  
  29. /*匹配所有的偶数行*/
  30. tbody tr:nth-child(2n){
  31.  
  32. background:#f5f8fc;
  33.  
  34. }

 js代码如下:

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

  18.      //每一行的数字
  19. var firstLine='';
  20. var secondLine='';
  21. var thirdLine='';
  22. var fourLine='';
  23. var fiveLine='';
  24.  
  25. // 第一个星期天数
  26. for(var i=0;i<firstNum;i++){
  27. firstLine+='<td>'+(i+1)+'</td>';
  28. }
  29. // 第二个星期天数
  30. for(var i=firstNum;i<firstNum+7;i++){
  31. secondLine+='<td>'+(i+1)+'</td>';
  32. }
  33. // 第三个星期天数
  34. for(var i=firstNum+7;i<firstNum+7+7;i++){
  35. thirdLine+='<td>'+(i+1)+'</td>';
  36. }
  37. // 第四个星期天数
    for(var i=firstNum+7+7;i<firstNum+7+7+7;i++){
  38. fourLine+='<td>'+(i+1)+'</td>';
    }

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

  48. $('.firstLine').append(firstLine);
  49. $('.secondLine').append(secondLine);
  50. $('.thirdLine').append(thirdLine);
  51. $('.fourLine').append(fourLine);

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

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

改变后:

html代码变为:

  1. <table cellspacing="0">
  2. <thead>
  3. <tr class="thead">
  4. <th>Mon</th>
  5. <th>Tue</th>
  6. <th>Wed</th>
  7. <th>Thu</th>
  8. <th>Fri</th>
  9. <th>Sat</th>
  10. <th>Sun</th>
  11. </tr>
  12. </thead>
  13. <tbody id="tbody"></tbody>
  14. </table>

 css代码保持不变:

  1. table {
  2. border-collapse: separate;
  3. border-width: 0px 0px 1px 1px;
  4. margin: 10px auto;
  5. font-size: 20px;
  6. }
  7. td, th {
  8. width: 81px;
  9. height: 45px;
  10. text-align: center;
  11. vertical-align: middle;
  12. color: #5d6b7a;
  13. position: relative;
  14. font-size: 16px;
  15. }
  16.  
  17. .thead th{
  18. background-color: #ffa6a6;
  19. color: white;
  20. height: 50px;
  21. font-weight: bold;
  22. font-size: 14px;
  23. }
  24. /*匹配所有表格的奇数行*/
  25. tbody tr:nth-child(2n+1){
  26. background: #fff;
  27. }
  28.  
  29. /*匹配所有的偶数行*/
  30. tbody tr:nth-child(2n){
  31.  
  32. background:#f5f8fc;
  33.  
  34. }

 

js代码改变为:

  1. var today = new Date();
  2.  
  3. today.setDate(1);
  4.  
  5. // 获取每个月的第一天是星期几,这样决定日历在开始的位置
  6. var week = today.getDay();
  7.  
  8. //获取当前月最后一天时间
  9. var last=new Date(today.getFullYear(), today.getMonth()+1,0);
  10.  
  11. // 获取最后一天是几号
  12. var lastDate=last.getDate();
  13.  
  14. //1号的位置还有多少天,+1是因为求出的星期几时起始位置
  15. var firstNum=Number(7-week+1);
  16.  
  17. var y = last.getYear();
  18. var m = last.getMonth()+1;
  19. var d = last.getDate();
  20.  
  21. //获取当前月一共有几周
  22. var weekNum=getMonthWeek(y, m, d);
  23.  
  24. for(var i=0;i<weekNum;i++){
  25. var dateList='';
  26. var trList='';
  27. // 第一个星期和最后一个星期分开处理
  28.  
  29. // 第一个星期
  30. if(i<1){
  31.  
  32. for(var k=0;k<firstNum;k++){
  33.  
  34. dateList+='<td style="background:#fff;">'+(k+1)+'</td>';
  35. }
  36.  
  37. trList='<td style="background:#fff;" colspan="'+(week-1)+'">'+dateList+'</td>';
  38.  
  39. }else if(i<(weekNum-1)){
  40.  
  41. for(var k=firstNum+7*(i-1);k<firstNum+7*i;k++){
  42. dateList+='<td>'+(k+1)+'</td>';
  43. }
  44.  
  45. trList='<tr>'+dateList+'</td>';
  46.  
  47. // 最后一个星期
  48. }else{
  49.  
  50. for(var k=firstNum+7*(i-1); k<lastDate;k++){
  51.  
  52. dateList+='<td>'+(k+1)+'</td>';
  53. }
  54.  
  55. trList='<tr>'+dateList+'</td>';
  56. }
  57.  
  58. $('#tbody').append(trList);
  59.  
  60. }
  61.  
  62. //获取当前月一共有几周的函数
  63. function getMonthWeek (a, b, c) {
  64.  
  65. var date = new Date(a, parseInt(b) - 1, c);
  66. var w = date.getDay();
  67. var d = date.getDate();
  68. return Math.ceil((d + 6 - w) / 7);
  69. };

  

最后的效果图如下:当然样式要自己处理一下。最后部分的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. Uwp Windows10获取设备位置(经纬度)

    先在Package.appxmanifest中配置位置权限 2. 创建LocationManager类 using System; using System.Collections.Generic; ...

  2. PotPlayer为播放而生的专业播放器

    韩国,比较牛逼的视频播放器.专注与本地视频播放,值得拥有.... 免费下载:http://yunpan.cn/cmZ5ELC6DTI8Y  访问密码 4bf1

  3. 0924Linux常用命令

    写的不错 转载了,有需要的同学们,可以多多学习,适合小白哦 http://blog.csdn.net/xiaoguaihai/article/details/8705992/ 关于最后增加一点 tar ...

  4. 文本溢出省略解决笔记css

    text-overflow:ellipsis; overflow:hidden; white-space:nowrap; *white-space:nowrap;

  5. python中的字符数字之间的转换函数

    int(x [,base ])         将x转换为一个整数     long(x [,base ])        将x转换为一个长整数     float(x )               ...

  6. Java 日期比较以及得到前后一天

    /** * 比较两个指定时间,结果为0 表示相同,< 0 则表示第一个时间早于第二个时间 * @param firstDay * @param secondDay * @return */ pu ...

  7. Maven-搭建普通maven项目

    点击Eclipse菜单栏File->New->Ohter->Maven得到如下图所示对话框: 选中Maven Project并点击Next,到下一个对话框(默认)继续点击Next得到 ...

  8. wamp 中如何管理两个dedeCms站点

    本文以WampServer2.1为例,图文说明开启wamp虚拟主机功能,也就是绑定多域名,开启多站点搭建功能. 1.  我们一键安装wamp到E盘,并可以正常启动,状态如下图所示:  

  9. bzoj4349: 最小树形图&&bzoj2260: 商店购物

    双倍经验大法吼 昨天发现不会最小属性图&朱刘算法啊 吓得我赶紧补了一发 朱刘算法模板题 #include <iostream> #include <cstdio> #i ...

  10. Android面试总结 (转)

    1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指 ...