index.html 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>日历</title>
  7. <style>
  8. table {
  9. width: 320px;
  10. background: #333;
  11. color: #fff
  12. }
  13. td,
  14. th {
  15. text-align: center;
  16. height: 30px;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <table>
  22. <thead>
  23. <tr>
  24. <th colspan="2">
  25. <span class="left">
  26. <<
  27. </span>
  28. </th>
  29. <th colspan="3">
  30. <span class="time"></span>
  31. </th>
  32. <th colspan="2">
  33. <span class="right">>></span>
  34. </th>
  35. </tr>
  36. <tr>
  37. <th>日</th>
  38. <th>一</th>
  39. <th>二</th>
  40. <th>三</th>
  41. <th>四</th>
  42. <th>五</th>
  43. <th>六</th>
  44. </tr>
  45. </thead>
  46. <tbody class="main"></tbody>
  47. </table>
  48. <script>
  49. // 获取元素
  50. let oTime = $('.time')
  51. let oMain = $('.main')
  52. let leftBtn = $('.left')
  53. let rightBtn = $('.right')
  54. let time = new Date()
  55. createCells() // 1. 创建表格
  56. getPrevDays(time) // 2.获取上一个月占的格子
  57. getCurrentDays(time); // 3.获取当前月所占的格子数
  58. minHead(time) // 4.设置头部显示的内容
  59. mainList(time, getPrevDays(time), getCurrentDays(time)) // 5. 月份显示的详情
  60. leftBtn.onclick = function () { // 6.绑定两边的按钮 实现上一月下一月
  61. time.setMonth(time.getMonth() - 1)
  62. getPrevDays(time)
  63. getCurrentDays(time)
  64. minHead(time)
  65. mainList(time, getPrevDays(time), getCurrentDays(time))
  66. }
  67. rightBtn.onclick = function () {
  68. time.setMonth(time.getMonth() + 1)
  69. getPrevDays(time)
  70. getCurrentDays(time)
  71. minHead(time)
  72. mainList(time, getPrevDays(time), getCurrentDays(time))
  73. }
  74. /*
  75. *
  76. * 获取元素
  77. *
  78. */
  79. function $(container) {
  80. return document.querySelector(container)
  81. }
  82. /*
  83. *
  84. * 创建表格
  85. *
  86. */
  87. function createCells() {
  88. for (var i = 0; i < 6; i++) {
  89. var tr = document.createElement('tr')
  90. for (var k = 0; k < 7; k++) {
  91. var td = document.createElement('td')
  92. tr.appendChild(td)
  93. }
  94. oMain.appendChild(tr)
  95. }
  96. }
  97. /*
  98. *
  99. * getPrevDays 获取上一个月 占的格子
  100. *
  101. */
  102. function getPrevDays(time) {
  103. var time = new Date(time) // 拷贝一份时间 防止修改时间引发冲突
  104. var list = [] // 上一个月所占的天数
  105. time.setDate(1) // 设置为当月第一天方便查看是星期几
  106. var day = time.getDay() == 0 ? 7 : time.getDay() // 如果是0 说明需要空出来一行 显示上个月的时间
  107. // 获取上一个月的天数
  108. time.setDate(0)
  109. var maxDay = time.getDate()
  110. for (var i = maxDay; i > (maxDay - day); i--) {
  111. list.push(i)
  112. }
  113. list.reverse()
  114. return list
  115. }
  116. /*
  117. * 获取当月所占的格子
  118. */
  119. function getCurrentDays(time) {
  120. // debugger
  121. var time = new Date(time) // 拷贝一份时间 防止修改时间造成全局时间冲突
  122. time.setDate(1) // 确保不会出现跨越现象 比如1.31跑到三月份去了
  123. var list = []
  124. // 下面的代码是为了获取当前月的信息
  125. time.setMonth(time.getMonth() + 1)
  126. console.log(time.getMonth())
  127. time.setDate(0) // 修改日期0
  128. var maxDay = time.getDate() // 获取当月的天数
  129. for (var i = 1; i <= maxDay; i++) {
  130. list.push(i)
  131. }
  132. return list
  133. }
  134. /*
  135. * minHead 设置头部的显示
  136. */
  137. function minHead(time) {
  138. // oTime.innerHTML = time.getFullYear() + '年' + time.getMonth() + 1
  139. oTime.innerHTML = `${time.getFullYear()}年${time.getMonth() + 1}月`
  140. }
  141. function getYMD(time) {
  142. time = time || new Date()
  143. return `${time.getFullYear()}-${time.getMonth() + 1}-${time.getDate()}`
  144. }
  145. /*
  146. * 月份显示的详情 上个月最后 + 本月 + 下个月开始的
  147. */
  148. function mainList(time, prevDays, currentDays) {
  149. var beforeCount = prevDays.length + currentDays.length
  150. var cellList = document.querySelectorAll('td')
  151. // 1. 展示上个月的
  152. for (var i = 0; i < prevDays.length; i++) {
  153. cellList[i].innerHTML = `<font color='red'>${prevDays[i]}</font>`
  154. }
  155. // 2. 展示本月的
  156. for (var i = 0; i < currentDays.length; i++) {
  157. if (getYMD() === getYMD(time) && currentDays[i] == time.getDate()) { // 如果是今天 展示另外一种颜色
  158. cellList[i + prevDays.length].innerHTML = `<font color='yellow'>${currentDays[i]}</font>`
  159. } else {
  160. cellList[i + prevDays.length].innerHTML = `<font color='white'>${currentDays[i]}</font>`
  161. }
  162. }
  163. // 3. 展示下个月的
  164. for (var i = 1; i < (42 - beforeCount); i++) {
  165. cellList[i + beforeCount - 1].innerHTML = `<font color='red'>${i}</font>`
  166. }
  167. }
  168. </script>
  169. </body>
  170. </html>