vue3日历选择器

 倒叙日历:

<template>
  <div class="date-picker">
    <div class="column" @wheel="onYearScroll">
      <div v-for="(year, index) in displayedYears" :key="index" :class="{current: year === currentYear.value && index === 1}">
        {{ year }}
      </div>
    </div>
    <div class="column" @wheel="onMonthScroll">
      <div v-for="(month, index) in displayedMonths" :key="index" :class="{current: month === currentMonth.value && index === 1}">
        {{ monthString(month) }}
      </div>
    </div>
    <div class="column" @wheel="onDayScroll">
      <div v-for="(day, index) in displayedDays" :key="index" :class="{current: day === currentDay.value && index === 1}">
        {{ dayString(day) }}
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'

const currentYear = ref(new Date().getFullYear())
const currentMonth = ref(new Date().getMonth() + 1)
const currentDay = ref(new Date().getDate())

const displayedYears = computed(() => {
  const year = currentYear.value
  return [year + 1, year, year - 1, year - 2]
})

const displayedMonths = computed(() => {
  const month = currentMonth.value
  return [
    (month + 1 - 1) % 12 + 1,
    month,
    (month - 1 + 12) % 12 || 12,
    (month - 2 + 12) % 12 || 12,
  ]
})

const daysInMonth = (year, month) => {
  return new Date(year, month, 0).getDate()
}

const displayedDays = computed(() => {
  const year = currentYear.value
  const month = currentMonth.value
  const day = currentDay.value
  const daysInCurrentMonth = daysInMonth(year, month)
  return [
    (day + 1 - 1) % daysInCurrentMonth + 1,
    day,
    (day - 1 + daysInCurrentMonth - 1) % daysInCurrentMonth + 1,
    (day - 2 + daysInCurrentMonth - 1) % daysInCurrentMonth + 1
  ]
})

const onYearScroll = (event) => {
  event.preventDefault()
  if (event.deltaY < 0) {
    currentYear.value += 1
  } else {
    currentYear.value -= 1
  }
  // Reset month and day to 1
  currentMonth.value = 1
  currentDay.value = 1
}

const onMonthScroll = (event) => {
  event.preventDefault()
  if (event.deltaY < 0) {
    currentMonth.value = (currentMonth.value % 12) + 1
  } else {
    currentMonth.value = (currentMonth.value - 1 + 11) % 12 + 1
  }
  // Reset day to 1
  currentDay.value = 1
}

const onDayScroll = (event) => {
  event.preventDefault()
  const year = currentYear.value
  const month = currentMonth.value
  const daysInCurrentMonth = daysInMonth(year, month)
  if (event.deltaY < 0) {
    currentDay.value = (currentDay.value % daysInCurrentMonth) + 1
  } else {
    currentDay.value = (currentDay.value - 1 + daysInCurrentMonth - 1) % daysInCurrentMonth + 1
  }
}

const monthString = (month) => {
  return month.toString().padStart(2, '0')
}

const dayString = (day) => {
  return day.toString().padStart(2, '0')
}
</script>

