欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue.js创建Calendar日历效果

程序员文章站 2023-11-21 14:55:40
使用 vue.js 进行数据与视图的绑定,数据更新会让视图自动进行更新,类似 android 里面的 databinding。 实现一个html的日历效果。...

使用 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前端组件学习教程》,欢迎大家学习阅读。

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