Flatpickr教程:使用JavaScript快速创建一个自定义日期选择器

news2024/11/16 7:49:41

部分数据来源:ChatGPT 

引言

        如果您是一个网站开发者,想为自己的网站添加方便易用的日期选择对话框,那么Flatpickr日期选择对话框可能正好符合您的需要。在这篇文章中,我们将详细介绍如何使用Flatpickr日期选择对话框,并提供一份样例代码供您参考。

Flatpickr是一个轻量级、快速、灵活的JavaScript日期选择器,具有很多功能,如时间选择器、本地化支持、多种日期格式等。Flatpickr易于集成到你的网站中,只需几行简单的代码即可实现一个高度定制化的日期选择对话框。

以下是一个基于Flatpickr实现的日期选择对话框的完整代码,供您参考:

<!--声明文档类型-->
<!DOCTYPE html>
<!--html标签-->
<html lang="en">

<head>
  <!--设置字符集-->
  <meta charset="UTF-8">
  <!--设置网页标题-->
  <title>Flatpickr日期选择对话框</title>
  <!--引入Flatpickr样式文件-->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
  <!--定义样式-->
  <style>
    /*设置body样式*/
    body {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      margin: 0;
      background-color: #f8f8f8;
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    }

    /*设置日期选择器样式*/
    .date-picker {
      position: relative;
      display: inline-block;
      cursor: pointer;
    }

    /*设置日期显示框样式*/
    #date-picker-display {
      border: 2px solid #ccc;
      border-radius: 5px;
      padding: 10px;
      font-size: 16px;
      background-color: white;
      outline: none;
      width: 300px;
    }

    /*设置日期选择器弹出框样式*/
    .date-picker-modal {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      display: flex;
      justify-content: center;
      align-items: center;
      background-color: rgba(0, 0, 0, 0.4);
      z-index: 9999;
      opacity: 0;
      pointer-events: none;
      transition: opacity 0.3s ease-in-out;
    }

    /*设置日期选择器弹出框显示样式*/
    .date-picker-modal.show {
      opacity: 1;
      pointer-events: auto;
    }

    /*设置日期选择器头部样式*/
    .date-picker-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 10px 20px;
      background-color: white;
      border-bottom: 1px solid #ccc;
    }

    /*设置取消和确认按钮样式*/
    .date-picker-cancel,
    .date-picker-confirm {
      border: none;
      outline: none;
      cursor: pointer;
      font-size: 16px;
      background-color: transparent;
      color: #007bff;
    }

    /*设置取消和确认按钮的鼠标悬停样式*/
    .date-picker-cancel:hover,
    .date-picker-confirm:hover {
      text-decoration: underline;
    }

    /*设置日期选择器标题样式*/
    .date-picker-title {
      font-size: 18px;
      font-weight: bold;
      text-transform: uppercase;
    }

    /*设置日期选择器内容样式*/
    .date-picker-content {
      display: flex;
      margin: 20px;
    }

    /*设置日期选择器列样式*/
    .date-picker-column {
      flex: 1;
      height: 200px;
      overflow-y: auto;
      border-right: 1px solid #ccc;
      padding-right: 20px;
      margin-right: 20px;
    }

    /*设置日期选择器选项样式*/
    .date-picker-option {
      display: block;
      padding: 10px;
      font-size: 16px;
      color: #333;
      cursor: pointer;
    }

    /*设置日期选择器选项鼠标悬停和激活样式*/
    .date-picker-option:hover,
    .date-picker-option-active {
      background-color: #007bff;
      color: white;
    }
  </style>
</head>
<!--设置body内容-->

