整体思路,日期控件大家都不陌生,也知道是什么样子。首先就会想到一个表格,里面填充了日期,顶部有年月显示或者下拉选择,或上下一年月选择。而底部就是快捷选择当前日期。所以第一步就是实现这个表格布局:
<table width="100%" border="0" bgcolor="#CCCCCC" cellspacing="1" cellpadding="0">
<tr>
<td>
<table border="0" cellspacing="0" bgcolor="#33AECC" cellpadding="0" width="100%">
<tr>
<td width="20" height="30" align="center" title="上一年"><<</td>
<td width="12" align="center" title="上一月"><</td>
<td align="center">
<span id="y" title="点击选择年份"></span>2017 年<span id="m" title="点击选择月份"></span> 05 月</td>
<td width="12" align="center" id="monthR" title="下一月">></td>
<td width="20" align="center" id="yearR" title="下一年">>></td>
</tr>
</table>
</td>
</tr>
<tr bgcolor="#FFFFFF">
<td>
<table style="text-align: center;" width="100%" border="1px" bgcolor="#9999FF" cellspacing="1" cellpadding="0">
<tr style="height: 30px;" bgcolor="#CCCCFF" height="18">
<td>日</td>
<td>一</td>
<td>二</td>
<td>三</td>
<td>四</td>
<td>五</td>
<td>六</td>
</tr>
<tr class="daylisttr" style="height: 30px;" bgcolor="#ffffff" height="18">
<td >1</td>
<td >2</td>
<td >3</td>
<td >4</td>
<td >5</td>
<td >6</td>
<td >7</td>
</tr>
</table>
</td>
</tr>
<tr bgcolor="#FFFFFF">
<td>
<div id="calenderDay"></div>
</td>
</tr>
<tr>
<td>
<table border="1px" bgcolor="#eeeeee" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="center" height="30" id="hoursL" title="今天">今天</td>
</tr>
</table>
</td>
</tr>
</table>
代码也很简单,而我们所需要的表格样式出来了,接下就是需要做的就是根据当前月来如何初始化这个table,于是我们在控制器代码ngOnInit()方法中初始化他代码如下:
var now = new Date();
//初始化年月
this.oyear = now.getFullYear();
this.omonth = now.getMonth() + 1;
//定义每个月多少天的Array
var mon = Array(31, (this.oyear % 4 == 0 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
//定义星期Array
var sunarr = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
//计算某年某月某天是星期几
var sunindex = new Date(this.oyear + "/" + this.omonth + "/1").getDay()
//上个月的剩余天数
if (this.omonth == 1) {
var upmonthday = 31;
var thismonthday = mon[this.omonth - 1];
} else {
var upmonthday = mon[this.omonth - 2];
var thismonthday = mon[this.omonth - 1];
}
//上个月末尾天数添加到数组days
var days = new Array();
var upmonthdayindex = 0;
for (var k = sunindex - 1; k >= 0; k--) {
days[k] = {
id: 1,
name: upmonthday - upmonthdayindex
};
upmonthdayindex++;
}
//本月的天数添加到数组days
var indexday = 1;
for (var k = sunindex; k <= thismonthday; k++) {
if (now.getDate() == indexday) {
days[k] = {
id: 2,
name: indexday
};
} else {
days[k] = {
id: 0,
name: indexday
};
}
indexday++;
}
//下一个月的开头天数添加到数组days末尾
var nextmonthday = 7 - days.length % 7;
console.log(nextmonthday);
for (var k = 0; k < nextmonthday; k++) {
days[days.length] = {
id: 1,
name: k + 1
};
}
//根据星期来对月进行划分显示 对days进行重构
var daysuns = new Array();
var daysunslen = days.length / 7;//取整数
var daysunindex = 0;
for (var k = 0; k < daysunslen; k++) {
var daysunarr = new Array();
for (var i = 0; i < 7; i++) {
daysunarr[i] = {
id: days[i + daysunindex].id,
name: days[i + daysunindex].name,
};
}
daysuns[k] = daysunarr;
daysunindex = daysunindex + 7;
}
//重构好的数据发送到页面
this.daylist = daysuns;
在修改对应的table为如下:
忽略。。。
<tr bgcolor="#FFFFFF">
<td>
<table style="text-align: center;" width="100%" border="1px" bgcolor="#9999FF" cellspacing="1" cellpadding="0">
<tr style="height: 30px;" bgcolor="#CCCCFF" height="18">
<td>日</td>
<td>一</td>
<td>二</td>
<td>三</td>
<td>四</td>
<td>五</td>
<td>六</td>
</tr>
<tr class="daylisttr" *ngFor="let days of daylist" style="height: 30px;" bgcolor="#ffffff" height="18">
<td [class.tdbgcolor]="day.id===1" (click)="selectday(day.id,day.name)" [class.thedaybgcolor]="day.id===2" *ngFor="let day of days">{{day.name}}</td>
</tr>
</table>
</td>
</tr>
忽略。。。
此时就实现可表格填充和当天被选中并给出不同样式,如下图
接下就是选择日期的以及上一年下一年,今天这些单击事件了。
/// <summary>
/// 选择日期
/// </summary>
/// <param name="id">判断标识</param>
/// <param name="theday">当前选中的天</param>
/// <returns></returns>
selectday(id: any, theday: any) {
if (id == 0) {
var thedate = this.oyear + "-" + this.omonth + "-" + theday;
this.theselectday = thedate;
this.showpicker = false;
}
}
/// <summary>
/// 获取今天
/// </summary>
/// <param name=""></param>
/// <returns></returns>
gettoday() {
var thedate = this.oyear + "-" + this.omonth + "-" + new Date().getDate();
this.theselectday = thedate;
this.showpicker = false;
}
/// <summary>
/// 变换年份和月份的方法
/// </summary>
/// <param name="norumonth">上一月或下一月</param>
/// <param name="noruyear">上一年或下一年</param>
/// <returns></returns>
upandnextyearormoth(norumonth: any, noruyear: any) {
var now = new Date();
//当前为最后一个月 即年需要向下翻
if (norumonth == 13) {
this.oyear = noruyear + 1;
this.omonth = 1;
}
//当前为1月 即年向上翻
else if (norumonth == 0) {
this.oyear = noruyear - 1;
this.omonth = 12;
}
else {
this.oyear = noruyear;
this.omonth = norumonth;
}
var mon = Array(31, (this.oyear % 4 == 0 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var sunarr = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
var sunindex = new Date(this.oyear + "/" + this.omonth + "/1").getDay()
//上个月的剩余天数
if (this.omonth == 1) {
var upmonthday = 31;
var thismonthday = mon[this.omonth - 1];
} else {
var upmonthday = mon[this.omonth - 2];
var thismonthday = mon[this.omonth - 1];
}
var days = new Array();
var upmonthdayindex = 0;
for (var k = sunindex - 1; k >= 0; k--) {
days[k] = {
id: 1,
name: upmonthday - upmonthdayindex
};
upmonthdayindex++;
}
var indexday = 1;
for (var k = sunindex; k <= thismonthday; k++) {
if (now.getDate() == indexday) {
days[k] = {
id: 2,
name: indexday
};
} else {
days[k] = {
id: 0,
name: indexday
};
}
indexday++;
}
var nextmonthday = 7 - days.length % 7;
for (var k = 0; k < nextmonthday; k++) {
days[days.length] = {
id: 1,
name: k + 1
};
}
var daysuns = new Array();
var daysunslen = days.length / 7;//取整数
var daysunindex = 0;
for (var k = 0; k < daysunslen; k++) {
var daysunarr = new Array();
for (var i = 0; i < 7; i++) {
daysunarr[i] = {
id: days[i + daysunindex].id,
name: days[i + daysunindex].name,
};
}
daysuns[k] = daysunarr;
daysunindex = daysunindex + 7;
}
this.daylist = daysuns;
}
页面表格添加对应方法代码片段:
。。。
<tr>
<td>
<table border="0" cellspacing="0" bgcolor="#33AECC" cellpadding="0" width="100%">
<tr>
<td width="20" height="30" align="center" (click)="upandnextyearormoth(omonth,oyear-1)" id="yearL" title="上一年"><<</td>
<td width="12" align="center" id="monthL" (click)="upandnextyearormoth(omonth-1,oyear)" title="上一月"><</td>
<td align="center">
<span id="y" title="点击选择年份"></span>{{oyear}} 年<span id="m" title="点击选择月份"></span> {{omonth}} 月</td>
<td width="12" (click)="upandnextyearormoth(omonth+1,oyear)" align="center" id="monthR" title="下一月">></td>
<td width="20" (click)="upandnextyearormoth(omonth,oyear+1)" align="center" id="yearR" title="下一年">>></td>
</tr>
</table>
</td>
</tr>
。。。。。。
<tr>
<td>
<table border="1px" bgcolor="#eeeeee" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="center" (click)="gettoday()" height="30" id="hoursL" title="今天">今天</td>
</tr>
</table>
</td>
</tr>
。。。。
这样就全部实现了这个简单的日期选择控件了,
接下里就可以随意绑定到某个元素标签,如输入框:
<input id="dateinput" type="text" (click)="showdatepicker()" style="float: left; margin-left: 5px; padding-left: 5px; padding-top: 2px; width: 80px; height: 25px; border-radius: 5px; font-size: 12px; line-height: 25px;" placeholder="开始日期"
readonly="readonly" name="date" value="{{theselectday}}" />
。。。
ts 代码
//获取当前标签坐标点
var pox = dateinput.getBoundingClientRect().left;
//设置弹出样式
this.pickerstyle = {
height: "220px",
width: "210px",
position: "absolute",
display: "block",
backgroundColor: "#ccc",
"margin-left": pox + "px",
}
设置弹出日期控件的大小和位置就完成
后面可自行改进,如改年月为下拉框,以及小时分钟的选择等等!
|
请发表评论