当前位置:首页 > JavaScript

js日历实现

2026-02-01 09:01:24JavaScript

实现日历的基本思路

日历的核心功能是展示日期,并允许用户选择日期。需要处理年、月、日的计算,以及界面布局。

获取当前日期

使用 Date 对象获取当前日期信息:

const date = new Date();
const currentYear = date.getFullYear();
const currentMonth = date.getMonth();

生成日历网格

计算某个月的第一天是星期几,以及该月的总天数:

function getDaysInMonth(year, month) {
  return new Date(year, month + 1, 0).getDate();
}

function getFirstDayOfMonth(year, month) {
  return new Date(year, month, 1).getDay();
}

渲染日历

创建日历的 HTML 结构并填充日期:

function renderCalendar(year, month) {
  const daysInMonth = getDaysInMonth(year, month);
  const firstDay = getFirstDayOfMonth(year, month);

  let html = '<div class="calendar">';
  html += '<div class="header">...</div>';
  html += '<div class="days">';

  // 填充空白格子(上个月末尾的几天)
  for (let i = 0; i < firstDay; i++) {
    html += '<div class="day empty"></div>';
  }

  // 填充当月日期
  for (let i = 1; i <= daysInMonth; i++) {
    html += `<div class="day">${i}</div>`;
  }

  html += '</div></div>';
  document.getElementById('calendar').innerHTML = html;
}

添加交互功能

为日期添加点击事件处理:

document.addEventListener('click', function(e) {
  if (e.target.classList.contains('day') && !e.target.classList.contains('empty')) {
    const selectedDay = parseInt(e.target.textContent);
    // 处理日期选择逻辑
  }
});

月份切换功能

实现上一月和下一月的切换按钮:

document.getElementById('prev-month').addEventListener('click', function() {
  currentMonth--;
  if (currentMonth < 0) {
    currentMonth = 11;
    currentYear--;
  }
  renderCalendar(currentYear, currentMonth);
});

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

样式设计

基本的 CSS 样式:

.calendar {
  width: 300px;
  font-family: Arial;
}

.header {
  display: flex;
  justify-content: space-between;
  padding: 10px;
}

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

.day {
  padding: 10px;
  text-align: center;
  cursor: pointer;
}

.day:hover {
  background-color: #eee;
}

.empty {
  visibility: hidden;
}

完整示例

将上述代码整合到一个 HTML 文件中:

<!DOCTYPE html>
<html>
<head>
  <style>
    /* 上面的CSS样式 */
  </style>
</head>
<body>
  <div id="calendar"></div>
  <button id="prev-month">上一月</button>
  <button id="next-month">下一月</button>

  <script>
    // 上面的JavaScript代码
  </script>
</body>
</html>

高级功能扩展

增加标记特殊日期的功能:

const specialDates = {
  '2023-10-1': '国庆节',
  '2023-12-25': '圣诞节'
};

function renderCalendar(year, month) {
  // ...之前的代码...
  for (let i = 1; i <= daysInMonth; i++) {
    const dateStr = `${year}-${month + 1}-${i}`;
    const special = specialDates[dateStr];
    html += `<div class="day" data-date="${dateStr}">${i}${special ? '<br>' + special : ''}</div>`;
  }
  // ...之后的代码...
}

响应式设计

使用媒体查询使日历适应不同屏幕尺寸:

js日历实现

@media (max-width: 600px) {
  .calendar {
    width: 100%;
  }
  .day {
    padding: 5px;
    font-size: 14px;
  }
}

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

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js和jquery

js和jquery

JavaScript 与 jQuery 的关系与区别 JavaScript 是一种动态编程语言,主要用于网页开发,使网页具有交互性。它是浏览器的原生脚本语言,可以直接在浏览器中运行。 jQuery…

vue表格实现日历

vue表格实现日历

Vue 表格实现日历的方法 基础表格结构 使用 el-table 或原生 HTML 表格,通过 v-for 循环生成日历格子。月份天数通过 new Date() 计算,动态渲染表格内容。 <t…

vue 日历组件实现

vue 日历组件实现

Vue 日历组件实现 基本结构搭建 使用Vue的单文件组件(SFC)结构,创建一个基础的日历组件框架。需要定义月份、年份的状态管理,以及日期渲染逻辑。 <template> <…

js实现vue模板

js实现vue模板

使用纯 JavaScript 实现 Vue 模板功能 要实现类似 Vue 的模板功能,可以通过以下步骤完成: 1. 数据绑定与响应式更新 通过 Object.defineProperty 或 Pr…