当前位置:首页 > JavaScript

js实现日期选择

2026-01-30 14:10:32JavaScript

使用原生JavaScript实现日期选择器

创建基础HTML结构

<input type="text" id="datePicker" placeholder="选择日期">
<div id="datePickerCalendar" class="calendar-container"></div>

添加基本CSS样式

.calendar-container {
  display: none;
  position: absolute;
  width: 300px;
  border: 1px solid #ccc;
  background: white;
  z-index: 100;
}
.calendar-header {
  display: flex;
  justify-content: space-between;
  padding: 10px;
  background: #f0f0f0;
}
.calendar-days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
}
.day-cell {
  padding: 10px;
  text-align: center;
  cursor: pointer;
}
.day-cell:hover {
  background: #eee;
}

实现JavaScript核心功能

document.addEventListener('DOMContentLoaded', function() {
  const dateInput = document.getElementById('datePicker');
  const calendar = document.getElementById('datePickerCalendar');
  let currentDate = new Date();

  dateInput.addEventListener('focus', showCalendar);

  function showCalendar() {
    calendar.style.display = 'block';
    renderCalendar(currentDate);
  }

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

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

    const startDay = firstDay.getDay();

    let calendarHTML = `
      <div class="calendar-header">
        <button id="prevMonth">←</button>
        <h3>${year}年 ${month + 1}月</h3>
        <button id="nextMonth">→</button>
      </div>
      <div class="calendar-days">
        <div>日</div><div>一</div><div>二</div><div>三</div>
        <div>四</div><div>五</div><div>六</div>
    `;

    for (let i = 0; i < startDay; i++) {
      calendarHTML += `<div class="day-cell"></div>`;
    }

    for (let day = 1; day <= daysInMonth; day++) {
      calendarHTML += `<div class="day-cell" data-day="${day}">${day}</div>`;
    }

    calendarHTML += `</div>`;
    calendar.innerHTML = calendarHTML;

    document.getElementById('prevMonth').addEventListener('click', () => {
      currentDate.setMonth(currentDate.getMonth() - 1);
      renderCalendar(currentDate);
    });

    document.getElementById('nextMonth').addEventListener('click', () => {
      currentDate.setMonth(currentDate.getMonth() + 1);
      renderCalendar(currentDate);
    });

    const dayCells = document.querySelectorAll('.day-cell[data-day]');
    dayCells.forEach(cell => {
      cell.addEventListener('click', () => {
        const selectedDay = cell.getAttribute('data-day');
        const selectedDate = new Date(
          currentDate.getFullYear(),
          currentDate.getMonth(),
          selectedDay
        );
        dateInput.value = formatDate(selectedDate);
        calendar.style.display = 'none';
      });
    });
  }

  function formatDate(date) {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
  }
});

使用第三方库实现日期选择

安装flatpickr库

npm install flatpickr

基本使用示例

import flatpickr from "flatpickr";
import "flatpickr/dist/flatpickr.min.css";

flatpickr("#datePicker", {
  dateFormat: "Y-m-d",
  allowInput: true,
  locale: "zh"
});

移动端优化的日期选择

使用input的date类型

<input type="date" id="mobileDatePicker">

添加JavaScript增强功能

const mobileDatePicker = document.getElementById('mobileDatePicker');
mobileDatePicker.addEventListener('change', function() {
  console.log('选择的日期:', this.value);
});

日期范围选择实现

HTML结构

<input type="text" id="startDate" placeholder="开始日期">
<input type="text" id="endDate" placeholder="结束日期">
<div id="rangePickerCalendar"></div>

JavaScript实现

js实现日期选择

// 类似单日期选择器的实现,但需要处理两个日期之间的逻辑
// 可参考上述单日期选择器代码扩展

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

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…