实现一个日期组件,如图:

components.js代码如下:


Vue.component('sc-calendar',{
template:'<div class="scCalendar">' +
'<div class="calendar_header">' +
'<div class="prev" @click="prevMonth"> < </div>' +
'<span class="text_year">{{currentYear}}年</span>' +
'<span class="text_month">{{currentMonth}}月</span>' +
'<div class="next" @click="nextMonth"> > </div>' +
'</div>' +
'<div class="calendar_content">' +
'<ul class="week">' +
'<li v-for="item in weeks">{{item}}</li>' +
'</ul>' +
'<ul class="day">' +
'<li v-for="item in dayList" :class="{marginRight0:item.marginRight0}">{{item.text}}</li>' +
'</ul>' +
'</div>' +
'</div>',
data:function(){
return {
weeks: ['日', '一', '二', '三', '四', '五', '六'],
dayList:[],
currentYear:'',
currentMonth: ''
}
},
created:function(){
var date=new Date;
this.currentYear = date.getFullYear();
this.currentMonth = date.getMonth()+1;
this.calDay(this.currentYear, this.currentMonth); },
methods:{
//计算指定月份的天数
calDay:function(year,month){
var oDate = new Date();
//setFullYear(year,month,day) 方法用于设置年份,返回调整过的日期的毫秒表示。
oDate.setFullYear(year, month-1,1);
oDate.setDate(1);//设置一个月中的第一天
var oNow = oDate.getDay();//当前月的第一天是星期几
var dayNum = 0; //指定月份的天数
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
dayNum = 31;
}else if(month==4 || month==6 || month==9 || month==11){
dayNum = 30;
}else if(month==2&&this.isLeaYear(year)){
dayNum = 29;
}else{
dayNum = 28;
}
var SumDayLiNum = 0;//总共的格子数
var lastNum = (dayNum-(7-oNow))%7; //最后剩余的数
lastNum = lastNum == 0?0:7;
SumDayLiNum = 7 + parseInt((dayNum-(7-oNow))/7)*7+lastNum;
this.showDayList(dayNum,SumDayLiNum,oNow);
},
//判断是否是闰年
isLeaYear:function(year){
if(year%4==0&&year%100!=0){
return true;
}else{
if(year%400==0){
return true;
}else{
return false;
}
}
},
//显示当前日历内容
showDayList:function(dayNum,SumDayLiNum,oNow){
this.dayList = [];
var rows = parseInt(SumDayLiNum/7);
var cols = 7;
for(var i=0;i<rows;i++){
for(var j=0;j<cols ;j++){
if(j == cols-1){
this.dayList.push({
text:'',
marginRight0:true
})
}else{
this.dayList.push({
text:'',
marginRight0:false
})
}
}
}
for(var z=1;z<=dayNum;z++){
this.dayList[oNow].text = z;
oNow++;
}
},
prevMonth:function(){
if( this.currentMonth == 1){
this.currentYear = this.currentYear - 1;
this.currentMonth = 12;
}else{
this.currentMonth = this.currentMonth - 1;
}
this.calDay(this.currentYear, this.currentMonth);
},
nextMonth:function(){
if( this.currentMonth == 12){
this.currentYear = this.currentYear + 1;
this.currentMonth = 1;
}else{
this.currentMonth = this.currentMonth + 1;
}
this.calDay(this.currentYear, this.currentMonth);
} }
});

ccal.css代码:

html {
font-family: '微软雅黑';
}
body,
div,
span,
img,
ul,
li,
p {
margin: 0;
padding: 0;
}
ul,
li {
list-style: none;
}
.commonprev {
width: 0.46666667rem;
height: 0.93333333rem;
color: #ffffff;
position: absolute;
display: inline-block;
}
.commonyear {
width: 5.46666667rem;
height: 1.6rem;
font-size: 1rem;
color: #ffffff;
position: absolute;
}
.scCalendar {
width: 25rem;
height: 21.66666667rem;
background: #005498;
background-size: 100%;
}
.scCalendar .calendar_header {
height: 2.93333333rem;
width: 100%;
position: relative;
line-height: 2.93333333rem;
}
.scCalendar .calendar_header .prev {
width: 0.46666667rem;
height: 0.93333333rem;
color: #ffffff;
position: absolute;
display: inline-block;
left: 2.76666667rem;
}
.scCalendar .calendar_header .next {
width: 0.46666667rem;
height: 0.93333333rem;
color: #ffffff;
position: absolute;
display: inline-block;
right: 2.76666667rem;
}
.scCalendar .calendar_header .text_year {
width: 5.46666667rem;
height: 1.6rem;
font-size: 1rem;
color: #ffffff;
position: absolute;
left: 9.76666667rem;
}
.scCalendar .calendar_header .text_month {
width: 5.46666667rem;
height: 1.6rem;
font-size: 1rem;
color: #ffffff;
position: absolute;
left: 13.1rem;
}
.scCalendar .calendar_content {
padding: 0 1rem;
}
.scCalendar .calendar_content li {
width: 2rem;
height: 2rem;
line-height: 2rem;
margin-right: 1.5rem;
text-align: center;
margin-bottom: 0.66666667rem;
float: left;
color: white;
font-size: 0.93333333rem;
}
.scCalendar .calendar_content .week li:nth-of-type(7) {
margin-right: 0;
} .scCalendar .calendar_content .day .marginRight0 {
margin-right: 0;
}