<style>
.date-picker {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 20px;
  color: #fff !important;
}
.column {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 60px;
}
.column div {
  height: 30px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.current {
  font-weight: bold;
  color: red;
}
</style>

正序日历:

 

<template>
    <div class="date-picker">
      <div class="column" @wheel="onYearScroll">
        <div v-for="(year, index) in displayedYears" :key="index" :class="{current: year === currentYear}">
          {{ year }}
        </div>
      </div>
      <div class="column" @wheel="onMonthScroll">
        <div v-for="(month, index) in displayedMonths" :key="index" :class="{current: month === currentMonth}">
          {{ monthString(month) }}
        </div>
      </div>
      <div class="column" @wheel="onDayScroll">
        <div v-for="(day, index) in displayedDays" :key="index" :class="{current: day === currentDay}">
          {{ dayString(day) }}
        </div>
      </div>
    </div>
  </template>
  
  <script setup>
  import { ref, computed } from 'vue'
  
  const currentYear = ref(new Date().getFullYear())
  const currentMonth = ref(new Date().getMonth() + 1)
  const currentDay = ref(new Date().getDate())
  
  const displayedYears = computed(() => {
    const year = currentYear.value
    return [year - 2, year - 1, year, year + 1, year + 2]
  })
  
  const displayedMonths = computed(() => {
    const month = currentMonth.value
    return [
      (month - 2 + 12) % 12 || 12,
      (month - 1 + 12) % 12 || 12,
      month,
      (month + 1 - 1) % 12 + 1,
      (month + 2 - 1) % 12 + 1
    ]
  })
  
  const daysInMonth = (year, month) => {
    return new Date(year, month, 0).getDate()
  }
  
  const displayedDays = computed(() => {
    const year = currentYear.value
    const month = currentMonth.value
    const day = currentDay.value
    const daysInCurrentMonth = daysInMonth(year, month)
    return [
      (day - 2 + daysInCurrentMonth) % daysInCurrentMonth || daysInCurrentMonth,
      (day - 1 + daysInCurrentMonth) % daysInCurrentMonth || daysInCurrentMonth,
      day,
      (day + 1 - 1) % daysInCurrentMonth + 1,
      (day + 2 - 1) % daysInCurrentMonth + 1
    ]
  })
  
  const onYearScroll = (event) => {
    event.preventDefault()
    if (event.deltaY > 0) {
      currentYear.value += 1
    } else {
      currentYear.value -= 1
    }
    // Reset month and day to 1
    currentMonth.value = 1
    currentDay.value = 1
  }
  
  const onMonthScroll = (event) => {
    event.preventDefault()
    if (event.deltaY > 0) {
      currentMonth.value = (currentMonth.value % 12) + 1
    } else {
      currentMonth.value = (currentMonth.value - 1 + 11) % 12 + 1
    }
    // Reset day to 1
    currentDay.value = 1
  }
  
  const onDayScroll = (event) => {
    event.preventDefault()
    const year = currentYear.value
    const month = currentMonth.value
    const daysInCurrentMonth = daysInMonth(year, month)
    if (event.deltaY > 0) {
      currentDay.value = (currentDay.value % daysInCurrentMonth) + 1
    } else {
      currentDay.value = (currentDay.value - 1 + daysInCurrentMonth - 1) % daysInCurrentMonth + 1
    }
  }
  
  const monthString = (month) => {
    return month.toString().padStart(2, '0')
  }
  
  const dayString = (day) => {
    return day.toString().padStart(2, '0')
  }
  </script>
  
  <style>
  .date-picker {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 20px;
    color: #fff !important;
  }
  .column {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 60px;
  }
  .column div {
    height: 30px;
    display: flex;
    justify-content: center;
    align-items: center;
  }
  .current {
    font-weight: bold;
    color: red;
  }
  </style>
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/754708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度解析RocketMq源码-消费者索引ConsumeQueue

1.绪论 rocketmq的broker中关于消息持久化的组件主要包含三个&#xff0c;分别是&#xff1a;持久化消息到文件中的组件commitLog&#xff1b;根据消息key索引commitLog日志的indexFile&#xff1b;消费者根据topic和queueId查询commitLog日志的consumeQueue。前面已经介绍com…

Profibus协议转profinet协议网关模块连接电机保护器与PLC通讯

一、背景 工业通讯中常见的协议有&#xff1a;Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等在现代工业控制系统中具有重要的角色。而Profibus协议转…

智慧数据中心可视化:高效管理与直观监控的未来

随着数据中心的规模和复杂性不断增加&#xff0c;传统管理方式难以满足需求。智慧数据中心通过图扑可视化实现实时数据监控和智能分析&#xff0c;将复杂的基础设施直观呈现&#xff0c;极大提升了运维效率、故障排查速度和资源优化能力&#xff0c;为企业提供现代化、智能化的…

mac app应用程序如何自定义图标, 更换.app为自己喜欢的图标或者图片 详细图文讲解

在mac系统中&#xff0c;我们可以对任何的app应用程序更换或者自定义图标&#xff0c; 这个图标可以是拥有的app的图标&#xff0c;或者是你自己制作的 x.icns 图标 或者是 任意的图片&#xff0c; 建议大小512x512 。 自定义图标方法如下&#xff1a; 1. 更换为已有app的图标…

词向量模型

文章目录 RNN词向量模型模型整体框架训练数据构建CBOW与Skip-gram模型负采样 RNN 卷积神经网络&#xff08;CNN&#xff09;主要应用计算机视觉&#xff0c;而递归神经网络&#xff08;RNN&#xff09;主要应用于自然语言处理。 递归神经网络会涉及处理之前所有的数据&#x…

Paragon NTFS与Tuxera NTFS有何区别 Mac NTFS 磁盘读写工具选哪个好

macOS系统虽然以稳定、安全系数高等优点著称&#xff0c;但因其封闭性&#xff0c;不能对NTFS格式磁盘写入数据常被人们诟病。优质的解决方案是使用磁盘管理软件Paragon NTFS for Mac&#xff08;点击获取激活码&#xff09;和Tuxera NTFS&#xff08;点击获取激活码&#xff0…

51单片机STC89C52RC——11.1 蜂鸣器播放音乐

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;蜂鸣器 2.1 介绍 2.2 板子位置电路图 2.3 发声原理 2.4 音符和频率 三&#xff0c;创建Keil项目 四&#xff0c;代码 4.1 乐谱代码 4.1.1 《义勇军进行曲》 4.1.2 《天空之城》 4.1.3 《小美满》 4.1.…

2024年湖南建筑安全员考试题库,精准题库。

31.安全考核的对象应包括施工企业各管理层的&#xff08;&#xff09;、相关职能部门及岗位和工程项目参建人员。 A.技术负责人 B.安全负责人 C.主要负责人 D.第一负责人 答案&#xff1a;C 32.安全防护设施应标准化、定型化、&#xff08;&#xff09;。 A.规范化 B.工…

TFMath Caculator:一个简单的Java AWT计算器

目录 背景&#xff1a; 代码展示: 代码解析: 输出结果: 总结: 背景&#xff1a; 使用Java AWT(Abstract Window Toolkit)库创建的简单计算器应用-TFMath Calculator。这个计算器允许用户输入两个数字&#xff0c;点击号按钮后&#xff0c;计算器会计算这两个数字的和&…

【Redis四】主从复制、哨兵以及Cluster集群

目录 一.主从复制、哨兵、集群的区别 二.Redis主从复制 1.作用 2.原理 3.流程 三.搭建Redis 主从复制 1.源码编译安装以及配置文件修改 1.1.修改 Redis 配置文件&#xff08;Slave节点操作&#xff09; 2.验证主从复制 2.1.在Master节点上看日志 2.2.在Master节点上…

混凝土搅拌站中的智能化系统应用

随着科技的飞速发展&#xff0c;混凝土搅拌站已经进入了现代化、智能化的新时代。现代自动化、智能化技术的应用&#xff0c;使得混凝土搅拌站更加高效、准确、可靠&#xff0c;同时也提高了生产效率和质量。本文将带你深入探索混凝土搅拌站中运用到现代自动化、智能化的方方面…

k8s架构设计思想

1.谷歌borg云计算管理平台 一类&#xff1a;infrastucture platform software 另一类&#xff1a;borg为主的非虚拟化技术&#xff0c;调度进程 核心是轻量级作业调度&#xff0c;不是做虚拟化/云平台的 borg本身用了一些容器技术 生产业务product workload要求高可用&#xf…

第三节:如何理解Spring的两个特性IOC和AOP(自学Spring boot 3.x第一天)

大家好&#xff0c;我是网创有方&#xff0c;接下来教大家如何理解Spring的两个特性IOC和AOP。本节有点难&#xff0c;大家多理解。 IOC&#xff08;控制反转&#xff09; 定义与核心思想&#xff1a; IOC&#xff0c;全称Inversion of Control&#xff0c;即控制反转。 其核…

为什么ISO 45001职业健康安全管理体系是企业发展的基石

ISO 45001源自OHSAS 18001职业健康和安全管理体系&#xff0c;是全球第一个国际职业健康和安全管理标准。ISO&#xff08;国际标准化组织&#xff09;于2018年发布了这一标准&#xff0c;旨在帮助各类组织为员工提供一个更安全、更健康的工作环境。与OHSAS 18001相比&#xff0…

云原生之使用Docker部署RabbitMQ消息中间件

云原生之使用Docker部署RabbitMQ消息中间件 一、RabbitMQ介绍1.1 RabbitMQ简介1.2 RabbitMQ特点1.3 RabbitMQ使用场景 二、检查Docker环境2.1 检查Docker版本2.2 检查操作系统版本2.3 检查Docker状态 三、下载RabbitMQ镜像四、部署RabbitMQ服务4.1创建挂载目录4.2 运行RabbitMQ…

LabVIEW在光学与光子学实验室中的应用

光学与光子学实验室致力于光学和光子学前沿领域的研究&#xff0c;涉及超快光学、非线性光学、光纤通信、光子晶体等多个方向。实验室需要高精度的实验控制和数据采集系统&#xff0c;以进行复杂的光学实验&#xff0c;并对实验数据进行实时处理和分析。 项目需求 实时控制与监…

C++再谈构造函数、隐式类型转换、static成员、友元函数、内部类等的介绍

目录 前言一、再谈构造函数1. 构造函数体赋值2. 初始化列表3. 初始化列表初始化顺序4. 初始化隐式类转换 二、static成员1. 概念2. 特性 三、 友元1. 友元函数2. 友元类 四、内部类总结 前言 C再谈构造函数、隐式类型转换、static成员、友元函数、内部类等的介绍 一、再谈构造…

imx6ull/linux应用编程学习(3) 输入设备应用编程(上)(按键)

0.概念 输入设备&#xff1a;可以产生输入事件的设备 Linux系统设计了一个兼容所有输入设备的框架&#xff0c;就是input子系统&#xff0c;其直接向应用层提供了一套统一的接口&#xff0c;其在/dev/input目录下。 流程&#xff1a;如果要读取输入设备&#xff0c;一般遵循以下…

Spring AOP实战--之优雅的统一打印web请求的出参和入参

背景介绍 由于实际项目内网开发&#xff0c;项目保密&#xff0c;因此本文以笔者自己搭建的demo做演示&#xff0c;方便大家理解。 在项目开发过程中&#xff0c;团队成员为了方便调试&#xff0c;经常会在方法的出口和入口处加上log输出&#xff0c;由于每个人的log需求和输…

IOS17闪退问题Assertion failure in void _UIGraphicsBeginImageContextWithOptions

最近项目更新到最新版本IOS17&#xff0c;发现一个以前的页面突然闪退了。原来是IOS17下&#xff0c;这个方法 UIGraphicsBeginImageContext(CGSize size) 已经被移除&#xff0c;原参数如果size为0的话&#xff0c;会出现闪退现象。 根据说明&#xff0c;上述方法已经被替换…