当前位置:首页 > JavaScript

JS实现日期滚动选择

2026-01-31 03:00:19JavaScript

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

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

HTML结构

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

JS实现日期滚动选择

<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逻辑

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

JS实现日期滚动选择

// 初始化数据
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;
}

动态更新天数

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

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
分享给朋友:

相关文章

jquery日期

jquery日期

jQuery 日期处理 jQuery本身不直接提供日期处理功能,但可以结合JavaScript的Date对象或第三方库(如moment.js)来实现日期操作。以下是常见日期处理的实现方法: 获取当前…

vue实现日期选择显示

vue实现日期选择显示

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

react如何在前台显示日期

react如何在前台显示日期

在React中显示日期的方法 使用JavaScript的Date对象 通过创建new Date()获取当前日期,利用其方法(如toLocaleDateString())格式化显示: const cu…

php实现日期时间相减

php实现日期时间相减

日期时间相减的实现方法 在PHP中,可以使用DateTime类和DateInterval类来实现日期时间的相减操作。以下是几种常见的方法: 使用DateTime类的diff方法 $date1 = n…

js实现日期选择

js实现日期选择

使用原生JavaScript实现日期选择器 创建基础HTML结构 <input type="text" id="datePicker" placeholder="选择日期"> <d…

JS实现文本的删除

JS实现文本的删除

使用 substring() 方法 通过指定起始和结束索引截取字符串的一部分,间接实现删除效果。 let str = "Hello World"; let newStr = str.substr…