Vue.js创建Calendar日历效果


Posted in Javascript onNovember 03, 2016

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

Vue.js创建Calendar日历效果

Vue.js创建Calendar日历效果

html 部分

<div id="calendar">
 <!-- 年份 月份 -->
 <div class="month">
 <ul>
 <li class="arrow" @click="pickPre(currentYear,currentMonth)">❮</li>
 <li class="year-month" @click="pickYear(currentYear,currentMonth)">
 <span class="choose-year">{{ currentYear }}</span>
 <span class="choose-month">{{ currentMonth }}月</span>
 </li>
 <li class="arrow" @click="pickNext(currentYear,currentMonth)">❯</li>
 </ul>
 </div>
 <!-- 星期 -->
 <ul class="weekdays">
 <li>一</li>
 <li>二</li>
 <li>三</li>
 <li>四</li>
 <li>五</li>
 <li style="color:red">六</li>
 <li style="color:red">日</li>
 </ul>
 <!-- 日期 -->
 <ul class="days">
 <li @click="pick(day)" v-for="day in days">
 <!--本月-->
 <span v-if="day.getMonth()+1 != currentMonth" class="other-month">{{ day.getDate() }}</span>
 <span v-else>
 <!--今天-->
 <span v-if="day.getFullYear() == new Date().getFullYear() && day.getMonth() == new Date().getMonth() && day.getDate() == new Date().getDate()" class="active">{{ day.getDate() }}</span>
 <span v-else>{{ day.getDate() }}</span>
 </span>
 </li>
 </ul>
</div>

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

<script type="text/javascript">
 new Vue({
 el: '#calendar',
 data: {
 currentDay: 1,
 currentMonth: 1,
 currentYear: 1970,
 currentWeek: 1,
 days: [],
 },
 created: function() {
 this.initData(null);
 },
 methods: {
 initData: function(cur) {
 var date;
 if (cur) {
  date = new Date(cur);
 } else {
  date = new Date();
 }
 this.currentDay = date.getDate();
 this.currentYear = date.getFullYear();
 this.currentMonth = date.getMonth() + 1;
 this.currentWeek = date.getDay(); // 1...6,0
 if (this.currentWeek == 0) {
  this.currentWeek = 7;
 }
 var str = this.formatDate(this.currentYear , this.currentMonth, this.currentDay);
 console.log("today:" + str + "," + this.currentWeek);
 this.days.length = 0;
 // 今天是周日,放在第一行第7个位置,前面6个
 for (var i = this.currentWeek - 1; i >= 0; i--) {
  var d = new Date(str);
  d.setDate(d.getDate() - i);
  console.log("y:" + d.getDate());
  this.days.push(d);
 }
 for (var i = 1; i <= 35 - this.currentWeek; i++) {
  var d = new Date(str);
  d.setDate(d.getDate() + i);
  this.days.push(d);
 }
 },
 pick: function(date) {
 alert(this.formatDate( date.getFullYear() , date.getMonth() + 1, date.getDate()));
 },
 pickPre: function(year, month) {
 // setDate(0); 上月最后一天
 // setDate(-1); 上月倒数第二天
 // setDate(dx) 参数dx为 上月最后一天的前后dx天
 var d = new Date(this.formatDate(year , month , 1));
 d.setDate(0);
 this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
 },
 pickNext: function(year, month) {
 var d = new Date(this.formatDate(year , month , 1));
 d.setDate(35);
 this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
 },
 pickYear: function(year, month) {
 alert(year + "," + month);
 },
 
 // 返回 类似 2016-01-02 格式的字符串
 formatDate: function(year,month,day){
 var y = year;
 var m = month;
 if(m<10) m = "0" + m;
 var d = day;
 if(d<10) d = "0" + d;
 return y+"-"+m+"-"+d
 },
 },
 });
</script>

完整代码:

