vue3日历选择器

news2024/11/25 20:22:27

 倒叙日历:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM相关理论知识

一、计算机的组成 1.输入设备&#xff1a;将数据与程序转换成计算机能够识别&#xff0c;存储&#xff0c;运算的形式&#xff0c;输送到计算机中。 2.输出设备&#xff1a;将计算机对程序和数据的运算结果输送到计算机外部设备 3.控制器&#xff1a;由程序技术器&#xff0…

2024全国青少年信息素养大赛图形化编程复赛评分标准及比赛大纲

一、 参赛技术要求 &#xff08;1&#xff09;竞赛平台 参赛选手使用官方竞赛平台进行比赛。 &#xff08;2&#xff09;网络环境 在能满足竞赛需求的联网环境下进行。 &#xff08;3&#xff09;浏览器 建议使用谷歌 Chrome 浏览器&#xff0c;版本号 100 及以上。 可以…

迎接第500家伙伴

今天&#xff0c;我们迎来了一个振奋人心的时刻&#xff1a;明道云签约伙伴正式突破500家&#xff01;这一重要里程碑不仅见证了我们的成长&#xff0c;更是对我们一直以来努力和坚持的最好证明。 迎接第500家伙伴 第500家加入明道云伙伴的是江苏中麒鑫控股&#xff08;集团&…

HarmonyOS(41) Badge 消息实现99+功能

Badge标记 Badge作用实现效果源码参考资料 Badge作用 APP里常见的功能是在一个tab的右上角展示未读消息99&#xff0c;HarmonyOS就提供了实现该功能的组件器组件。该组件支持展示数字、数字超过100自动展示99、文字。同时支持修改文字和数字的颜色&#xff0c;以及小圆点的背景…

【源码+文档+调试讲解】学术团队管理系统设计与实现

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学术团队管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信息…

数据稀疏如何学好embedding?

在推荐系统中&#xff0c;冷启动或长尾是一个常见的问题&#xff0c;模型在数据量较少的user或item上的预测效果很差。造成冷启动样本预测效果不好的重要原因之一是&#xff0c;冷启动样本积累的数据比较少&#xff0c;不足以通过训练得到一个好的embedding&#xff08;通过use…

开源/标准版 首页 logo大小修改

这个是diy的&#xff1a; 文件地址&#xff1a;template/uni-app/pages/index/diy/components/headerSerch.vue 这个是页面设计的&#xff1a; 文件地址&#xff1a;template/uni-app/pages/index/visualization/components/headerSerch.vue 先删除这三个 然后改下图的地方

How to persist LangChain conversation memory (save and load)

题意&#xff1a;如何持久化 LangChain 对话记忆&#xff08;保存和加载&#xff09; 问题背景&#xff1a; Im creating a conversation like so: 我正在创建一个对话&#xff0c;如下所示&#xff1a; llm ChatOpenAI(temperature0, openai_api_keyOPENAI_API_KEY,…

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…

FuTalk设计周刊-Vol.026

&#x1f525;&#x1f525;AI漫谈 热点捕手&#x1f525;&#x1f525; 1、Hotshot-XL AI文本转GIF Hotshot-XL 是一种 AI 文本转 GIF 模型&#xff0c;经过训练可与Stable Diffusion XL一起使用。能够使用任何现有或新微调的 SDXL 模型制作 GIF。 网页体验 网页http://htt…

【吊打面试官系列-MyBatis面试题】MyBatis 框架的缺点?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 框架的缺点&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 框架的缺点&#xff1f; 1、SQL 语句的编写工作量较大&#xff0c;尤其当字段多、关联表多时&#xff0c;对开发人员编写 SQL 语句的功底…

昇思25天学习打卡营第5天|数据变换Transforms

数据变换Transforms 介绍Transforms分类Common TransformsVision TransformsText TransformsPythonTokenizer LookupLambda Transforms 参考 介绍 MindSpore提供不同种类的数据变换&#xff08;Transforms&#xff09;&#xff0c;配合数据处理Pipeline来实现数据预处理。 所有…

Nest使用multer实现文件上传,并实现大文件分片上传(下)

上节我们学了在 Express 里用 multer 包处理 multipart/form-data 类型的请求中的 file。 单个、多个字段的单个、多个 file 都能轻松取出来。 接下来我们就来学习一下在Nest 里使用multer。 一,Nest如何使用multer实现文件上传 首先我们先创建一个Nest项目&#xff1a; nest…

BFS 解决拓扑排序

例题一 解法&#xff1a; 算法思路&#xff1a; 原问题可以转换成⼀个拓扑排序问题。⽤ BFS 解决拓扑排序即可。 拓扑排序流程&#xff1a; a. 将所有⼊度为 0 的点加⼊到队列中&#xff1b; b. 当队列不空的时候&#xff0c;⼀直循环&#xff1a; i. 取出队头元素&am…

Transformers 安装与基本使用

文章目录 Github文档推荐文章简介安装官方示例中文情感分析模型分词器 Tokenizer填充 Padding截断 Truncation google-t5/t5-small使用脚本进行训练Pytorch 机器翻译数据集下载数据集格式转换 Github https://github.com/huggingface/transformers 文档 https://huggingface…

上海亚商投顾:沪指震荡下跌 多只银行股创年内新高

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡调整&#xff0c;沪指尾盘跌近1%&#xff0c;深成指、创业板指均跌超1.5%。 板块概念方面&a…

六西格玛项目实战:数据驱动,手机PCM率直线下降

在当前智能手机市场日益竞争激烈的背景下&#xff0c;消费者对手机质量的要求达到了前所未有的高度。PCM&#xff08;可能指生产过程中的某种不良率或缺陷率&#xff09;作为影响手机质量的关键因素&#xff0c;直接关联到消费者满意度和品牌形象。为了应对这一挑战&#xff0c…

ICCV2023知识蒸馏相关论文速览

Paper1 Spatial Self-Distillation for Object Detection with Inaccurate Bounding Boxes 摘要原文: Object detection via inaccurate bounding box supervision has boosted a broad interest due to the expensive high-quality annotation data or the occasional inevit…

Windows CMD:快速入门

文字目录 一、概述二、常用命令2.1 切换盘符2.2 查看当前盘符下的所有文件2.3 进入单级目录2.4 返回上一级目录2.5 进入多级目录2.6 回到盘符目录2.7 清屏2.8 退出 三、练习 一、概述 CMD 是 Command的缩写&#xff0c;即命令的意思&#xff0c;它的作用是利用命令的方式来操作…

Linux-笔记 使用SCP命令传输文件报错 :IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

前言 使用scp命令向开发板传输文件发生报错&#xff0c;报错见下图; 解决 rm -rf /home/<用户名>/.ssh/known_hosts 此方法同样适用于使用ssh命令连接开发板报错的情况。 参考 https://blog.csdn.net/westsource/article/details/6636096