当前位置:首页 > JavaScript

用js实现日历

2026-03-01 13:58:54JavaScript

实现基础日历结构

使用HTML和CSS创建日历的骨架,JavaScript动态生成日期。以下是一个基础模板:

<div id="calendar">
  <div class="header">
    <button id="prev">上一月</button>
    <h2 id="month-year"></h2>
    <button id="next">下一月</button>
  </div>
  <div class="weekdays">
    <div>日</div><div>一</div><div>二</div><div>三</div><div>四</div><div>五</div><div>六</div>
  </div>
  <div id="days" class="days"></div>
</div>
#calendar {
  width: 300px;
  font-family: Arial;
}
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.weekdays, .days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
}
.days div {
  padding: 10px;
  border: 1px solid #ddd;
}

动态生成日历逻辑

通过JavaScript计算当前月份的天数及起始星期,并填充日期格子:

document.addEventListener('DOMContentLoaded', function() {
  let currentDate = new Date();
  renderCalendar(currentDate);

  document.getElementById('prev').addEventListener('click', () => {
    currentDate.setMonth(currentDate.getMonth() - 1);
    renderCalendar(currentDate);
  });

  document.getElementById('next').addEventListener('click', () => {
    currentDate.setMonth(currentDate.getMonth() + 1);
    renderCalendar(currentDate);
  });
});

function renderCalendar(date) {
  const monthYear = document.getElementById('month-year');
  const daysContainer = document.getElementById('days');
  daysContainer.innerHTML = '';

  const year = date.getFullYear();
  const month = date.getMonth();
  monthYear.textContent = `${year}年 ${month + 1}月`;

  const firstDay = new Date(year, month, 1).getDay();
  const daysInMonth = new Date(year, month + 1, 0).getDate();

  // 填充空白格子(上月末尾)
  for (let i = 0; i < firstDay; i++) {
    const emptyDiv = document.createElement('div');
    daysContainer.appendChild(emptyDiv);
  }

  // 填充当月日期
  for (let day = 1; day <= daysInMonth; day++) {
    const dayDiv = document.createElement('div');
    dayDiv.textContent = day;
    daysContainer.appendChild(dayDiv);
  }
}

添加交互功能

扩展功能:高亮当前日期、支持点击日期事件:

function renderCalendar(date) {
  // ...(前述代码)
  const today = new Date();
  const isCurrentMonth = year === today.getFullYear() && month === today.getMonth();

  for (let day = 1; day <= daysInMonth; day++) {
    const dayDiv = document.createElement('div');
    dayDiv.textContent = day;
    if (isCurrentMonth && day === today.getDate()) {
      dayDiv.classList.add('today');
    }
    dayDiv.addEventListener('click', () => alert(`选中日期: ${year}-${month + 1}-${day}`));
    daysContainer.appendChild(dayDiv);
  }
}
.today {
  background-color: #ffeb3b;
  font-weight: bold;
}

支持多语言和自定义样式

通过配置对象实现灵活定制,例如切换星期显示为英文:

const config = {
  weekdays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
  monthNames: ['January', 'February', /* ... */ 'December']
};

// 在renderCalendar中替换文本
document.querySelector('.weekdays').innerHTML = 
  config.weekdays.map(day => `<div>${day}</div>`).join('');

使用第三方库简化开发

若需更复杂功能(如日程管理),可考虑开源库:

用js实现日历

  • FullCalendar:支持拖拽、事件管理等。
  • Pikaday:轻量级日期选择器。
// FullCalendar示例
import FullCalendar from '@fullcalendar/react';
import dayGridPlugin from '@fullcalendar/daygrid';

function Calendar() {
  return <FullCalendar plugins={[dayGridPlugin]} initialView="dayGridMonth" />;
}

标签: 日历js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

vue实现全年日历

vue实现全年日历

实现全年日历的基本思路 使用Vue实现全年日历需要结合日期计算、数据渲染和交互逻辑。核心在于生成全年12个月的日历数据,并通过组件化方式展示。以下是具体实现方法: 安装依赖(可选) 如需更便捷的日期…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…