当前位置:Gxlcms > JavaScript > JS实现一个简单的日历

JS实现一个简单的日历

时间:2021-07-01 10:21:17 帮助过:6人阅读

主要分为三个部分,1:获取li元素 2:如何填写对应的日期 3:如何获取点击li元素的事件。

1:通过节点间关系的属性children 获取li元素(两个for循坏遍历);

2:在遍历填写日期时,在第一行判断在当月的第一天在星期几,然后从第一天开始填写,直到大于当月的天数就暂停填写,并开始填写下个月的日期。第一行上个月的日期显示 : 上月天数显示开始值 = 计算上个月的天数 - 这个月开始的第一天在星期几的值 -1,然后在第一行上月天数显示开始值自加。

3:利用JS的事件冒泡获取li的innerHTML显示出对应日期

效果图:

JS实现一个简单的日历

代码如下:


  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="Generator" content="EditPlus®">
  6. <meta name="Author" content="">
  7. <meta name="Keywords" content="">
  8. <meta name="Description" content="">
  9. <title>calendar</title>
  10. <style>
  11. .clear:after{
  12. content:"";
  13. display:table;
  14. clear:both;
  15. }
  16. .left{
  17. float:left;
  18. }
  19. ul{
  20. padding:0px;
  21. margin-top:5px;
  22. margin-bottom:0px;
  23. }
  24. ul>li{
  25. float:left;
  26. list-style:none;
  27. width:30px;
  28. height: 21px;
  29. border: 1px solid #ccc;
  30. text-align:center;
  31. }
  32. .gray{
  33. color:#766565;
  34. }
  35. .top {
  36. height:25px;
  37. }
  38. .top .lf-tri{
  39. border:10px solid transparent;
  40. border-right-color:black;
  41. margin-top:4px;
  42. }
  43. .top .rf-tri{
  44. border:10px solid transparent;
  45. border-left-color:black;
  46. margin-top:4px;
  47. }
  48. .top .content{
  49. width:185px;
  50. height:5px;
  51. text-align:center;
  52. }
  53. </style>
  54. </head>
  55. <body>
  56. <p class="top clear">
  57. <p class="left lf-tri" onclick="lastMonth()"></p>
  58. <p class="left content">2017年2月1日</p>
  59. <p class="left rf-tri" onclick=" nextMonth()"></p>
  60. </p>
  61. <p>
  62. <p id="week">
  63. <ul class="clear">
  64. <li>日</li>
  65. <li>一</li>
  66. <li>二</li>
  67. <li>三</li>
  68. <li>四</li>
  69. <li>五</li>
  70. <li>六</li>
  71. <ul>
  72. </p>
  73. <p id="date" onclick='getDateNum(event)'>
  74. <ul class="clear">
  75. <li>30</li>
  76. <li>31</li>
  77. <li>1</li>
  78. <li>2</li>
  79. <li>3</li>
  80. <li>4</li>
  81. <li>5</li>
  82. </ul>
  83. <ul class="clear">
  84. <li>6</li>
  85. <li>7</li>
  86. <li>8</li>
  87. <li>9</li>
  88. <li>10</li>
  89. <li>11</li>
  90. <li>12</li>
  91. </ul>
  92. <ul class="clear">
  93. <li>13</li>
  94. <li>14</li>
  95. <li>15</li>
  96. <li>16</li>
  97. <li>17</li>
  98. <li>18</li>
  99. <li>19</li>
  100. </ul>
  101. <ul class="clear">
  102. <li>20</li>
  103. <li>21</li>
  104. <li>22</li>
  105. <li>23</li>
  106. <li>24</li>
  107. <li>25</li>
  108. <li>26</li>
  109. </ul>
  110. <ul class="clear">
  111. <li>27</li>
  112. <li>28</li>
  113. <li>1</li>
  114. <li>2</li>
  115. <li>3</li>
  116. <li>4</li>
  117. <li>5</li>
  118. </ul>
  119. <ul class="clear">
  120. <li>27</li>
  121. <li>28</li>
  122. <li>1</li>
  123. <li>2</li>
  124. <li>3</li>
  125. <li>4</li>
  126. <li>5</li>
  127. </ul>
  128. </p>
  129. <p>
  130. <script>
  131. function $(id){
  132. return document.getElementById(id);
  133. }
  134. function change(cls){
  135. return document.getElementsByClassName(cls);
  136. }
  137. function getDateNum(e) {
  138. console.log(e && e.target.nodeName)//打印发生事件的元素,再获取元素nodeName
  139. if(e.target.nodeName=="LI"){//先判断nodeName是LI
  140. if(e.target.className!="gray"){//点击本月的日期,显示在日期栏
  141. change("content")[0].innerHTML = year+'年'+(month+1)+'月'+e.target.innerHTML+'日';
  142. }else{//点击灰色日期即(上个月或者下个月日期)切换到当月
  143. if(e.target.innerHTML>14){
  144. lastMonth();
  145. }else {
  146. nextMonth();
  147. }
  148. }
  149. }
  150. }
  151. //获取年、月
  152. var today = new Date();
  153. var year=today.getFullYear(), month = today.getMonth();
  154. var totalDay;
  155. var uls=$("date").children,list;
  156. function loadCalendar(){
  157. totalDay=getMonthDays(year,month+1);//计算一个月的天数
  158. var firstDay = (new Date(year,month,1)).getDay();//计算每个月1号在星期几
  159. var lastMonthDay=getMonthDays(year,month);
  160. var lastDayCal=lastMonthDay-firstDay+1;//计算上个月在第一行显示的天数
  161. //获取ul元素
  162. var num=1 ,nextNum=1;//日期显示
  163. // 类数组对象 转 数组
  164. //uls = Array.prototype.slice.call(uls)
  165. //获取li元素 填充
  166. for(var r=0;r<uls.length;r++){
  167. list=uls[r].children;//遍历ul,获得li
  168. for(var line=0;line<list.length;line++){
  169. if(r==0){//在第一行 与第一天进行判断 大于等于第一天时载入日期
  170. if(line>=firstDay){
  171. list[line].innerHTML=num++;
  172. list[line].setAttribute("class","");
  173. }else {
  174. list[line].innerHTML=lastDayCal++;//第一行的上个月天数显示
  175. list[line].setAttribute("class","gray");
  176. }
  177. }else {
  178. //判断是否超出天数 ,不超出则继续加,超出则显示下个月日期
  179. if(num<=totalDay){
  180. list[line].setAttribute("class","");
  181. list[line].innerHTML=num++;
  182. }else {
  183. list[line].innerHTML=nextNum++;//下个月日期显示
  184. list[line].setAttribute("class","gray");
  185. }
  186. }
  187. }
  188. }
  189. }
  190. loadCalendar();
  191. function getMonthDays(year,month){
  192. //判断2月份天数
  193. if(month==2){
  194. days= (year%4==0)&&(year%100!=0)||(year%400==0)? 29:28;
  195. }else {
  196. //1-7月 单数月为31日
  197. if(month<7){
  198. days= month%2==1?31:30;
  199. }else {
  200. //8-12月 双月为31日
  201. days = month%2==0?31:30;
  202. }
  203. }
  204. return days;
  205. }
  206. //右击箭头下个月
  207. //change("rf-tri")[0].onclick =
  208. function nextMonth() {
  209. month++;
  210. if(month>11){
  211. year+=1;
  212. month=0;
  213. }
  214. change("content")[0].innerHTML=year+"年"+(month+1)+"月"+"1日";
  215. //console.log(month+1);
  216. loadCalendar();
  217. }
  218. //左击箭头上个月
  219. //change("lf-tri")[0].onclick =
  220. function lastMonth() {
  221. month--;
  222. if(month<0){
  223. month=11;
  224. year-=1;
  225. }
  226. change("content")[0].innerHTML=year+"年"+(month+1)+"月"+"1日";
  227. //console.log(month+1);
  228. loadCalendar();
  229. }
  230. </script>
  231. </body>
  232. </html>

更多JS实现一个简单的日历相关文章请关注PHP中文网!

人气教程排行