当前位置:首页 > JavaScript

js日历实现

2026-03-14 07:35:52JavaScript

实现日历的基本思路

日历的核心功能是展示日期,通常包括年、月、日,并支持用户切换月份或年份。实现时需要处理日期计算、渲染和交互逻辑。

基础HTML结构

创建一个简单的HTML容器用于放置日历:

<div id="calendar">
  <div class="header">
    <button id="prev">上一月</button>
    <h2 id="month-year"></h2>
    <button id="next">下一月</button>
  </div>
  <div class="days-header">
    <span>日</span><span>一</span><span>二</span><span>三</span><span>四</span><span>五</span><span>六</span>
  </div>
  <div id="days-container"></div>
</div>

JavaScript逻辑实现

初始化日历并处理日期渲染:

document.addEventListener('DOMContentLoaded', function() {
  const monthYearElement = document.getElementById('month-year');
  const daysContainer = document.getElementById('days-container');
  const prevBtn = document.getElementById('prev');
  const nextBtn = document.getElementById('next');

  let currentDate = new Date();

  function renderCalendar() {
    const year = currentDate.getFullYear();
    const month = currentDate.getMonth();

    monthYearElement.textContent = `${year}年 ${month + 1}月`;

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

    daysContainer.innerHTML = '';

    for (let i = 0; i < startingDay; i++) {
      const emptyDay = document.createElement('div');
      emptyDay.classList.add('day', 'empty');
      daysContainer.appendChild(emptyDay);
    }

    for (let i = 1; i <= daysInMonth; i++) {
      const dayElement = document.createElement('div');
      dayElement.classList.add('day');
      dayElement.textContent = i;

      const today = new Date();
      if (i === today.getDate() && month === today.getMonth() && year === today.getFullYear()) {
        dayElement.classList.add('today');
      }

      daysContainer.appendChild(dayElement);
    }
  }

  prevBtn.addEventListener('click', function() {
    currentDate.setMonth(currentDate.getMonth() - 1);
    renderCalendar();
  });

  nextBtn.addEventListener('click', function() {
    currentDate.setMonth(currentDate.getMonth() + 1);
    renderCalendar();
  });

  renderCalendar();
});

CSS样式建议

为日历添加基本样式:

#calendar {
  width: 300px;
  font-family: Arial, sans-serif;
}

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

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

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

.day {
  padding: 5px;
  text-align: center;
  border-radius: 3px;
}

.day.empty {
  visibility: hidden;
}

.day.today {
  background-color: #4285f4;
  color: white;
}

扩展功能实现

添加日期选择功能:

// 在renderCalendar函数中添加
dayElement.addEventListener('click', function() {
  document.querySelectorAll('.day.selected').forEach(el => {
    el.classList.remove('selected');
  });
  this.classList.add('selected');
  // 可以在这里处理选中的日期逻辑
  console.log(`${year}-${month + 1}-${i}`);
});

第三方库推荐

如果需要更复杂的日历功能,可以考虑以下库:

js日历实现

  • FullCalendar:功能全面的日历库,支持事件、拖拽等功能
  • Pikaday:轻量级的日期选择器
  • date-fns:日期处理工具库,可用于复杂日期计算

以上实现提供了基本的日历功能,可以根据需求进一步扩展样式和交互功能。

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

相关文章

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现导航菜单

js实现导航菜单

使用HTML和CSS创建基础结构 导航菜单的基础结构通常由HTML的无序列表(<ul>)和列表项(<li>)组成,每个列表项包含一个链接(<a>)。CSS用于样式化…

js 多选 实现

js 多选 实现

实现多选的 JavaScript 方法 使用复选框(Checkbox)实现多选 通过 HTML 的 checkbox 元素配合 JavaScript 实现多选功能。用户可以选择多个选项,提交时获取所有…

vue js实现弹窗

vue js实现弹窗

Vue.js 实现弹窗的方法 使用组件实现弹窗 创建一个独立的弹窗组件,例如 Modal.vue,包含弹窗的 HTML 结构和样式。在组件中定义 props 控制弹窗的显示与隐藏。 <temp…

vue实现日历方案

vue实现日历方案

vue实现日历方案 使用第三方库(推荐方案) 推荐使用成熟的日历组件库,如v-calendar或fullcalendar-vue,它们提供丰富的功能和定制选项。 安装v-calendar: npm…

vue.js实现checkbox

vue.js实现checkbox

使用 v-model 绑定复选框 在 Vue.js 中,可以通过 v-model 指令实现复选框的双向数据绑定。复选框的值会与 Vue 实例中的数据属性同步。 <template>…