<body>
  <div class="date-picker">
    <!--创建一个只读的输入框-->
    <input type="text" id="date-picker-display" readonly>
  </div>
  <!--引入Flatpickr库文件-->
  <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
  <!--编写JS代码-->
  <script>
    // 初始化Flatpickr
    flatpickr("#date-picker-display", {
      // 开启时间选择器功能
      enableTime: true,
      // 设置日期格式
      dateFormat: "Y-m-d H:i",
      // 设置默认选中日期为当前日期
      defaultDate: new Date(),
    });

    // 设置Flatpickr中文语言选项
    flatpickr.l10ns.zh = {
      weekdays: {
        shorthand: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
        longhand: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
      },
      months: {
        shorthand: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
        longhand: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
      },
      rangeSeparator: " 至 ",
      weekAbbreviation: "周",
      scrollTitle: "滚动切换",
      toggleTitle: "点击切换 12/24 小时时制"
    };

    // 使用中文语言选项初始化Flatpickr
    flatpickr("#date-picker-display", {
      enableTime: true,
      dateFormat: "Y-m-d H:i",
      defaultDate: new Date(),
      locale: "zh",
      monthSelectorType: "dropdown", // 使用下拉选择框选择月份
      shorthandCurrentMonth: true, // 使用缩写月份
      weekdays: {
        shorthand: ["日", "一", "二", "三", "四", "五", "六"],
        longhand: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
      }
    });

    // 定义年、日、时、分数组
    const years = [];
    const currentYear = new Date().getFullYear();
    for (let i = currentYear - 10; i <= currentYear + 10; i++) {
      years.push(i);
    }
    const days = [];
    for (let i = 1; i <= 31; i++) {
      days.push(i);
    }
    const hours = [];
    for (let i = 0; i <= 23; i++) {
      hours.push(i);
    }
    const minutes = [];
    for (let i = 0; i <= 59; i++) {
      minutes.push(i);
    }

    // 更新日期选择框显示内容
    function updateDatePickerDisplay() {
      const year = datePickerYearColumn.querySelector(".date-picker-option-active").textContent;
      const day = datePickerDayColumn.querySelector(".date-picker-option-active").textContent;
      const hour = datePickerHourColumn.querySelector(".date-picker-option-active").textContent;
      const selectedDate = new Date(`${year}-${monthIndex + 1}-${day} ${hour}:${minute}`);
      flatpickr("#date-picker-display", {
        enableTime: true,
        dateFormat: "Y-m-d H:i",
        defaultDate: selectedDate
      });
    }

    // 激活日期选择器的选项
    function activateDatePickerOption(element) {
      element.classList.add("date-picker-option-active");
    }

    // 取消日期选择器的选项激活
    function deactivateDatePickerOption(element) {
      element.classList.remove("date-picker-option-active");
    }

    // 滚动到日期选择器的指定选项
    function scrollToOption(element, index) {
      const options = element.querySelectorAll(".date-picker-option");
      const optionHeight = options[0].offsetHeight;
      const scrollDistance = optionHeight * (index - 2);
      element.scroll({ top: scrollDistance, behavior: "smooth" });
    }
  </script>
</body>

</html>

现在让我们来逐步分析上述代码,以便理解这个日期选择对话框是如何工作的。

第一步:引入Flatpickr样式文件

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">

第二步:创建日期选择器输入框

<div class="date-picker">
  <input type="text" id="date-picker-display" readonly>
</div>

在HTML中创建一个DIV元素,并设置其class为“date-picker”,在该元素中创建一个只读的文本输入框,id为“date-picker-display”,这将用于显示日期选择器选定的日期和时间。

第三步:引入Flatpickr库文件和JS代码

<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script>
  flatpickr("#date-picker-display", {
    enableTime: true,
    dateFormat: "Y-m-d H:i",
    defaultDate: new Date(),
  });
</script>

在HTML body标签底部,在Flatpickr样式文件之后,引入Flatpickr库文件和上面的JS代码。这段JS代码使用了Flatpickr库中的函数,将日期选择器与输入框绑定,并将日期格式设置为"Y-m-d H:i",即“年-月-日 时:分”的形式,以便用户能够选择日期和时间。

第四步:定义日期选择器样式

<style>
  /*设置body样式*/
  body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background-color: #f8f8f8;
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  }

  /*设置日期选择器样式*/
  .date-picker {
    position: relative;
    display: inline-block;
    cursor: pointer;
  }

  /*设置日期显示框样式*/
  #date-picker-display {
    border: 2px solid #ccc;
    border-radius: 5px;
    padding: 10px;
    font-size: 16px;
    background-color: white;
    outline: none;
    width: 300px;
  }

  /*其他样式...*/
</style>

这部分代码提供了日期选择器的样式定义,包括整个页面的背景色、日期显示框的边框、字体等。这些样式可以根据需要进行修改。

第五步:定义年、日、时、分数组

const years = [];
const currentYear = new Date().getFullYear();
for (let i = currentYear - 10; i <= currentYear + 10; i++) {
  years.push(i);
}
const days = [];
for (let i = 1; i <= 31; i++) {
  days.push(i);
}
const hours = [];
for (let i = 0; i <= 23; i++) {
  hours.push(i);
}
const minutes = [];
for (let i = 0; i <= 59; i++) {
  minutes.push(i);
}

这部分代码定义了四个数组,分别用于存储可选的年、日、时和分选项。在日期选择器弹出框中,我们将使用这些数组来显示可供用户选择的日期和时间选项。

第六步:更新日期选择框显示内容

