下面是详细的“基于JavaScript编写简单日历”的完整攻略。
Step 1:需求分析
在开始编写日历之前,我们需要对需求进行分析,以便能够更好地为用户提供服务。根据需求分析,我们需要实现以下功能:
- 显示当前的年份和月份;
- 显示当前月份的所有日期;
- 提供切换月份的功能。
Step 2:HTML布局
为了实现上述功能,我们需要先在HTML文件中编写一些基本的布局。具体布局如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript日历</title>
</head>
<body>
<div id="calendar">
<div class="header">
<span id="prev">上一月</span>
<span id="date">2019年01月</span>
<span id="next">下一月</span>
</div>
<table>
<thead>
<tr>
<th>日</th>
<th>一</th>
<th>二</th>
<th>三</th>
<th>四</th>
<th>五</th>
<th>六</th>
</tr>
</thead>
<tbody id="calendar-body"></tbody>
</table>
</div>
</body>
</html>
在上述HTML代码中,我们首先定义了一个名为calendar的div元素,用于包含整个日历。在此div元素中,我们再创建了一个名为header的div元素,用于显示标题和切换月份的按钮。在table元素中,我们使用了thead元素显示了日历的列名,使用了tbody元素来显示具体日期。
Step 3:CSS样式设置
为了让日历更加美观和易于使用,我们需要对样式进行一些设置。具体样式如下:
#calendar {
max-width: 800px;
margin: 0 auto;
font-family: Arial, sans-serif;
}
.header {
padding: 10px;
display: flex;
justify-content: space-between;
align-items: center;
background-color: #f7f7f7;
}
#prev, #next {
cursor: pointer;
}
table {
width: 100%;
}
th, td {
padding: 10px;
text-align: center;
}
td {
cursor: pointer;
}
.today {
background-color: #e6e6e6;
}
在上述样式代码中,我们首先设置了整个日历的宽度和字体。在header元素中,我们为其设置了一些padding,使用flex布局实现了左中右对齐,并且为了方便用户点击,为上一月和下一月的span元素添加了鼠标指针。在table元素中,我们设置了表格宽度,并设置了单元格的padding和文本对齐方式。为了让用户知道今天的日期,我们还添加了一个名为today的类,用于显示今天的日期背景颜色。
Step 4:JavaScript编写
现在,我们需要编写JavaScript代码,实现上述功能。具体代码如下:
let today = new Date();
let currentMonth = today.getMonth();
let currentYear = today.getFullYear();
const months = ["01月", "02月", "03月", "04月", "05月", "06月", "07月", "08月", "09月", "10月", "11月", "12月"];
let prevMonth = document.getElementById("prev");
let nextMonth = document.getElementById("next");
let dateDisplay = document.getElementById("date");
let calendarBody = document.getElementById("calendar-body");
function clearCalendar() {
while (calendarBody.firstChild) {
calendarBody.removeChild(calendarBody.firstChild);
}
}
function renderCalendar() {
let date = new Date(currentYear, currentMonth, 1);
let daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();
dateDisplay.innerHTML = currentYear + "年" + months[currentMonth];
let dateIndex = 0;
for (let i = 0; i < 6; i++) {
let row = document.createElement("tr");
for (let j = 0; j < 7; j++) {
let cell = document.createElement("td");
if (i === 0 && j < date.getDay()) {
cell.appendChild(document.createTextNode(""));
} else if (dateIndex >= daysInMonth) {
cell.appendChild(document.createTextNode(""));
} else {
date.setDate(dateIndex + 1);
let day = document.createTextNode(date.getDate());
cell.appendChild(day);
dateIndex++;
if (date.toDateString() === today.toDateString()) {
cell.classList.add("today");
}
}
row.appendChild(cell);
}
calendarBody.appendChild(row);
}
}
renderCalendar();
prevMonth.addEventListener("click", function() {
currentMonth--;
if (currentMonth < 0) {
currentMonth = 11;
currentYear--;
}
clearCalendar();
renderCalendar();
});
nextMonth.addEventListener("click", function() {
currentMonth++;
if (currentMonth > 11) {
currentMonth = 0;
currentYear++;
}
clearCalendar();
renderCalendar();
});
在上述JavaScript代码中,我们首先声明了today、currentMonth和currentYear变量。然后,我们定义了months数组,用于存储月份字符串。接着,我们获取了页面中的4个元素,分别是上一月、下一月、显示日期的元素和tbody元素。
接下来,我们定义了两个函数clearCalendar和renderCalendar。clearCalendar函数用于清空日历的内容,renderCalendar函数用于渲染日历的内容。在renderCalendar函数中,我们首先获取当前月份的第一天,以及当前月份的的天数。然后,我们使用循环创建表格行和表格单元格,并把特定日期的单元格标记为今天。最后,我们把创建的表格行添加到tbody元素中。
最后,我们在JavaScript代码中添加了两个事件监听器,分别用于实现上一月和下一月的切换。
Step 5:示例说明
下面,我们来看两个示例,分别演示了日历的正确使用方法和一些额外的特性。
示例一:正确使用方法
当用户第一次打开我们编写的日历应用程序时,会默认显示当前月份的日历。用户可以点击“上一月”或“下一月”按钮来查看前一个或后一个月份的日历。
<div id="calendar">
<div class="header">
<span id="prev">上一月</span>
<span id="date">2019年10月</span>
<span id="next">下一月</span>
</div>
<table>
<thead>
<tr>
<th>日</th>
<th>一</th>
<th>二</th>
<th>三</th>
<th>四</th>
<th>五</th>
<th>六</th>
</tr>
</thead>
<tbody id="calendar-body">
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
<tr>
<td>10</td>
<td>11</td>
<td>12</td>
<td>13</td>
<td>14</td>
<td>15</td>
<td>16</td>
</tr>
<tr>
<td>17</td>
<td>18</td>
<td>19</td>
<td>20</td>
<td>21</td>
<td>22</td>
<td>23</td>
</tr>
<tr>
<td>24</td>
<td>25</td>
<td>26</td>
<td>27</td>
<td>28</td>
<td>29</td>
<td>30</td>
</tr>
<tr>
<td>31</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</div>
示例二:一些额外特性
假设我们希望为日历添加一个选定日期的效果,以便用户能够在日历中选择他们感兴趣的日期。我们可以通过在JavaScript代码中添加以下代码来实现此功能:
let selectedDate = null;
calendarBody.addEventListener("click", function(event) {
if (event.target.nodeName === "TD" && event.target.innerHTML !== "") {
if (selectedDate) {
selectedDate.classList.remove("selected");
}
event.target.classList.add("selected");
selectedDate = event.target;
}
});
在上述示例中,我们首先定义了一个名为selectedDate的变量,用于存储当前用户选择的日期。然后,我们在tbody元素上添加了一个事件监听器,用于检测用户单击单元格。如果单元格不为空,我们标记该单元格为selected,并在selectedDate变量中存储该单元格的引用。如果用户单击另一个单元格,则我们会首先移除先前选定的单元格的selected标记,然后再对新单元格进行标记。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于javascript编写简单日历 - Python技术站