<!DOCTYPE html>
<html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>日历</title>
 <style type="text/css">
 * {
 box-sizing: border-box;
 }
 
 ul {
 list-style-type: none;
 }
 
 body {
 font-family: Verdana, sans-serif;
 background: #E8F0F3;
 }
 #calendar{
 width:80%;
 margin: 0 auto;
 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 rgba(0,0,0,0.12);
 }
 .month {
 width: 100%;
 background: #00B8EC;
 }
 
 .month ul {
 margin: 0;
 padding: 0;
 display: flex;
 justify-content: space-between;
 }
 
 .year-month {
 display: flex;
 flex-direction: column;
 align-items: center;
 justify-content: space-around;
 }
 
 .year-month:hover {
 background: rgba(150, 2, 12, 0.1);
 }
 
 .choose-year {
 padding-left: 20px;
 padding-right: 20px;
 }
 
 .choose-month {
 text-align: center;
 font-size: 1.5rem;
 }
 
 .arrow {
 padding: 30px;
 }
 
 .arrow:hover {
 background: rgba(100, 2, 12, 0.1);
 }
 
 .month ul li {
 color: white;
 font-size: 20px;
 text-transform: uppercase;
 letter-spacing: 3px;
 }
 
 .weekdays {
 margin: 0;
 padding: 10px 0;
 background-color: #00B8EC;
 display: flex;
 flex-wrap: wrap;
 color: #FFFFFF;
 justify-content: space-around;
 }
 
 .weekdays li {
 display: inline-block;
 width: 13.6%;
 text-align: center;
 }
 
 .days {
 padding: 0;
 background: #FFFFFF;
 margin: 0;
 display: flex;
 flex-wrap: wrap;
 justify-content: space-around;
 }
 
 .days li {
 list-style-type: none;
 display: inline-block;
 width: 14.2%;
 text-align: center;
 padding-bottom: 15px;
 padding-top: 15px;
 font-size: 1rem;
 color: #000;
 }
 
 .days li .active {
 padding: 6px 10px;
 border-radius: 50%;
 background: #00B8EC;
 color: #fff;
 }
 
 .days li .other-month {
 padding: 5px;
 color: gainsboro;
 }
 
 .days li:hover {
 background: #e1e1e1;
 }
 </style>
 </head>
 <body>
 <h1>CSS 日历</h1>
 <div id="calendar">
 <div class="month">
 <ul>
  <li class="arrow" @click="pickPre(currentYear,currentMonth)">❮</li>
  <li class="year-month" @click="pickYear(currentYear,currentMonth)">
  <span class="choose-year">{{ currentYear }}</span>
  <span class="choose-month">{{ currentMonth }}月</span>
  </li>
  <li class="arrow" @click="pickNext(currentYear,currentMonth)">❯</li>
 </ul>
 </div>
 <ul class="weekdays">
 <li>一</li>
 <li>二</li>
 <li>三</li>
 <li>四</li>
 <li>五</li>
 <li style="color:red">六</li>
 <li style="color:red">日</li>
 </ul>
 <ul class="days">
 <li @click="pick(day)" v-for="day in days">
  <!--今天-->
  <span v-if="day.getMonth()+1 != currentMonth" class="other-month">{{ day.getDate() }}</span>
  <span v-else>
  <!--今天-->
  <span v-if="day.getFullYear() == new Date().getFullYear() && day.getMonth() == new Date().getMonth() && day.getDate() == new Date().getDate()" class="active">{{ day.getDate() }}</span>
  <span v-else>{{ day.getDate() }}</span>
  </span>
 </li>
 </ul>
 </div>
 <script src="http://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.min.js" type="text/javascript" charset="utf-8"></script>
 <script type="text/javascript">
 new Vue({
 el: '#calendar',
 data: {
  currentDay: 1,
  currentMonth: 1,
  currentYear: 1970,
  currentWeek: 1,
  days: [],
 },
 created: function() {
  this.initData(null);
 },
 methods: {
  initData: function(cur) {
  var date;
  if (cur) {
  date = new Date(cur);
  } else {
  date = new Date();
  }
  this.currentDay = date.getDate();
  this.currentYear = date.getFullYear();
  this.currentMonth = date.getMonth() + 1;
  this.currentWeek = date.getDay(); // 1...6,0
  if (this.currentWeek == 0) {
  this.currentWeek = 7;
  }
  var str = this.formatDate(this.currentYear , this.currentMonth, this.currentDay);
  console.log("today:" + str + "," + this.currentWeek);
  this.days.length = 0;
  // 今天是周日,放在第一行第7个位置,前面6个
  for (var i = this.currentWeek - 1; i >= 0; i--) {
  var d = new Date(str);
  d.setDate(d.getDate() - i);
  console.log("y:" + d.getDate());
  this.days.push(d);
  }
  for (var i = 1; i <= 35 - this.currentWeek; i++) {
  var d = new Date(str);
  d.setDate(d.getDate() + i);
  this.days.push(d);
  }
  },
  pick: function(date) {
  alert(this.formatDate( date.getFullYear() , date.getMonth() + 1, date.getDate()));
  },
  pickPre: function(year, month) {
  // setDate(0); 上月最后一天
  // setDate(-1); 上月倒数第二天
  // setDate(dx) 参数dx为 上月最后一天的前后dx天
  var d = new Date(this.formatDate(year , month , 1));
  d.setDate(0);
  this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
  },
  pickNext: function(year, month) {
  var d = new Date(this.formatDate(year , month , 1));
  d.setDate(35);
  this.initData(this.formatDate(d.getFullYear(),d.getMonth() + 1,1));
  },
  pickYear: function(year, month) {
  alert(year + "," + month);
  },
  
  // 返回 类似 2016-01-02 格式的字符串
  formatDate: function(year,month,day){
  var y = year;
  var m = month;
  if(m<10) m = "0" + m;
  var d = day;
  if(d<10) d = "0" + d;
  return y+"-"+m+"-"+d
  },
 },
 });
 </script>
 </body>
</html>

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 Javascript
jQuery中将函数赋值给变量的调用方法
Mar 23 Javascript
解析javascript 数组以及json元素的添加删除
Jun 26 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
两种JS实现屏蔽鼠标右键的方法
Aug 20 Javascript
javascript检测移动设备横竖屏
May 21 Javascript
简单三步实现报表页面集成天气
Dec 15 Javascript
AngularJS入门示例之Hello World详解
Jan 04 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
JQuery.dataTables表格插件添加跳转到指定页
Jun 09 jQuery
JS数组splice操作实例分析
Oct 12 Javascript
JavaScript canvas绘制折线图
Feb 18 Javascript
AngularJS中transclude用法详解
Nov 03 #Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 #Javascript
AngularJS控制器之间的通信方式详解
Nov 03 #Javascript
最细致的vue.js基础语法 值得收藏!
Nov 03 #Javascript
AngularJS创建自定义指令的方法详解
Nov 03 #Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
Nov 03 #Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 #Javascript
You might like
使用apache模块rewrite_module (转)
2007/02/14 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
初始Nodejs
2014/11/08 NodeJs
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
Python中的枚举类型示例介绍
2019/01/09 Python
python实现XML解析的方法解析
2019/11/16 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
Java中实现多态的机制是什么?
2014/12/07 面试题
介绍一下游标
2012/01/10 面试题
幼儿园大班新学期寄语
2014/01/18 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
五年级学生期末评语
2014/12/26 职场文书
先进个人评语大全
2015/01/04 职场文书