当前位置:Gxlcms > JavaScript > Vue.js创建Calendar日历效果

Vue.js创建Calendar日历效果

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

使用 Vue.js 进行数据与视图的绑定,数据更新会让视图自动进行更新,类似 Android 里面的 DataBinding。
实现一个HTML的日历效果。

20161114114050736.jpg

201611141405424.gif

html 部分

  1. <p id="calendar">
  2. <!-- 年份 月份 -->
  3. <p class="month">
  4. <ul>
  5. <li class="arrow" @click="pickPre(currentYear,currentMonth)">❮</li>
  6. <li class="year-month" @click="pickYear(currentYear,currentMonth)">
  7. <span class="choose-year">{{ currentYear }}</span>
  8. <span class="choose-month">{{ currentMonth }}月</span>
  9. </li>
  10. <li class="arrow" @click="pickNext(currentYear,currentMonth)">❯</li>
  11. </ul>
  12. </p>
  13. <!-- 星期 -->
  14. <ul class="weekdays">
  15. <li>一</li>
  16. <li>二</li>
  17. <li>三</li>
  18. <li>四</li>
  19. <li>五</li>
  20. <li style="color:red">六</li>
  21. <li style="color:red">日</li>
  22. </ul>
  23. <!-- 日期 -->
  24. <ul class="days">
  25. <li @click="pick(day)" v-for="day in days">
  26. <!--本月-->
  27. <span v-if="day.getMonth()+1 != currentMonth" class="other-month">{{ day.getDate() }}</span>
  28. <span v-else>
  29. <!--今天-->
  30. <span v-if="day.getFullYear() == new Date().getFullYear() && day.getMonth() == new Date().getMonth()
  31. && day.getDate() == new Date().getDate()" class="active">{{ day.getDate() }}</span>
  32. <span v-else>{{ day.getDate() }}</span>
  33. </span>
  34. </li>
  35. </ul>
  36. </p>

id 为 calendar 对应的创建一个 Vue 对象,设置 el 为 ‘#calendar'。

  1. <script type="text/javascript">
  2. new Vue({
  3. el: '#calendar',
  4. data: {
  5. currentDay: 1,
  6. currentMonth: 1,
  7. currentYear: 1970,
  8. currentWeek: 1,
  9. days: [],
  10. },
  11. created: function() {
  12. this.initData(null);
  13. },
  14. methods: {
  15. initData: function(cur) {
  16. var date;
  17. if (cur) {
  18. date = new Date(cur);
  19. } else {
  20. date = new Date();
  21. }
  22. this.currentDay = date.getDate();
  23. this.currentYear = date.getFullYear();
  24. this.currentMonth = date.getMonth() + 1;
  25. this.currentWeek = date.getDay(); // 1...6,0
  26. if (this.currentWeek == 0) {
  27. this.currentWeek = 7;
  28. }
  29. var str = this.formatDate(this.currentYear , this.currentMonth, this.currentDay);
  30. console.log("today:" + str + "," + this.currentWeek);
  31. this.days.length = 0;
  32. // 今天是周日,放在第一行第7个位置,前面6个
  33. for (var i = this.currentWeek - 1; i >= 0; i--) {
  34. var d = new Date(str);
  35. d.setDate(d.getDate() - i);
  36. console.log("y:" + d.getDate());
  37. this.days.push(d);
  38. }
  39. for (var i = 1; i <= 35 - this.currentWeek; i++) {
  40. var d = new Date(str);
  41. d.setDate(d.getDate() + i);
  42. this.days.push(d);
  43. }
  44. },
  45. pick: function(date) {
  46. alert(this.formatDate( date.getFullYear() , date.getMonth() + 1, date.getDate()));
  47. },
  48. pickPre: function(year, month) {
  49. // setDate(0); 上月最后一天
  50. // setDate(-1); 上月倒数第二天
  51. // setDate(dx) 参数dx为 上月最后一天的前后dx天
  52. var d = new Date(this.formatDate(year , month , 1));
  53. d.setDate(0);
  54. this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
  55. },
  56. pickNext: function(year, month) {
  57. var d = new Date(this.formatDate(year , month , 1));
  58. d.setDate(35);
  59. this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
  60. },
  61. pickYear: function(year, month) {
  62. alert(year + "," + month);
  63. },
  64. // 返回 类似 2016-01-02 格式的字符串
  65. formatDate: function(year,month,day){
  66. var y = year;
  67. var m = month;
  68. if(m<10) m = "0" + m;
  69. var d = day;
  70. if(d<10) d = "0" + d;
  71. return y+"-"+m+"-"+d
  72. },
  73. },
  74. });
  75. </script>

