当前位置:首页 > 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
分享给朋友:

相关文章

uniapp打卡日期

uniapp打卡日期

实现打卡日期的基本方法 在UniApp中实现打卡日期功能,可以通过<calendar>组件或自定义日期选择器完成。官方推荐使用第三方日历组件如uni-calendar,需通过HBuilde…

vue实现日期回填

vue实现日期回填

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

vue实现滑动日期

vue实现滑动日期

实现滑动日期选择器的基本思路 在Vue中实现滑动日期选择器可以通过结合第三方库或自定义组件完成。核心逻辑包括日期数据的生成、滑动动画的实现以及用户交互处理。 使用第三方库(如vant) 安装vant…

vue实现日期组件

vue实现日期组件

Vue 日期组件的实现方法 使用原生 HTML5 input[type="date"] 在 Vue 中可以直接使用 HTML5 的原生日历控件,这种方式简单但样式和功能受限。 <templa…

vue 实现日期多选

vue 实现日期多选

实现日期多选的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选。日期选择器组件(如 el-date-picker)需设置 type="dates"…

vue如何实现日期递增

vue如何实现日期递增

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