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

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. TRUNK的作用功能.什么是TRUNK

    TRUNK的作用功能.什么是TRUNK(转)  [复制链接]   发表于 2011-11-24 11:01 | 来自  51CTO网页 在技术领域中把TRUNK翻译为中文是“主干.干线.中继线.长途线 ...

  2. 【摘抄】将xml注释文档生成网页

    config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath(&quo ...

  3. [cross domain] four approachs to cross domain in javascript

    four approachs can cross domain in javascript 1.jsonp 2.document.domain(only in frame and they have ...

  4. SharePoint 读取 Site Columns 的数据并绑定到DropdownList

    public void GetSiteColumns(DropDownList ddl, String siteColumn) { var fields = new SPSite(ProjectCon ...

  5. ETL利器Kettle实战应用解析系列一【Kettle使用介绍】

    本系列文章主要索引如下: 一.ETL利器Kettle实战应用解析系列一[Kettle使用介绍] 二.ETL利器Kettle实战应用解析系列二 [应用场景和实战DEMO下载] 三.ETL利器Kettle ...

  6. android studio-创建第一个项目

    打开android studio 开始界面和Xcode有点类似,点击New project新建一个工程,新建过程和在Eclipse上差不多,这里就不赘述了. 下面开始新建项目 填写项目名称,和存放地址 ...

  7. js-处理千分符

      <html> <head> <title> JS千分位处理 </title> </head> <script> functi ...

  8. C#-WinForm-弹窗提示框-如何知道用户点击的是哪个按钮?

    MessageBox.Show() 有21个重载 常用的弹窗提示框 1.一个参数,弹窗只有一个选项 2.三个参数,第一个参数是设置弹窗消息框中的文字内容:第二个参数是设置弹窗标题栏中显示的文本:第三个 ...

  9. DOS命令行下mysql 基本命令

    第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...

  10. Fiddler环境配置教程

    原理:安装Fiddler的电脑和将要进行检测的手机(iPhone.Android)加入同一局域网,这样手机上APP的请求就可以被电脑通过Fiddler抓取到. 局域网布置教程: 在将要布置局域网的电脑 ...