完整代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>日历</title>
  6. <style type="text/css">
  7. * {
  8. box-sizing: border-box;
  9. }
  10. ul {
  11. list-style-type: none;
  12. }
  13. body {
  14. font-family: Verdana, sans-serif;
  15. background: #E8F0F3;
  16. }
  17. #calendar{
  18. width:80%;
  19. margin: 0 auto;
  20. box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.1), 0 1px 5px 0
  21. rgba(0,0,0,0.12);
  22. }
  23. .month {
  24. width: 100%;
  25. background: #00B8EC;
  26. }
  27. .month ul {
  28. margin: 0;
  29. padding: 0;
  30. display: flex;
  31. justify-content: space-between;
  32. }
  33. .year-month {
  34. display: flex;
  35. flex-direction: column;
  36. align-items: center;
  37. justify-content: space-around;
  38. }
  39. .year-month:hover {
  40. background: rgba(150, 2, 12, 0.1);
  41. }
  42. .choose-year {
  43. padding-left: 20px;
  44. padding-right: 20px;
  45. }
  46. .choose-month {
  47. text-align: center;
  48. font-size: 1.5rem;
  49. }
  50. .arrow {
  51. padding: 30px;
  52. }
  53. .arrow:hover {
  54. background: rgba(100, 2, 12, 0.1);
  55. }
  56. .month ul li {
  57. color: white;
  58. font-size: 20px;
  59. text-transform: uppercase;
  60. letter-spacing: 3px;
  61. }
  62. .weekdays {
  63. margin: 0;
  64. padding: 10px 0;
  65. background-color: #00B8EC;
  66. display: flex;
  67. flex-wrap: wrap;
  68. color: #FFFFFF;
  69. justify-content: space-around;
  70. }
  71. .weekdays li {
  72. display: inline-block;
  73. width: 13.6%;
  74. text-align: center;
  75. }
  76. .days {
  77. padding: 0;
  78. background: #FFFFFF;
  79. margin: 0;
  80. display: flex;
  81. flex-wrap: wrap;
  82. justify-content: space-around;
  83. }
  84. .days li {
  85. list-style-type: none;
  86. display: inline-block;
  87. width: 14.2%;
  88. text-align: center;
  89. padding-bottom: 15px;
  90. padding-top: 15px;
  91. font-size: 1rem;
  92. color: #000;
  93. }
  94. .days li .active {
  95. padding: 6px 10px;
  96. border-radius: 50%;
  97. background: #00B8EC;
  98. color: #fff;
  99. }
  100. .days li .other-month {
  101. padding: 5px;
  102. color: gainsboro;
  103. }
  104. .days li:hover {
  105. background: #e1e1e1;
  106. }
  107. </style>
  108. </head>
  109. <body>
  110. <h1>CSS 日历</h1>
  111. <p id="calendar">
  112. <p class="month">
  113. <ul>
  114. <li class="arrow" @click="pickPre(currentYear,currentMonth)">❮</li>
  115. <li class="year-month" @click="pickYear(currentYear,currentMonth)">
  116. <span class="choose-year">{{ currentYear }}</span>
  117. <span class="choose-month">{{ currentMonth }}月</span>
  118. </li>
  119. <li class="arrow" @click="pickNext(currentYear,currentMonth)">❯</li>
  120. </ul>
  121. </p>
  122. <ul class="weekdays">
  123. <li>一</li>
  124. <li>二</li>
  125. <li>三</li>
  126. <li>四</li>
  127. <li>五</li>
  128. <li style="color:red">六</li>
  129. <li style="color:red">日</li>
  130. </ul>
  131. <ul class="days">
  132. <li @click="pick(day)" v-for="day in days">
  133. <!--今天-->
  134. <span v-if="day.getMonth()+1 != currentMonth" class="other-month">{{ day.getDate() }}</span>
  135. <span v-else>
  136. <!--今天-->
  137. <span v-if="day.getFullYear() == new Date().getFullYear() && day.getMonth() == new
  138. Date().getMonth() && day.getDate() == new Date().getDate()" class="active">{{ day.getDate() }}</span>
  139. <span v-else>{{ day.getDate() }}</span>
  140. </span>
  141. </li>
  142. </ul>
  143. </p>
  144. <script src="http://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.min.js" type="text/javascript"
  145. charset="utf-8"></script>
  146. <script type="text/javascript">
  147. new Vue({
  148. el: '#calendar',
  149. data: {
  150. currentDay: 1,
  151. currentMonth: 1,
  152. currentYear: 1970,
  153. currentWeek: 1,
  154. days: [],
  155. },
  156. created: function() {
  157. this.initData(null);
  158. },
  159. methods: {
  160. initData: function(cur) {
  161. var date;
  162. if (cur) {
  163. date = new Date(cur);
  164. } else {
  165. date = new Date();
  166. }
  167. this.currentDay = date.getDate();
  168. this.currentYear = date.getFullYear();
  169. this.currentMonth = date.getMonth() + 1;
  170. this.currentWeek = date.getDay(); // 1...6,0
  171. if (this.currentWeek == 0) {
  172. this.currentWeek = 7;
  173. }
  174. var str = this.formatDate(this.currentYear , this.currentMonth, this.currentDay);
  175. console.log("today:" + str + "," + this.currentWeek);
  176. this.days.length = 0;
  177. // 今天是周日,放在第一行第7个位置,前面6个
  178. for (var i = this.currentWeek - 1; i >= 0; i--) {
  179. var d = new Date(str);
  180. d.setDate(d.getDate() - i);
  181. console.log("y:" + d.getDate());
  182. this.days.push(d);
  183. }
  184. for (var i = 1; i <= 35 - this.currentWeek; i++) {
  185. var d = new Date(str);
  186. d.setDate(d.getDate() + i);
  187. this.days.push(d);
  188. }
  189. },
  190. pick: function(date) {
  191. alert(this.formatDate( date.getFullYear() , date.getMonth() + 1, date.getDate()));
  192. },
  193. pickPre: function(year, month) {
  194. // setDate(0); 上月最后一天
  195. // setDate(-1); 上月倒数第二天
  196. // setDate(dx) 参数dx为 上月最后一天的前后dx天
  197. var d = new Date(this.formatDate(year , month , 1));
  198. d.setDate(0);
  199. this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
  200. },
  201. pickNext: function(year, month) {
  202. var d = new Date(this.formatDate(year , month , 1));
  203. d.setDate(35);
  204. this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
  205. },
  206. pickYear: function(year, month) {
  207. alert(year + "," + month);
  208. },
  209. // 返回 类似 2016-01-02 格式的字符串
  210. formatDate: function(year,month,day){
  211. var y = year;
  212. var m = month;
  213. if(m<10) m = "0" + m;
  214. var d = day;
  215. if(d<10) d = "0" + d;
  216. return y+"-"+m+"-"+d
  217. },
  218. },
  219. });
  220. </script>
  221. </body>
  222. </html>

以上就是Vue.js创建Calendar日历效果的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!

人气教程排行