当前位置:首页 > JavaScript

JS实现日期滚动选择

2026-01-31 03:00:19JavaScript

实现日期滚动选择的基本思路

使用HTML、CSS和JavaScript创建一个日期滚动选择器,允许用户通过滚动选择年、月、日。核心是通过监听滚动事件,动态更新显示的值。

HTML结构

创建一个包含年、月、日三个独立滚动区域的容器。每个区域使用<div>包裹,内部通过<ul>列表展示可选值。

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

CSS样式

设置滚动区域的样式,确保内容垂直排列且可滚动。通过CSS隐藏滚动条并居中显示当前选中项。

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

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

.scroll-area ul {
  padding: 0;
  margin: 0;
  list-style: none;
}

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

JavaScript逻辑

动态生成年、月、日的可选值,并绑定滚动事件。通过计算滚动位置确定当前选中的值。

// 初始化数据
const currentYear = new Date().getFullYear();
const years = Array.from({ length: 100 }, (_, i) => currentYear - 50 + i);
const months = Array.from({ length: 12 }, (_, i) => i + 1);
const days = Array.from({ length: 31 }, (_, i) => i + 1);

// 填充列表
function populateList(elementId, items) {
  const ul = document.querySelector(`#${elementId} ul`);
  items.forEach(item => {
    const li = document.createElement('li');
    li.textContent = item;
    ul.appendChild(li);
  });
}

populateList('year', years);
populateList('month', months);
populateList('day', days);

// 监听滚动事件
document.querySelectorAll('.scroll-area').forEach(area => {
  area.addEventListener('scroll', function() {
    const liHeight = 40;
    const scrollTop = this.scrollTop;
    const selectedIndex = Math.round(scrollTop / liHeight);
    const selectedValue = this.querySelectorAll('li')[selectedIndex].textContent;
    console.log(`${this.id}: ${selectedValue}`);
  });
});

优化选中项居中

使用CSS的scroll-snap特性确保滚动停止时选中项自动居中。修改.scroll-area的CSS:

.scroll-area {
  scroll-snap-type: y mandatory;
}

.scroll-area li {
  scroll-snap-align: center;
}

动态更新天数

根据选择的年份和月份动态更新天数,处理不同月份的天数差异(如闰年二月)。

JS实现日期滚动选择

function updateDays(year, month) {
  const daysInMonth = new Date(year, month, 0).getDate();
  const dayList = document.querySelector('#day ul');
  dayList.innerHTML = '';
  const days = Array.from({ length: daysInMonth }, (_, i) => i + 1);
  populateList('day', days);
}

document.querySelector('#year').addEventListener('scroll', function() {
  const year = getSelectedValue('year');
  const month = getSelectedValue('month');
  updateDays(year, month);
});

document.querySelector('#month').addEventListener('scroll', function() {
  const year = getSelectedValue('year');
  const month = getSelectedValue('month');
  updateDays(year, month);
});

function getSelectedValue(elementId) {
  const area = document.querySelector(`#${elementId}`);
  const liHeight = 40;
  const scrollTop = area.scrollTop;
  const selectedIndex = Math.round(scrollTop / liHeight);
  return area.querySelectorAll('li')[selectedIndex].textContent;
}

完整代码示例

整合上述代码,实现一个完整的日期滚动选择器。用户可以通过滚动选择年、月、日,且天数会根据年月动态调整。

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

相关文章

JS实现跳表

JS实现跳表

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

vue实现日期回填

vue实现日期回填

实现日期回填的基本思路 在Vue中实现日期回填通常涉及表单数据的双向绑定,结合日期选择器组件(如Element UI的DatePicker或原生HTML的input type="date")。核心是通…

vue如何实现日期递增

vue如何实现日期递增

实现日期递增的方法 在Vue中实现日期递增可以通过JavaScript的Date对象进行操作,结合Vue的响应式特性更新数据。以下是几种常见的实现方式: 使用计算属性 data() {…

vue实现选择日期

vue实现选择日期

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

mui vue实现日期插件

mui vue实现日期插件

MUI Vue 实现日期插件 在 Vue 项目中,可以使用 MUI(Material-UI)风格的日期选择器插件。以下是两种常见的实现方式: 使用 Vuetify 的日期选择器 Vuetify 是一…

JS如何访问react内部的数据

JS如何访问react内部的数据

访问 React 组件内部数据的方法 在 React 中,组件内部的数据通常通过 state 或 props 管理。以下是几种常见的访问方式: 通过 state 访问数据 React 组件的内部状态…