index.html代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="./ccal.css">
<script>
var pixRatio = 1/window.devicePixelRatio; //像素比
var html = document.documentElement;
document.write('<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale='+ pixRatio +',minimum-scale='+ pixRatio +',maximum-scale='+ pixRatio +'">');
html.style.fontSize = html.clientWidth/25 + 'px';
</script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script src="./components.js"></script>
</head>
<body>
<div id="app">
<div class="calendar">
<sc-calendar></sc-calendar>
</div>
</div>
</body>
<script>
var vm = new Vue({
el:'#app'
}) </script>
</html>

vue自定义日历组件的实现的更多相关文章

  1. Vue自定义日历组件

    今天给大家介绍Vue的日历组件,可自定义样式.日历类型及支持扩展,可自定义事件回调.Props数据传输. 线上demo效果 示例 Template: <Calendar :sundayStart ...

  2. vue 自定义日历组件

    <template> <div class=""> <div class="calendarTraffic" name=" ...

  3. 使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换

    使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换 需求: 日历区分交易日.非交易日 可以切换面板查看整年交易日信息 可以在手动调整交易日.非交易日 演示实例 序--使用软 ...

  4. vue自定义全局组件(自定义插件)

    有时候我们在做开发的时候,就想自己写一个插件然后就可以使用自己的插件,那种成就感很强.博主最近研究element-ui和axios的时候,发现他们是自定义组件,但是唯一有一点不同的是,在用elemen ...

  5. 一个vue的日历组件

    说明: 1.基于element-ui开发的vue日历组件. 地址 更新: 1.增加value-format指定返回值的格式2.增加头部插槽自定义头部 <ele-calendar > < ...

  6. vue初学实践之路——vue简单日历组件(1)

    ---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不 ...

  7. vue 自定义报警组件

    1.自定义报警组件 Alarm.vue <!-- 报警 组件 --> <template> <div class="alarm"> <!- ...

  8. vue自定义select组件

    1.目的 看了很多element-ui的源码,决定自己实现一个简单的select组件,遇到的几个难点,便记录下来. 2.难点一 element-ui中的select组件通过v-model可以绑定数据, ...

  9. vue 自定义分页组件

    vue2.5自定义分页组件,可设置每页显示条数,带跳转框直接跳转到相应页面 Pagination.vue 效果如下图: all: small(只显示数字和上一页和下一页): html <temp ...

随机推荐

  1. Java并发工具类之并发数控制神器Semaphore

    Semaphore(信号量)使用来控制通知访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 我们可以这么理解Semaphore,比如一个厕所只有6个坑,同时只能满足6个人上厕所( ...

  2. 一:使用maven构建项目

    一般情况下:使用maven构建项目有两种情况: 1:用maven构建java项目: 2:用maven构建javaweb项目: 还有一种经常需要使用到的就是用maven构建项目模块:如:一个父项目用来作 ...

  3. 【AGC012E】 Camel and Oases ST表+状压dp

    题目大意:一排点,两点间有距离. 初始你有一个行走值$v$,如果相邻两点距离不超过$v$你可以自由在这两点行走. 当$v$大于$0$时,你可以选择某一时刻突然飞到任意点,这样做后$v$会减半(下取整) ...

  4. Java之集合(十八)DelayQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7493735.html 1.前言 本章介绍阻塞队列DelayQueue,这是一个无界阻塞队列.其存储延时的元素,只 ...

  5. Asp.Net Core 连接Mysql

    上一篇文章里最后在VS里测试是没有问题的,但是在Windows命令行模式下会报错. 首先用dotnet restore命令的时候会出现error: 然后用dotnet run会出现警告,但是依旧会成功 ...

  6. C/C++ -- Gui编程 -- Qt库的使用 -- 构造函数中添加组件

    在构造函数中定义一个标签,设置自动换行和样式表 -----mywidget.cpp----- #include "mywidget.h" #include "ui_myw ...

  7. Docker运行操作系统环境(BusyBox&Alpine&Debian/Ubuntu&CentOS/Fedora)

    目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列.前者以自带软件包版本较新而出名:后者则宣称运行更稳定一些.选择哪个操作系统取决于读者的具体需求.同时, ...

  8. php中时间相差8小时的解决办法

    引用:http://www.111cn.net/phper/31/42398.htm 在php中使用date('Y-m-d H:i:s');得出的结果会相差8个小时,原来是时区的问题 解决办法: 1. ...

  9. Java 国际化

    国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母.国际化又称本地化(Localization,L ...

  10. goldarch企业管理软件框架整体解决方案终于出来了

    所有的图片及解决方案都在我的博客里http://blog.posn.net 框架把企业管理软件开发中要遇到的常用做了组件化处理,达到了通用性和可定制性的目的. goldarch的数据层是spring. ...