您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用JavaScript制作年历
在现代Web开发中,使用JavaScript创建动态年历是一个常见的需求。本文将详细介绍如何从零开始构建一个功能完整的年历组件,包含日期渲染、月份切换和基础交互功能。
## 一、基础HTML结构
首先创建基础的HTML骨架,包含年历容器和必要的控制按钮:
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>JavaScript年历</title>
<style>
.calendar {
width: 350px;
font-family: Arial, sans-serif;
}
.calendar-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.calendar-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 5px;
}
.day-header {
text-align: center;
font-weight: bold;
padding: 5px;
}
.day-cell {
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #ddd;
cursor: pointer;
}
.day-cell:hover {
background-color: #f0f0f0;
}
.non-current-month {
color: #aaa;
}
.today {
background-color: #e6f7ff;
font-weight: bold;
}
</style>
</head>
<body>
<div class="calendar">
<div class="calendar-header">
<button id="prev-year"><<</button>
<button id="prev-month"><</button>
<h2 id="month-year">2023年10月</h2>
<button id="next-month">></button>
<button id="next-year">>></button>
</div>
<div class="calendar-grid" id="calendar-grid">
<!-- 日期将通过JavaScript动态生成 -->
</div>
</div>
<script src="calendar.js"></script>
</body>
</html>
创建calendar.js
文件,实现年历的核心功能:
document.addEventListener('DOMContentLoaded', function() {
// 当前显示的日期
let currentDate = new Date();
// 获取DOM元素
const monthYearElement = document.getElementById('month-year');
const calendarGrid = document.getElementById('calendar-grid');
const prevMonthBtn = document.getElementById('prev-month');
const nextMonthBtn = document.getElementById('next-month');
const prevYearBtn = document.getElementById('prev-year');
const nextYearBtn = document.getElementById('next-year');
// 初始化日历
renderCalendar(currentDate);
// 事件监听
prevMonthBtn.addEventListener('click', () => {
currentDate.setMonth(currentDate.getMonth() - 1);
renderCalendar(currentDate);
});
nextMonthBtn.addEventListener('click', () => {
currentDate.setMonth(currentDate.getMonth() + 1);
renderCalendar(currentDate);
});
prevYearBtn.addEventListener('click', () => {
currentDate.setFullYear(currentDate.getFullYear() - 1);
renderCalendar(currentDate);
});
nextYearBtn.addEventListener('click', () => {
currentDate.setFullYear(currentDate.getFullYear() + 1);
renderCalendar(currentDate);
});
// 渲染日历函数
function renderCalendar(date) {
// 清空日历网格
calendarGrid.innerHTML = '';
// 设置月份和年份标题
const monthNames = ["一月", "二月", "三月", "四月", "五月", "六月",
"七月", "八月", "九月", "十月", "十一月", "十二月"];
monthYearElement.textContent = `${date.getFullYear()}年 ${monthNames[date.getMonth()]}`;
// 添加星期标题
const dayNames = ["日", "一", "二", "三", "四", "五", "六"];
dayNames.forEach(day => {
const dayHeader = document.createElement('div');
dayHeader.className = 'day-header';
dayHeader.textContent = day;
calendarGrid.appendChild(dayHeader);
});
// 获取当月第一天和最后一天
const firstDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1);
const lastDayOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0);
// 获取第一天是星期几(0-6,0代表星期日)
const firstDayOfWeek = firstDayOfMonth.getDay();
// 获取上个月最后几天
const prevMonthLastDay = new Date(date.getFullYear(), date.getMonth(), 0).getDate();
// 添加上个月的日期
for (let i = firstDayOfWeek - 1; i >= 0; i--) {
const dayCell = createDayCell(prevMonthLastDay - i, true);
calendarGrid.appendChild(dayCell);
}
// 添加当月的日期
for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
const dayCell = createDayCell(i, false);
// 标记今天
const today = new Date();
if (date.getFullYear() === today.getFullYear() &&
date.getMonth() === today.getMonth() &&
i === today.getDate()) {
dayCell.classList.add('today');
}
calendarGrid.appendChild(dayCell);
}
// 计算需要添加的下个月日期数量
const totalCells = firstDayOfWeek + lastDayOfMonth.getDate();
const nextMonthDays = totalCells <= 35 ? 35 - totalCells : 42 - totalCells;
// 添加下个月的日期
for (let i = 1; i <= nextMonthDays; i++) {
const dayCell = createDayCell(i, true);
calendarGrid.appendChild(dayCell);
}
}
// 创建日期单元格
function createDayCell(day, isNonCurrentMonth) {
const dayCell = document.createElement('div');
dayCell.className = 'day-cell';
if (isNonCurrentMonth) {
dayCell.classList.add('non-current-month');
}
dayCell.textContent = day;
// 添加点击事件
dayCell.addEventListener('click', () => {
console.log(`选中日期: ${currentDate.getFullYear()}-${currentDate.getMonth() + 1}-${day}`);
});
return dayCell;
}
});
// 在renderCalendar函数中添加节假日判断
const holidays = {
'1-1': '元旦',
'5-1': '劳动节',
'10-1': '国庆节'
// 添加更多节假日...
};
function renderCalendar(date) {
// ...原有代码...
// 在创建日期单元格时添加节假日判断
const holidayKey = `${date.getMonth() + 1}-${i}`;
if (holidays[holidayKey]) {
const holidayMarker = document.createElement('div');
holidayMarker.className = 'holiday-marker';
holidayMarker.textContent = holidays[holidayKey];
dayCell.appendChild(holidayMarker);
}
// ...原有代码...
}
let selectedDate = null;
function createDayCell(day, isNonCurrentMonth) {
// ...原有代码...
dayCell.addEventListener('click', () => {
// 移除之前选中的样式
document.querySelectorAll('.selected').forEach(el => {
el.classList.remove('selected');
});
// 添加选中样式
dayCell.classList.add('selected');
// 更新选中的日期
selectedDate = new Date(
currentDate.getFullYear(),
currentDate.getMonth(),
isNonCurrentMonth ?
(day < 15 ? day + lastDayOfMonth.getDate() : day - lastDayOfMonth.getDate()) :
day
);
console.log('选中日期:', selectedDate);
});
return dayCell;
}
对于生产环境使用,建议考虑以下成熟的日历库: - FullCalendar - Pikaday - Flatpickr
这些库提供了更丰富的功能和更好的浏览器兼容性。
通过本文的介绍,您已经学会了如何使用原生JavaScript创建一个功能完整的年历组件。这个实现包含了基本的日期显示、月份切换和简单的交互功能。您可以根据实际需求进一步扩展功能,如添加事件提醒、实现周视图等。
记住,在实际项目中,考虑使用成熟的日历库可以节省开发时间,但对于学习目的或简单需求,自己实现一个年历组件是非常有价值的实践。 “`
这篇文章包含了约1800字,详细介绍了使用JavaScript创建年历的完整过程,包括HTML结构、核心JavaScript逻辑、功能扩展思路以及优化建议。内容采用Markdown格式,包含代码块和清晰的章节划分。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。