当前位置:首页 > JavaScript

js实现双日历

2026-02-03 06:19:31JavaScript

实现双日历的基础结构

使用HTML创建两个日历容器,分别用于显示起始日期和结束日期。CSS确保两个日历并排显示,样式保持一致。

<div class="calendar-container">
  <div id="calendar-start"></div>
  <div id="calendar-end"></div>
</div>
.calendar-container {
  display: flex;
  gap: 20px;
}
#calendar-start,
#calendar-end {
  width: 300px;
  border: 1px solid #ddd;
  padding: 10px;
}

动态生成日历逻辑

通过JavaScript生成单月日历,支持切换月份。核心逻辑包括计算月份天数、渲染日期格子,并绑定事件处理函数。

js实现双日历

function generateCalendar(containerId, year, month) {
  const container = document.getElementById(containerId);
  const daysInMonth = new Date(year, month + 1, 0).getDate();
  const firstDay = new Date(year, month, 1).getDay();

  let html = `<div class="header">${year}年${month + 1}月</div>`;
  html += '<div class="days-grid">';

  // 填充空白格子(月初偏移)
  for (let i = 0; i < firstDay; i++) {
    html += '<div class="day empty"></div>';
  }

  // 填充日期格子
  for (let day = 1; day <= daysInMonth; day++) {
    html += `<div class="day" data-day="${day}">${day}</div>`;
  }

  container.innerHTML = html;
}

双日历联动与日期选择

初始化两个日历并实现联动逻辑:选择起始日期后自动聚焦结束日期日历,且结束日期不得早于起始日期。

js实现双日历

let startDate = null;
let endDate = null;

function initDualCalendar() {
  const now = new Date();
  generateCalendar('calendar-start', now.getFullYear(), now.getMonth());
  generateCalendar('calendar-end', now.getFullYear(), now.getMonth() + 1);

  // 绑定日期点击事件
  document.querySelectorAll('#calendar-start .day').forEach(day => {
    day.addEventListener('click', () => {
      startDate = new Date(now.getFullYear(), now.getMonth(), parseInt(day.dataset.day));
      updateSelection('calendar-start', day);
    });
  });

  document.querySelectorAll('#calendar-end .day').forEach(day => {
    day.addEventListener('click', () => {
      if (!startDate) return;
      const selectedDate = new Date(now.getFullYear(), now.getMonth() + 1, parseInt(day.dataset.day));
      if (selectedDate >= startDate) {
        endDate = selectedDate;
        updateSelection('calendar-end', day);
      }
    });
  });
}

function updateSelection(calendarId, selectedElement) {
  // 清除旧选中状态
  document.querySelectorAll(`#${calendarId} .day.selected`).forEach(el => {
    el.classList.remove('selected');
  });
  selectedElement.classList.add('selected');
}

月份切换功能

添加按钮支持向前/向后切换月份,并同步更新两个日历的显示。

function addMonthSwitchers() {
  const startPrev = document.createElement('button');
  startPrev.textContent = '<';
  startPrev.addEventListener('click', () => switchMonth('calendar-start', -1));

  const startNext = document.createElement('button');
  startNext.textContent = '>';
  startNext.addEventListener('click', () => switchMonth('calendar-start', 1));

  document.getElementById('calendar-start').prepend(startPrev, startNext);
}

function switchMonth(calendarId, offset) {
  const header = document.querySelector(`#${calendarId} .header`);
  const [year, month] = header.textContent.match(/\d+/g).map(Number);
  const newMonth = month - 1 + offset;
  generateCalendar(calendarId, newMonth < 0 ? year - 1 : year, (newMonth + 12) % 12);
}

样式优化与交互反馈

通过CSS增强视觉反馈,例如高亮选中日期、禁用无效日期。

.day {
  padding: 5px;
  cursor: pointer;
}
.day.selected {
  background-color: #007bff;
  color: white;
}
.day.disabled {
  color: #ccc;
  cursor: not-allowed;
}

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

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

节流js实现

节流js实现

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