当前位置:首页 > 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实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现交换

js实现交换

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

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…