当前位置:首页 > JavaScript

js实现月历

2026-04-07 05:13:37JavaScript

使用JavaScript实现月历

以下是基于原生JavaScript实现月历的完整代码示例,包含动态生成月份、日期高亮及基础交互功能。

js实现月历

核心逻辑

// 获取当前年月
const currentDate = new Date();
let currentYear = currentDate.getFullYear();
let currentMonth = currentDate.getMonth();

// 渲染月历函数
function renderCalendar() {
  const monthNames = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"];
  const daysContainer = document.getElementById('days');
  const monthYearDisplay = document.getElementById('month-year');

  // 设置月份标题
  monthYearDisplay.textContent = `${monthNames[currentMonth]} ${currentYear}`;

  // 获取当月第一天和最后一天
  const firstDay = new Date(currentYear, currentMonth, 1);
  const lastDay = new Date(currentYear, currentMonth + 1, 0);

  // 计算需要显示的日期范围(包括上个月和下个月的部分日期)
  const prevLastDay = new Date(currentYear, currentMonth, 0).getDate();
  const firstDayIndex = firstDay.getDay();
  const lastDayIndex = lastDay.getDay();
  const nextDays = 7 - lastDayIndex - 1;

  let days = "";

  // 添加上个月末尾日期
  for (let x = firstDayIndex; x > 0; x--) {
    days += `<div class="prev-date">${prevLastDay - x + 1}</div>`;
  }

  // 添加当月日期
  for (let i = 1; i <= lastDay.getDate(); i++) {
    // 高亮当天
    if (i === currentDate.getDate() && currentMonth === new Date().getMonth() && currentYear === new Date().getFullYear()) {
      days += `<div class="today">${i}</div>`;
    } else {
      days += `<div>${i}</div>`;
    }
  }

  // 添加下个月开头日期
  for (let j = 1; j <= nextDays; j++) {
    days += `<div class="next-date">${j}</div>`;
  }

  daysContainer.innerHTML = days;
}

HTML结构

<div class="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 class="days" id="days"></div>
</div>

CSS样式

.calendar {
  width: 300px;
  font-family: Arial;
  border: 1px solid #ddd;
  border-radius: 5px;
  padding: 10px;
}

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 10px;
}

.weekdays {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  text-align: center;
  font-weight: bold;
  margin-bottom: 5px;
}

.days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 5px;
}

.days div {
  padding: 5px;
  text-align: center;
  cursor: pointer;
}

.today {
  background: #4285f4;
  color: white;
  border-radius: 50%;
}

.prev-date, .next-date {
  color: #aaa;
}

button {
  background: none;
  border: none;
  cursor: pointer;
  font-size: 1.2em;
}

初始化与事件绑定

// 初始化月历
renderCalendar();

// 绑定月份切换事件
document.getElementById('prev').addEventListener('click', () => {
  currentMonth--;
  if (currentMonth < 0) {
    currentMonth = 11;
    currentYear--;
  }
  renderCalendar();
});

document.getElementById('next').addEventListener('click', () => {
  currentMonth++;
  if (currentMonth > 11) {
    currentMonth = 0;
    currentYear++;
  }
  renderCalendar();
});

功能扩展建议

  1. 日期点击事件:为每个日期添加点击事件处理程序,实现日期选择功能
  2. 事件标记:在特定日期上显示标记点,表示有日程安排
  3. 周视图切换:添加切换按钮,支持周视图和月视图切换
  4. 本地存储:使用localStorage保存用户添加的事件
  5. 国际化:添加多语言支持,适应不同地区的日期格式

这个实现方案使用纯JavaScript,不依赖任何第三方库,可以根据项目需求进行进一步定制和扩展。

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

相关文章

js实现vue

js实现vue

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

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现交换

js实现交换

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

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…