当前位置:首页 > JavaScript

JS实现日期滚动选择

2026-03-01 18:06:32JavaScript

实现日期滚动选择的核心思路

使用HTML和CSS构建一个滚动容器,包含年、月、日的可滚动列表。通过JavaScript监听滚动事件,计算当前选中的值并更新显示。

HTML结构示例

<div class="date-picker">
  <div class="scroll-container" id="year-scroll"></div>
  <div class="scroll-container" id="month-scroll"></div>
  <div class="scroll-container" id="day-scroll"></div>
</div>

CSS样式设计

.date-picker {
  display: flex;
  width: 300px;
  height: 200px;
  overflow: hidden;
}

.scroll-container {
  flex: 1;
  height: 100%;
  overflow-y: scroll;
  scroll-snap-type: y mandatory;
}

.scroll-item {
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  scroll-snap-align: center;
}

JavaScript实现逻辑

初始化滚动容器并填充日期数据:

JS实现日期滚动选择

function initDatePicker() {
  const years = generateYears(1900, 2100);
  const months = Array.from({length:12}, (_,i) => i+1);
  const days = Array.from({length:31}, (_,i) => i+1);

  populateScroll('year-scroll', years);
  populateScroll('month-scroll', months);
  populateScroll('day-scroll', days);
}

function populateScroll(id, data) {
  const container = document.getElementById(id);
  data.forEach(item => {
    const div = document.createElement('div');
    div.className = 'scroll-item';
    div.textContent = item;
    container.appendChild(div);
  });
}

添加滚动事件监听:

JS实现日期滚动选择

function setupScrollListeners() {
  const containers = document.querySelectorAll('.scroll-container');
  containers.forEach(container => {
    container.addEventListener('scroll', debounce(handleScroll, 100));
  });
}

function handleScroll(e) {
  const container = e.target;
  const items = container.querySelectorAll('.scroll-item');
  const containerRect = container.getBoundingClientRect();
  const containerCenter = containerRect.top + containerRect.height/2;

  let selectedItem;
  items.forEach(item => {
    const itemRect = item.getBoundingClientRect();
    if (Math.abs(itemRect.top + itemRect.height/2 - containerCenter) < 5) {
      selectedItem = item;
    }
  });

  if (selectedItem) {
    highlightSelected(selectedItem);
    updateSelectedDate();
  }
}

日期计算与更新:

function updateSelectedDate() {
  const year = getCenterValue('year-scroll');
  const month = getCenterValue('month-scroll');
  const day = getCenterValue('day-scroll');

  // 处理2月天数问题
  const maxDay = new Date(year, month, 0).getDate();
  const dayScroll = document.getElementById('day-scroll');
  if (day > maxDay) {
    dayScroll.scrollTop = (maxDay-1) * 40;
  }

  console.log(`Selected date: ${year}-${month}-${day}`);
}

优化建议

添加惯性滚动效果:

function enableMomentumScroll() {
  const containers = document.querySelectorAll('.scroll-container');
  containers.forEach(container => {
    let startY = 0;
    let startTime = 0;

    container.addEventListener('touchstart', e => {
      startY = e.touches[0].clientY;
      startTime = Date.now();
    });

    container.addEventListener('touchend', e => {
      const endY = e.changedTouches[0].clientY;
      const endTime = Date.now();
      const distance = endY - startY;
      const duration = endTime - startTime;
      const velocity = distance / duration;

      if (Math.abs(velocity) > 0.1) {
        const momentum = velocity * 1000;
        container.scrollBy({top: -momentum, behavior: 'smooth'});
      }
    });
  });
}

完整实现注意事项

  1. 需要考虑不同月份的天数变化,特别是2月的闰年情况
  2. 添加边界检测防止滚动超出范围
  3. 实现平滑滚动到最近选项的功能
  4. 可考虑使用第三方库如Picker.js或MobileSelect.js简化开发
  5. 移动端需要特别处理触摸事件以获得更好的用户体验

这种实现方式适用于大多数现代浏览器,通过CSS的scroll-snap特性可以确保滚动后自动对齐到最近的选项,配合JavaScript的事件处理可以构建出流畅的日期选择体验。

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

相关文章

JS实现跳表

JS实现跳表

跳表的基本概念 跳表(Skip List)是一种基于概率的数据结构,允许快速查询、插入和删除操作,时间复杂度平均为O(log n)。它通过多层链表实现,每一层都是下一层的子集,高层链表跳过多个元素,从…

vue实现日期加减

vue实现日期加减

实现日期加减的方法 在Vue中实现日期加减可以通过JavaScript的Date对象或第三方库如moment.js或date-fns来完成。以下是几种常见的方法: 使用JavaScript的Date…

vue实现日期选择显示

vue实现日期选择显示

Vue 实现日期选择显示的方法 使用原生 HTML5 input[type="date"] 通过 HTML5 提供的日期输入控件实现基础日期选择功能,适合简单场景。 <template>…

vue框架实现日期显示

vue框架实现日期显示

实现日期显示的基本方法 在Vue中显示日期可以通过多种方式实现,以下是几种常见的方法: 使用JavaScript的Date对象 直接通过JavaScript的Date对象获取当前日期并显示: &l…

vue实现选择日期

vue实现选择日期

使用 Vue 实现日期选择功能 使用原生 HTML5 <input type="date"> 最简单的实现方式是使用 HTML5 的原生日期选择器,Vue 可以通过 v-model 进行数…

react如何制作日期选择

react如何制作日期选择

使用原生HTML日期选择器 React可以直接使用HTML5的<input type="date">实现简单的日期选择功能。这种方式无需额外依赖,适合基础需求。 import Rea…