function updateDatePickerDisplay() {
  const year = datePickerYearColumn.querySelector(".date-picker-option-active").textContent;
  const day = datePickerDayColumn.querySelector(".date-picker-option-active").textContent;
  const hour = datePickerHourColumn.querySelector(".date-picker-option-active").textContent;
  const selectedDate = new Date(`${year}-${monthIndex + 1}-${day} ${hour}:${minute}`);
  flatpickr("#date-picker-display", {
    enableTime: true,
    dateFormat: "Y-m-d H:i",
    defaultDate: selectedDate
  });
}

这部分代码定义一个名为“updateDatePickerDisplay()”的函数,用于更新日期选择框中显示的日期和时间。在该函数中,我们首先获取当前年、日和小时列中被激活的选项的文本内容,并使用这些值创建一个新的Date对象,以便Flatpickr可以正确显示日期和时间。最后,我们使用“flatpickr()”函数更新日期选择框的默认日期。

第七步:激活和取消日期选择器的选项

        这部分代码定义了两个函数,用于激活和取消日期选择器中的选项。当用户单击某个选项时,我们将使用这些函数将该选项标记为“active”,以便用户可以看到该选项被选择了。

function activateDatePickerOption(element) {
  element.classList.add("date-picker-option-active");
}

function deactivateDatePickerOption(element) {
  element.classList.remove("date-picker-option-active");
}

第八步:滚动到日期选择器指定选项

function scrollToOption(element, index) {
  const options = element.querySelectorAll(".date-picker-option");
  const optionHeight = options[0].offsetHeight;
  const scrollDistance = optionHeight * (index - 2);
  element.scroll({ top: scrollDistance, behavior: "smooth" });
}

这部分代码定义了一个名为“scrollToOption()”的函数,用于将日期选择器滚动到指定选项。当用户选择不同时间和日期时,我们将使用该函数使得选择框能够滚动到正确的位置,以便显示正确的选项。

运行效果

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

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

相关文章

容器集群管理工具 Docker Swarm

前言 《了解和使用Docker》中有提到容器编排工具 docker compose &#xff0c;不过只限于单机。如果现在需要搭建一个集群环境&#xff0c;提供了10台服务器用来部署应用以及其依赖的组件&#xff0c;比如5个 Tomcat 应用容器、3个Redis、5个 Mysql、3个 Nginx &#xff0c;你…

Share Creators Ada Liu 与 VNG Christopher. Liu C出席 2023 全球游戏产业峰会

夏日将至&#xff0c;第二十届中国国际数码互动娱乐展览会&#xff08;ChinaJoy&#xff09;将于 2023 年 7 月 28 日至 7 月 31 日在上海新国际博览中心隆重举办。 本届 ChinaJoy 将带来多场重磅主题高端会议&#xff0c;其中全球游戏产业峰会将于 7 月 29 日在上海浦东嘉里大…

网安大佬常用的10大工具

从事网络安全工作&#xff0c;手上自然离不开一些重要的网络安全工具。今天&#xff0c;分享10大网络安全工具。 一、Kali Linux Kali 是一个基于 Debian 的 Linux 发行版。它的目标就是为了简单&#xff1a;在一个实用的工具包里尽可能多的包含渗透和审计工具。Kali 实现了这…

互联网大厂面试必备——1685页《Java 面试突击核心手册,二十大专题,覆盖2000道 Java后端核心面试解析

前言 不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的&#xff0c;我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。 运筹帷幄之后&#xff0c;决胜千里之外!不打毫无准备的仗,我觉…

HikariCP:一个叫光的JDBC连接池

文章目录 简介数据库连接池C3P0DBCPBoneCP 精简的设计字节码优化ArrayList-->FastListConcurrentBag代理实现Statement CacheScheduler quantaCPU缓存行失效 优雅的实现获取连接初始化池对象连接池管理连接池扩充连接池缩容连接池关闭 ConcurrentBag 连接池参数总结参考 简介…

网络协议分析:网络性能的防御工具

作为网络管理员知道管理不断发展的 IT 环境需要付出巨大的努力。无论是对于小型还是大型企业&#xff0c;管理网络以使其可访问并使其性能有效都需要一套监控策略和工具。大多数 IT 管理员需要协议分析器来识别潜在的网络风险并帮助排除故障。与传统分析不同&#xff0c;协议分…

PPT中彩虹线-变色线是怎么画出来的?

​ 效果 上面用箭头指出的线框处,各位可以看到这种有多种颜色组成的渐变的就叫彩虹线 彩虹线是怎么设置的? 请看下面的操作步骤 此处,请单击选中你要变色的线,然后我们点击鼠标右键,在弹出的菜单中选择“设置形状格式" ​ 然后你会在PPT右边得到这样的一个界面…

