• 【原】js 签到用日历


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

    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- 0px 0px 1px 1px;
    	margin: 10px auto;
    	font-size: 20px;
    }
    td, th {
    	 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- 0px 0px 1px 1px;
    	margin: 10px auto;
    	font-size: 20px;
    }
    td, th {
    	 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其实还可以简化,这里就暂时不简化了。这个日历只是用来记录签到的

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

  • 相关阅读:
    php代码中注释的含义
    MySql-count(*)与count(id)与count(字段)之间的执行结果和性能分析
    mysql通配符进行模糊查询
    我的娃,我的宝贝
    Yii 2.0 query模式语法
    Yii 2.0版本调试输出SQL语句
    mysql高效率随机获取n条数据写法
    mysql语句中判断是否包含某字符串的方法
    应该让老婆多休息
    win10常用快捷键总结
  • 原文地址:https://www.cnblogs.com/xianyulaodi/p/5235537.html
Copyright © 2020-2023  润新知