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

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其实还可以简化,这里就暂时不简化了。这个日历只是用来记录签到的

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

java 实现签到签退 js签到功能代码_css