当前位置:首页 > JavaScript

js h5实现动态日历

2026-04-05 02:44:36JavaScript

实现动态日历的基本思路

动态日历通常需要展示当前月份的日期,并允许用户切换月份或年份。使用JavaScript和HTML5可以轻松实现这一功能。

HTML结构

创建一个基本的HTML结构,包含日历的容器、月份/年份导航和日期表格。

js h5实现动态日历

<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;
  border: 1px solid #ccc;
  font-family: Arial, sans-serif;
}

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px;
  background: #f5f5f5;
}

.weekdays {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  text-align: center;
  background: #eee;
}

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

.days div {
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.days div:hover {
  background: #f0f0f0;
}

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

JavaScript逻辑

编写JavaScript代码来动态生成日历,并处理月份切换。

js h5实现动态日历

document.addEventListener('DOMContentLoaded', function() {
  const monthYearElement = document.getElementById('month-year');
  const daysElement = document.getElementById('days');
  const prevButton = document.getElementById('prev');
  const nextButton = document.getElementById('next');

  let currentDate = new Date();
  let currentMonth = currentDate.getMonth();
  let currentYear = currentDate.getFullYear();

  function renderCalendar() {
    const firstDay = new Date(currentYear, currentMonth, 1);
    const lastDay = new Date(currentYear, currentMonth + 1, 0);
    const daysInMonth = lastDay.getDate();
    const startingDay = firstDay.getDay();

    monthYearElement.textContent = `${currentYear}年 ${currentMonth + 1}月`;

    daysElement.innerHTML = '';

    for (let i = 0; i < startingDay; i++) {
      const dayElement = document.createElement('div');
      dayElement.classList.add('prev-month');
      const prevMonthLastDay = new Date(currentYear, currentMonth, 0).getDate();
      dayElement.textContent = prevMonthLastDay - startingDay + i + 1;
      daysElement.appendChild(dayElement);
    }

    for (let i = 1; i <= daysInMonth; i++) {
      const dayElement = document.createElement('div');
      dayElement.textContent = i;
      if (i === currentDate.getDate() && currentMonth === currentDate.getMonth() && currentYear === currentDate.getFullYear()) {
        dayElement.classList.add('today');
      }
      daysElement.appendChild(dayElement);
    }

    const totalDays = startingDay + daysInMonth;
    const remainingCells = 42 - totalDays;

    for (let i = 1; i <= remainingCells; i++) {
      const dayElement = document.createElement('div');
      dayElement.classList.add('next-month');
      dayElement.textContent = i;
      daysElement.appendChild(dayElement);
    }
  }

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

  nextButton.addEventListener('click', function() {
    currentMonth++;
    if (currentMonth > 11) {
      currentMonth = 0;
      currentYear++;
    }
    renderCalendar();
  });

  renderCalendar();
});

功能扩展

可以添加更多功能,如点击日期事件、标记特定日期或添加日程管理。

daysElement.addEventListener('click', function(e) {
  if (e.target.tagName === 'DIV' && !e.target.classList.contains('prev-month') && !e.target.classList.contains('next-month')) {
    alert(`你选择了 ${currentYear}年 ${currentMonth + 1}月 ${e.target.textContent}日`);
  }
});

响应式设计

为适应不同屏幕尺寸,可以添加媒体查询。

@media (max-width: 400px) {
  .calendar {
    width: 100%;
  }
}

通过以上步骤,可以实现一个基本的动态日历,用户可以通过按钮切换月份,日历会动态更新显示当前月份的日期布局。

标签: 日历动态
分享给朋友:

相关文章

动态路由的实现vue

动态路由的实现vue

动态路由的实现(Vue) 在Vue中实现动态路由通常涉及以下方法: 基于路由参数(params) 在路由配置中使用动态片段(以冒号开头),例如: const routes = [ { path…

vue实现动态报表

vue实现动态报表

Vue 实现动态报表的方法 数据绑定与动态渲染 使用 Vue 的响应式数据特性,通过 v-for 动态渲染表格或图表。数据通常从 API 获取,存储在组件的 data 或 Vuex 状态中。例如:…

vue日历拖拽实现

vue日历拖拽实现

Vue 日历拖拽实现方案 使用 vue-draggable 库 安装依赖库: npm install vuedraggable 基础拖拽日历实现代码: <template> <…

vue实现动态高度

vue实现动态高度

Vue 实现动态高度的常见方法 使用 v-bind:style 或 :style 动态绑定样式 通过计算属性或方法动态计算高度值,绑定到元素的 style 属性上。这种方式适合高度值需要频繁变化的场景…

vue实现登录动态路由

vue实现登录动态路由

实现登录动态路由的基本思路 动态路由的核心是根据用户权限或角色,在登录后动态加载可访问的路由表。Vue Router 提供了 addRoutes 方法(Vue Router 4.x 使用 addRou…

vue动态路由返回实现

vue动态路由返回实现

vue动态路由返回实现 在Vue中实现动态路由返回功能,通常需要结合路由参数、导航守卫或编程式导航。以下是几种常见方法: 使用$router.go方法 通过$router.go(-1)返回上一页,这…