web頁面中很多地方都會用到日歷顯示,選擇等,本文用html、css、javascript實現簡單的日歷。完成以后的效果與頁面左側的效果差不多,可以切換上個月、下個月。也可以根據實際情況進行擴展。
html方面
html部分比較簡單,聲明一個div,具體的html用javascript生成。整體內容大概是這樣的:
1 <!doctype html>
2 <html>
3 <head>
4 <meta charset='utf-8'>
5 <link rel='stylesheet' href='外部的css文件路徑' />
6 <title>demo
</title>
7 </head>
8 <body>
9 <div class='calendar' id='calendar'></div>
10 <script type='text/javascript' src='外部的javascript文件路徑'></script>
11 </body>
12 </html> css方面
?
1 /* 整體設置 */
2 *{
margin:
0px;
padding:
0px;}
3
4 /**
5 * 設置日歷的大小
6 */
7 .calendar{
8 width:
240px;
9 height:
400px;
10 display:
block;
11 }
12
13 /**
14 * 設置日歷頂部盒子
15 */
16 .calendar .calendar-title-box{
17 position:
relative;
18 width:
100%;
19 height:
36px;
20 line-height:
36px;
21 text-align:
center;
22 border-bottom:
1px solid #ddd;
23 }
24
25 /**
26 * 設置上個月的按鈕圖標
27 */
28 .calendar .prev-month {
29 position:
absolute;
30 top:
12px;
31 left:
0px;
32 display:
inline-block;
33 width:
0px;
34 height:
0px;
35 border-left:
0px;
36 border-top:
6px solid transparent;
37 border-right:
8px solid #999;
38 border-bottom:
6px solid transparent;
39 cursor:
pointer;
40 }
41
42 /**
43 * 設置下個月的按鈕圖標
44 */
45 .calendar .next-month {
46 position:
absolute;
47 top:
12px;
48 right:
0px;
49 display:
inline-block;
50 width:
0px;
51 height:
0px;
52 border-right:
0px;
53 border-top:
6px solid transparent;
54 border-left:
8px solid #999;
55 border-bottom:
6px solid transparent;
56 cursor:
pointer;
57 }
58
59
60 /* 設置日歷表格樣式 */
61 .calendar-table{
62 width:
100%;
63 border-collapse:
collapse;
64 text-align:
center;
65 }
66
67 /* 表格行高 */
68 .calendar-table tr{
69 height:
30px;
70 line-height:
30px;
71 }
72
73 /* 當前天 顏色特殊顯示 */
74 .currentDay {
75 color:
red;
76 }
77
78 /* 本月 文字顏色 */
79 .currentMonth {
80 color:
#999;
81 }
82
83 /* 其他月顏色 */
84 .otherMonth{
85 color:
#ede;
86 }
樣式設置基本沒什么課說的,一些簡單的設置。比如特殊的是表示“上個月”、“下個月”的圖標,采用的絕對定位、利用css中的border屬性設置樣式。
javascript Date對象
開始正式的js代碼之前,需要先了解js中的Date對象,通過Date對象,可以獲取到年月日時分秒以及時間戳等信息,具體參考: http://www.w3school.com.cn/jsref/jsref_obj_date.asp
1 var d1 =
new Date();
// 獲取當前系統時間 我現在的時間是 2016年4月25日 星期一
2 d1.getFullYear();
// 獲取年信息, 2016
3 d1.getMonth();
// 獲取月信息(從0開始 范圍:0-11) 3
4 d1.getDate();
// 獲取天信息 此處結果:25
5 d1.getDay();
// 獲取星期信息 (0-6) 此處結果: 1 也可以在初始化的時候直接設置年月日信息
1 # 設置 2016年3月15日
2 var d2 =
new Date(2016, 2, 15);
// 月是從0開始計數, 需要減一
3 d2.getFullYear();
// 2016
4 d2.getMonth();
// 2
5 d2.getDate();
// 15
6 d2.toLocaleDateString();
// "2016/3/15" 證明設置正確 日歷中會涉及到每個月多少天之類的問題,在js中很簡單,如果設置年月日的時候,超出當月,js會自動算成下個月的,例如4月只有30天,如果設置成31 日,獲得的Date類型中自動會算成5月1日;如果設置成5月0日,js會處理成4月30日,那么5月-1日也就是4月29日
1 var d3 =
new Date(2016, 3, 30
);
2 d3.toLocaleDateString();
// "2016/4/30"
3 var d4 =
new Date(2016, 3, 31
);
4 d4.toLocaleDateString();
// "2016/5/1"
5 var d5 =
new Date(2016, 3, 33
);
6 d5.toLocaleDateString();
// "2016/5/3"
7 var d6 =
new Date(2016, 4, 1
);
8 d6.toLocaleDateString();
// "2016/5/1"
9 var d7 =
new Date(2016, 4, 0
);
10 d7.toLocaleDateString();
// "2016/4/30"
11 var d8 =
new Date(2016, 4, -3
);
12 d8.toLocaleDateString();
// "2016/4/27" javascript部分
了解了js中Date對象的基本用法,接下來就是代碼實現部分了,整體思路是這樣的:定義一個全局的dateObj變量,用來記錄表格中需要顯示的 年月信息。 標題中的內容根據dateObj中取,表格中的日期則中dateObj中取到年月對應的1號的所有信息,即可確定1號在表格第一行的位置,以此倒推上個月 最后幾天的數據、正推本月和下個月的數據。
具體步驟:
聲明dateObj變量,并賦初值為當前系統時間給calendar div中渲染html元素通過dateObj獲取當月1號的信息,并以此遍歷出表格中所有日期給上一月、下一月圖標綁定事件 1 (
function(){
2 /*
3 * 用于記錄日期,顯示的時候,根據dateObj中的日期的年月顯示
4 */
5 var dateObj = (
function(){
6 var _date =
new Date();
// 默認為當前系統時間
7 return {
8 getDate :
function(){
9 return _date;
10 },
11 setDate :
function(date) {
12 _date =
date;
13 }
14 };
15 })();
16
17 // 設置calendar div中的html部分
18 renderHtml();
19 // 表格中顯示日期
20 showCalendarData();
21 // 綁定事件
22 bindEvent();
23
24 /**
25 * 渲染html結構
26 */
27 function renderHtml() {
28 var calendar = document.getElementById("calendar"
);
29 var titleBox = document.createElement("div");
// 標題盒子 設置上一月 下一月 標題
30 var bodyBox = document.createElement("div");
// 表格區 顯示數據
31
32 // 設置標題盒子中的html
33 titleBox.className = 'calendar-title-box'
;
34 titleBox.innerHTML = "<span class='prev-month' id='prevMonth'></span>" +
35 "<span class='calendar-title' id='calendarTitle'></span>" +
36 "<span id='nextMonth' class='next-month'></span>"
;
37 calendar.appendChild(titleBox);
// 添加到calendar div中
38
39 // 設置表格區的html結構
40 bodyBox.className = 'calendar-body-box'
;
41 var _headHtml = "<tr>" +
42 "<th>日</th>" +
43 "<th>一</th>" +
44 "<th>二</th>" +
45 "<th>三</th>" +
46 "<th>四</th>" +
47 "<th>五</th>" +
48 "<th>六</th>" +
49 "</tr>"
;
50 var _bodyHtml = ""
;
51
52 // 一個月最多31天,所以一個月最多占6行表格
53 for(
var i = 0; i < 6; i++
) {
54 _bodyHtml += "<tr>" +
55 "<td></td>" +
56 "<td></td>" +
57 "<td></td>" +
58 "<td></td>" +
59 "<td></td>" +
60 "<td></td>" +
61 "<td></td>" +
62 "</tr>"
;
63 }
64 bodyBox.innerHTML = "<table id='calendarTable' class='calendar-table'>" +
65 _headHtml + _bodyHtml +
66 "</table>"
;
67 // 添加到calendar div中
68 calendar.appendChild(bodyBox);
69 }
70
71 /**
72 * 表格中顯示數據,并設置類名
73 */
74 function showCalendarData() {
75 var _year =
dateObj.getDate().getFullYear();
76 var _month = dateObj.getDate().getMonth() + 1
;
77 var _dateStr =
getDateStr(dateObj.getDate());
78
79 // 設置頂部標題欄中的 年、月信息
80 var calendarTitle = document.getElementById("calendarTitle"
);
81 var titleStr = _dateStr.substr(0, 4) + "年" + _dateStr.substr(4,2) + "月"
;
82 calendarTitle.innerText =
titleStr;
83
84 // 設置表格中的日期數據
85 var _table = document.getElementById("calendarTable"
);
86 var _tds = _table.getElementsByTagName("td"
);
87 var _firstDay =
new Date(_year, _month - 1, 1);
// 當前月第一天
88 for(
var i = 0; i < _tds.length; i++
) {
89 var _thisDay =
new Date(_year, _month - 1, i + 1 -
_firstDay.getDay());
90 var _thisDayStr =
getDateStr(_thisDay);
91 _tds[i].innerText =
_thisDay.getDate();
92 //_tds[i].data = _thisDayStr;
93 _tds[i].setAttribute('data'
, _thisDayStr);
94 if(_thisDayStr == getDateStr(
new Date())) {
// 當前天
95 _tds[i].className = 'currentDay'
;
96 }
else if(_thisDayStr.substr(0, 6) == getDateStr(_firstDay).substr(0, 6
)) {
97 _tds[i].className = 'currentMonth';
// 當前月
98 }
else {
// 其他月
99 _tds[i].className = 'otherMonth'
;
100 }
101 }
102 }
103
104 /**
105 * 綁定上個月下個月事件
106 */
107 function bindEvent() {
108 var prevMonth = document.getElementById("prevMonth"
);
109 var nextMonth = document.getElementById("nextMonth"
);
110 addEvent(prevMonth, 'click'
, toPrevMonth);
111 addEvent(nextMonth, 'click'
, toNextMonth);
112 }
113
114 /**
115 * 綁定事件
116 */
117 function addEvent(dom, eType, func) {
118 if(dom.addEventListener) {
// DOM 2.0
119 dom.addEventListener(eType,
function(e){
120 func(e);
121 });
122 }
else if(dom.attachEvent){
// IE5+
123 dom.attachEvent('on' + eType,
function(e){
124 func(e);
125 });
126 }
else {
// DOM 0
127 dom['on' + eType] =
function(e) {
128 func(e);
129 }
130 }
131 }
132
133 /**
134 * 點擊上個月圖標觸發
135 */
136 function toPrevMonth() {
137 var date =
dateObj.getDate();
138 dateObj.setDate(
new Date(date.getFullYear(), date.getMonth() - 1, 1
));
139 showCalendarData();
140 }
141
142 /**
143 * 點擊下個月圖標觸發
144 */
145 function toNextMonth() {
146 var date =
dateObj.getDate();
147 dateObj.setDate(
new Date(date.getFullYear(), date.getMonth() + 1, 1
));
148 showCalendarData();
149 }
150
151 /**
152 * 日期轉化為字符串, 4位年+2位月+2位日
153 */
154 function getDateStr(date) {
155 var _year =
date.getFullYear();
156 var _month = date.getMonth() + 1;
// 月從0開始計數
157 var _d =
date.getDate();
158
159 _month = (_month > 9) ? ("" + _month) : ("0" +
_month);
160 _d = (_d > 9) ? ("" + _d) : ("0" +
_d);
161 return _year + _month +
_d;
162 }
163 })();
本例中并沒有添加點擊表格中日期時候的事件,可以在bindEvent函數中添加如下代碼獲取所點擊日期的信息
1 var table = document.getElementById("calendarTable"
);
2 var tds = table.getElementsByTagName('td'
);
3 for(
var i = 0; i < tds.length; i++
) {
4 addEvent(tds[i], 'click',
function(e){
5 console.log(e.target.getAttribute('data'
));
6 });
7 }
?
轉載于:https://www.cnblogs.com/LikeStar/p/5669234.html
總結
以上是生活随笔為你收集整理的制作简单日历的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。