带节日农历的JS万年历

<!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>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值