<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>带节日农历的JS万年历</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Microsoft YaHei", sans-serif;
}
body {
background: #f5f5f5;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 20px;
}
.calendar-container {
background: white;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 800px;
overflow: hidden;
}
.calendar-header {
background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
color: white;
padding: 20px;
text-align: center;
position: relative;
}
.calendar-title {
font-size: 24px;
margin-bottom: 5px;
}
.calendar-year-month {
font-size: 18px;
display: flex;
justify-content: center;
align-items: center;
}
.nav-btn {
background: rgba(255, 255, 255, 0.2);
border: none;
color: white;
width: 30px;
height: 30px;
border-radius: 50%;
font-size: 16px;
cursor: pointer;
margin: 0 15px;
transition: all 0.3s;
}
.nav-btn:hover {
background: rgba(255, 255, 255, 0.3);
}
.calendar-weekdays {
display: grid;
grid-template-columns: repeat(7, 1fr);
background: #f0f0f0;
padding: 10px 0;
text-align: center;
font-weight: bold;
}
.calendar-days {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 1px;
background: #e0e0e0;
}
.day {
background: white;
min-height: 100px;
padding: 5px;
position: relative;
transition: all 0.3s;
}
.day:hover {
background: #f9f9f9;
}
.day-number {
font-weight: bold;
margin-bottom: 5px;
}
.today .day-number {
background: #2575fc;
color: white;
display: inline-block;
width: 25px;
height: 25px;
line-height: 25px;
border-radius: 50%;
text-align: center;
}
.lunar-day {
font-size: 12px;
color: #888;
}
.festival {
font-size: 12px;
color: #e74c3c;
margin-top: 3px;
}
.solar-term {
font-size: 12px;
color: #2ecc71;
margin-top: 3px;
}
.other-month {
background: #f9f9f9;
color: #aaa;
}
.calendar-footer {
padding: 15px;
text-align: center;
background: #f9f9f9;
border-top: 1px solid #eee;
}
.footer-link {
color: #2575fc;
text-decoration: none;
transition: color 0.3s;
}
.footer-link:hover {
color: #6a11cb;
text-decoration: underline;
}
@media (max-width: 600px) {
.day {
min-height: 70px;
}
.lunar-day, .festival, .solar-term {
font-size: 10px;
}
}
</style>
</head>
<body>
<div class="calendar-container">
<div class="calendar-header">
<div class="calendar-title">万年历</div>
<div class="calendar-year-month">
<button class="nav-btn" id="prev-year">«</button>
<button class="nav-btn" id="prev-month">‹</button>
<span id="current-year-month">2023年11月</span>
<button class="nav-btn" id="next-month">›</button>
<button class="nav-btn" id="next-year">»</button>
</div>
</div>
<div class="calendar-weekdays">
<div>日</div>
<div>一</div>
<div>二</div>
<div>三</div>
<div>四</div>
<div>五</div>
<div>六</div>
</div>
<div class="calendar-days" id="calendar-days"></div>
<div class="calendar-footer">
<p>带节日农历的万年历 © <span id="current-year">2023</span></p>
</div>
</div>
<script>
// 农历数据
const lunarInfo = [
0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,
0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0
];
// 节气数据
const solarTerm = [
"小寒", "大寒", "立春", "雨水", "惊蛰", "春分",
"清明", "谷雨", "立夏", "小满", "芒种", "夏至",
"小暑", "大暑", "立秋", "处暑", "白露", "秋分",
"寒露", "霜降", "立冬", "小雪", "大雪", "冬至"
];
// 节日数据
const festivals = {
"1-1": "元旦",
"2-14": "情人节",
"3-8": "妇女节",
"3-12": "植树节",
"4-1": "愚人节",
"5-1": "劳动节",
"5-4": "青年节",
"6-1": "儿童节",
"7-1": "建党节",
"8-1": "建军节",
"9-10": "教师节",
"10-1": "国庆节",
"12-25": "圣诞节",
// 农历节日
"l1-1": "春节",
"l1-15": "元宵节",
"l5-5": "端午节",
"l7-7": "七夕节",
"l8-15": "中秋节",
"l9-9": "重阳节",
"l12-8": "腊八节"
};
// 当前显示的年份和月份
let currentYear = new Date().getFullYear();
let currentMonth = new Date().getMonth();
// 初始化日历
function initCalendar() {
updateCalendarHeader();
renderCalendarDays();
document.getElementById('current-year').textContent = currentYear;
}
// 更新日历头部显示
function updateCalendarHeader() {
const months = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"];
document.getElementById('current-year-month').textContent = `${currentYear}年${months[currentMonth]}`;
}
// 渲染日历天数
function renderCalendarDays() {
const calendarDays = document.getElementById('calendar-days');
calendarDays.innerHTML = '';
// 获取当月第一天和最后一天
const firstDay = new Date(currentYear, currentMonth, 1);
const lastDay = new Date(currentYear, currentMonth + 1, 0);
// 获取当月第一天是星期几(0-6,0表示星期日)
const firstDayOfWeek = firstDay.getDay();
// 获取上个月的最后几天
const prevMonthLastDay = new Date(currentYear, currentMonth, 0).getDate();
// 添加上个月的日期
for (let i = firstDayOfWeek - 1; i >= 0; i--) {
const dayElement = createDayElement(prevMonthLastDay - i, true);
calendarDays.appendChild(dayElement);
}
// 添加当月的日期
const today = new Date();
for (let i = 1; i <= lastDay.getDate(); i++) {
const date = new Date(currentYear, currentMonth, i);
const isToday = date.getDate() === today.getDate() &&
date.getMonth() === today.getMonth() &&
date.getFullYear() === today.getFullYear();
const dayElement = createDayElement(i, false, isToday, date);
calendarDays.appendChild(dayElement);
}
// 添加下个月的日期
const nextMonthDays = 42 - (firstDayOfWeek + lastDay.getDate());
for (let i = 1; i <= nextMonthDays; i++) {
const dayElement = createDayElement(i, true);
calendarDays.appendChild(dayElement);
}
}
// 创建日期元素
function createDayElement(day, isOtherMonth, isToday = false, date = null) {
const dayElement = document.createElement('div');
dayElement.className = 'day';
if (isOtherMonth) dayElement.classList.add('other-month');
if (isToday) dayElement.classList.add('today');
const dayNumber = document.createElement('div');
dayNumber.className = 'day-number';
dayNumber.textContent = day;
dayElement.appendChild(dayNumber);
if (date && !isOtherMonth) {
// 添加农历日期
const lunarDate = getLunarDate(date);
const lunarDay = document.createElement('div');
lunarDay.className = 'lunar-day';
lunarDay.textContent = lunarDate.day === 1 ? lunarDate.month + '月' : lunarDate.day;
dayElement.appendChild(lunarDay);
// 添加节日
const festival = getFestival(date, lunarDate);
if (festival) {
const festivalElement = document.createElement('div');
festivalElement.className = 'festival';
festivalElement.textContent = festival;
dayElement.appendChild(festivalElement);
}
// 添加节气
const solarTermName = getSolarTerm(date);
if (solarTermName) {
const solarTermElement = document.createElement('div');
solarTermElement.className = 'solar-term';
solarTermElement.textContent = solarTermName;
dayElement.appendChild(solarTermElement);
}
}
return dayElement;
}
// 获取农历日期
function getLunarDate(date) {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
// 计算农历日期(简化版,实际需要更复杂的计算)
// 这里只是一个示例,实际应用中需要使用完整的农历算法
const lunarMonth = (month + 1) % 12 || 12;
const lunarDay = (day + 5) % 30 || 30;
return {
year: year,
month: lunarMonth,
day: lunarDay
};
}
// 获取节日
function getFestival(date, lunarDate) {
const solarKey = `${date.getMonth() + 1}-${date.getDate()}`;
const lunarKey = `l${lunarDate.month}-${lunarDate.day}`;
return festivals[solarKey] || festivals[lunarKey];
}
// 获取节气
function getSolarTerm(date) {
// 简化版,实际需要根据太阳黄经计算
const month = date.getMonth();
const day = date.getDate();
// 示例节气日期(实际每年不同)
const termMap = {
"0-5": "小寒",
"0-20": "大寒",
"1-4": "立春",
"1-19": "雨水",
"2-5": "惊蛰",
"2-20": "春分",
"3-5": "清明",
"3-20": "谷雨",
"4-5": "立夏",
"4-21": "小满",
"5-5": "芒种",
"5-21": "夏至",
"6-7": "小暑",
"6-23": "大暑",
"7-7": "立秋",
"7-23": "处暑",
"8-7": "白露",
"8-23": "秋分",
"9-8": "寒露",
"9-23": "霜降",
"10-7": "立冬",
"10-22": "小雪",
"11-7": "大雪",
"11-22": "冬至"
};
const key = `${month}-${day}`;
return termMap[key];
}
// 绑定按钮事件
document.getElementById('prev-year').addEventListener('click', function() {
currentYear--;
initCalendar();
});
document.getElementById('next-year').addEventListener('click', function() {
currentYear++;
initCalendar();
});
document.getElementById('prev-month').addEventListener('click', function() {
currentMonth--;
if (currentMonth < 0) {
currentMonth = 11;
currentYear--;
}
initCalendar();
});
document.getElementById('next-month').addEventListener('click', function() {
currentMonth++;
if (currentMonth > 11) {
currentMonth = 0;
currentYear++;
}
initCalendar();
});
// 初始化日历
initCalendar();
</script>
</body>
</html>
886

被折叠的 条评论
为什么被折叠?