脑机接口 | 面向步态神经电生理研究的非人灵长类模型与系统

近期&#xff0c;海南大学生物医学工程学院脑机芯片神经工程团队在Frontiers in Neuroscience期刊上发表了题为《面向步态&神经电生理研究的非人灵长类模型与系统》的学术论文。海南大学生物医学工程学院梁丰研副教授为第一作者&#xff0c;殷明教授为通讯作者。海南大学为…

2023年上半年软件设计师试题及答案解析

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 计算机中&#xff0c;系统总线用于 &#xff08;1&#xff09; 连接。 &#xff08;1&#xff09; A. 接口和外设 B. 运算器、控制器和寄存器 C. CPU、主存及…

经典面试题---【第一档】

1.如果你想new一个Quene&#xff0c;你有几种方式&#xff1f;他们之间的区别是什么&#xff1f; 2.Redis 是如何判断数据是否过期的呢&#xff1f; Redis 通过一个叫做过期字典&#xff08;可以看作是 hash 表&#xff09;来保存数据过期的时间。过期字典的键指向 Redis 数据…

R语言脚本:关于 TissueEnrich包 得到的组织特异性基因富集结果的进一步处理

1. 说明 (来自官方文档)&#xff1a; The TissueEnrich package is used to calculate enrichment of tissue-specific genes in a set of input genes. Tissue-specific genes were defined by processing RNA-Seq data from the Human Protein Atlas (HPA) (Uhln et al. 2015…

HttpServlet概述

HTTP协议包括: 请求协议:浏览器向WEB服务器发送数据的时候&#xff0c;这个发送的数据需要遵循一套标准&#xff0c;这套标准中规定了发送的数据具体格式。 相应协议:WEB服务器向浏览器发送数据的时候&#xff0c;这个发送的数据需要遵循一套标准&#xff0c;这套标准中规定了发…

【2023年首次更新】MyEclipse v2023.1支持Java 20

MyEclipse让您在开发过程中不受技术约束&#xff0c;不断创新帮您找到关键技术的解决方案您能在这里得到Java EE开发所需要的一切支持&#xff01; MyEclipse v2023.1官方正式版下载 更新日志如下&#xff1a; MyEclipse官方近期更新了2023年第一个版本——v2023.1&#xff…

Nat.Commun. : 新的硬件将扩大量子计算机的工业应用规模

光子盒研究院 由明尼苏达大学双城分校领导的一个团队开发了一种新的超导二极管——这是电子设备中的一个关键部件&#xff0c;可以帮助扩大量子计算机的工业使用规模&#xff0c;并提高人工智能系统的性能。与其他超导二极管相比&#xff0c;研究人员的装置更加节能、可以同时处…

看过才知道,这套SpringCloudAlibaba笔记,把微服务玩的出神入化!

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件&#xff0c;依托Spring Cloud Alibaba&#xff0c;只需要添加一些注解和少量配置&#xff0c;就可以将Spring Cloud 应用接入阿里微服务解决方案&#xff0c;通过阿里中…

pwn(2)-栈溢出下

32位shellcode编写 不同内核态操作通过给寄存器设置不同的值&#xff0c;在调用指令int 80h&#xff0c;就可以通知内核完成不同的功能。 只要我们通过特定的汇编代码把特定的寄存器设定为特定的值后&#xff0c;在调用int 80h执行sys_execve(“/bin/sh”,NULL,NULL)就可以获…

Python获取链家二手房源数据信息

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据解析模块 csv 内置模块 &#x1f447; &#x1f447; &#x1…

OJ#203.身高排序

题目描述 ​ 海贼小学为了强健学生的身体&#xff0c;每天课间都要组织学生在户外学做广播体操。​ 这一天&#xff0c;五年级三班的所有同学在老师的指引下将队形排成了 M行 N 列。 现已知所有同学 的身高&#xff0c;数值为整数&#xff0c;单位&#xff1a;厘米。要求在所有…

Ansible从入门到精通【五】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 专栏名称&#xff1a;Ansible从入门到精通 立志成为ansible大佬 ansible-playbook企业级实战--handler hand…

爬虫基本的编码基础知识

爬虫的编码基础知识包括以下几个方面&#xff1a; 网络请求&#xff1a;使用Python中的requests库或urllib库发送HTTP请求&#xff0c;获取网页内容。 解析网页&#xff1a;使用Python中的BeautifulSoup库或lxml库解析HTML或XML格式的网页内容&#xff0c;提取所需的数据。 数…