大牛练成记:用JavaScript徒手写出一个日期选择插件

news2024/11/17 9:49:40

在这里插入图片描述

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。
🏆本文已收录于专栏:100个JavaScript的小应用。
🎉欢迎 👍点赞✍评论⭐收藏

文章目录

  • 🚀一、写作思路介绍
  • 🚀二、准备工作
    • 🔎2.1 写一个入口页面
    • 🔎2.2 设计基本的插件样式
    • 🔎2.3 实现日期选择插件
    • 🔎2.4 美化日期选择插件
  • 🚀三、总结


🚀一、写作思路介绍

在现代Web应用程序中,日期选择器是一个非常常见的组件,用户可以使用它来选择特定的日期。在本篇文章中,我们将使用JavaScript和HTML来创建一个简单但功能强大的日期选择插件。这个日期选择插件是比较考验Js基本功的

该插件将具有以下功能:

  1. 点击输入框时,将显示日期选择器。
  2. 日期选择器上方有一个年份和月份选择器,可以向左或向右切换。
  3. 日期选择器下方是一个日期网格,用户可以通过点击来选择日期。
  4. 当用户选择一个日期后,插件将自动将选定的日期填充到输入框中。

🚀二、准备工作

🔎2.1 写一个入口页面

在开始之前,我们需要准备一些基本的 HTML 和 CSS 结构(date-picker.html)。

HTML 结构如下:

<!DOCTYPE html>
<html>
<head>
    <title>日期选择插件</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <input type="text" id="date-input" placeholder="选择日期">
    </div>

    <script src="script.js"></script>
</body>
</html>

🔎2.2 设计基本的插件样式

CSS 样式如下(style.css):

.container {
    background-color: #FDF5E6;
    padding: 10px;
    width: 200px;
    border-radius: 5px;
}

#date-input {
    width: 100%;
    height: 30px;
    padding: 5px;
    font-size: 16px;
    border: none;
}

大概出来的效果图如下:
在这里插入图片描述

🔎2.3 实现日期选择插件

首先,我们需要监听输入框的点击事件,当用户点击输入框时,展示日期选择插件。

在 JavaScript 文件中添加以下代码:

document.getElementById("date-input").addEventListener("click", function() {
    showDatePicker();
});

function showDatePicker() {
    // 创建日期选择插件的容器
    var datePickerContainer = document.createElement("div");
    datePickerContainer.className = "date-picker";

    // 获取当前日期
    var currentDate = new Date();

    // 获取当前年份和月份
    var currentYear = currentDate.getFullYear();
    var currentMonth = currentDate.getMonth();

    // 创建日历表格
    var calendarTable = createCalendarTable(currentYear, currentMonth);

    // 将日历表格添加到日期选择插件的容器中
    datePickerContainer.appendChild(calendarTable);

    // 将日期选择插件的容器添加到文档中
    document.body.appendChild(datePickerContainer);
}

function createCalendarTable(year, month) {
    // 创建日历表格
    var table = document.createElement("table");

    // 创建表头
    var thead = document.createElement("thead");
    var tr = document.createElement("tr");
    var daysOfWeek = ["日", "一", "二", "三", "四", "五", "六"];
    for (var i = 0; i < daysOfWeek.length; i++) {
        var th = document.createElement("th");
        th.textContent = daysOfWeek[i];
        tr.appendChild(th);
    }
    thead.appendChild(tr);
    table.appendChild(thead);

    // 创建表格主体
    var tbody = document.createElement("tbody");
    var startDate = new Date(year, month, 1); // 当月第一天
    var endDate = new Date(year, month + 1, 0); // 当月最后一天
    var currentDate = new Date(year, month, 1); // 当前日期,默认为当月第一天
    while (currentDate <= endDate) {
        tr = document.createElement("tr");
        for (i = 0; i < 7; i++) {
            var td = document.createElement("td");
            if (currentDate.getMonth() === month) {
                td.textContent = currentDate.getDate();
                td.addEventListener("click", selectDate);
                td.className = "date";
            } else {
                td.textContent = "";
                td.className = "disabled";
            }
            if (currentDate.toDateString() === new Date().toDateString()) {
                td.className += " current-day";
            }
            tr.appendChild(td);
            
            currentDate.setDate(currentDate.getDate() + 1);
        }
        tbody.appendChild(tr);
    }
    table.appendChild(tbody);

    return table;
}

function selectDate(event) {
    var selectedDate = new Date(year, month, event.target.textContent);
    var dateString = selectedDate.getFullYear() + "-" + (selectedDate.getMonth() + 1) + "-" + selectedDate.getDate();
    document.getElementById("date-input").value = dateString;

    // 移除日期选择插件的容器
    var datePickerContainer = document.querySelector(".date-picker");
    datePickerContainer.parentNode.removeChild(datePickerContainer);
}

在以上代码中,我们使用 showDatePicker 函数来创建日期选择插件的容器,并将其添加到文档中。

createCalendarTable 函数创建了一个日历表格,并根据给定的年份和月份生成了相应的日期。

selectDate 函数用于选择日期并将其写入输入框,然后移除日期选择插件的容器。

🔎2.4 美化日期选择插件

为了美化日期选择插件,我们使用了自定义的 CSS 样式。

首先,我们将整体边框背景搭配调的比较舒服一点,在style.css里面追加下面的内容:

.date-picker {
    position: absolute;
    background-color: #FFF;
    border: 1px solid #DDD;
    padding: 10px;
    z-index: 999;
}

.current-day {
    background-color: #CCC;
}

.date-picker td {
    text-align: center;
    width: 30px;
    height: 30px;
    cursor: pointer;
}

.date-picker td:hover {
    background-color: #EEE;
}

.date-picker td:not(.disabled):hover {
    background-color: #DDD;
}

.disabled {
    color: #AAA;
    cursor: not-allowed;
}

.container {
    background-color: #FDF5E6;
}

然后,我们使用灰色作为选中日期的背景色,并使用黑色作为日期字样的颜色:

.current-day {
    background-color: #CCC;
}

.date-picker td {
    color: #000;
}

其他常规样式的配置可以根据需要进行调整,比如边框样式、鼠标悬停效果等,我们来看一下最终大概的效果。
在这里插入图片描述

🚀三、总结

在本文中,我们介绍了如何使用 JavaScript 和 HTML 来创建一个简单的日期选择插件,并对其进行了美化。通过监听输入框的点击事件,在用户点击输入框时展示日期选择插件,并通过点击日期来选择日期并将其写入输入框。最后,我们使用 CSS 样式来美化日期选择插件,使其更加美观。这个日期选择插件可以方便地应用于网页中,提供良好的用户体验。

以上就是关于如何使用 JavaScript 和 HTML 实现一个日期选择插件的介绍。不过关于这个插件还是可以继续丰富,比如支持选择年份和月份等,有想法的大佬可以持续补充。希望本文对你有所帮助!

完整代码在文章开头可以下载,有需要可以前往下载。

在这里插入图片描述
后面将会分享更多的实战经验,我们下次见。

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

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

相关文章

OpenMMLab MMDetectionV3.1.0-SAM(环境安装、模型测试、训练以及模型后处理工具)

OpenMMLab Playground 概况 当前通用目标检测的研究方向正在朝着大型多模态模型发展。除了图像输入之外&#xff0c;最近的研究成果还结合了文本模式来提高性能。添加文本模态后&#xff0c;通用检测算法的一些非常好的属性开始出现&#xff0c;例如&#xff1a; 可以利用大量…

【多线程系列-04】深入理解java中线程间的通信机制

多线程系列整体栏目 内容链接地址【一】深入理解进程、线程和CPU之间的关系https://blog.csdn.net/zhenghuishengq/article/details/131714191【二】java创建线程的方式到底有几种&#xff1f;(详解)https://blog.csdn.net/zhenghuishengq/article/details/127968166【三】深入…

如何通过 5 步激活策略扩大用户群

假设&#xff0c;你现在是一个“深藏功与名”的增长黑客。前期你表现非常好&#xff0c;做了一些拉新实验&#xff0c;每天都有上千用户进入到产品。团队成员和家人朋友都非常开心你们的产品增长终于有了起色。 然而&#xff0c;如果你不重视拉新&#xff08;acquisition&…

TI的IWR6843跑3D People Tracking(3D人体检测追踪实验)demo的上手教程

1.硬件准备 1.IWR6843板子 2.两个USB转串口模块&#xff08;因为我的是自己做的板子&#xff0c;板子上没有集成USB转串口芯片&#xff09; 2.软件准备 1.最新版本的CCS&#xff0c;注意后缀没有THEIA https://www.ti.com/tool/CCSTUDIO?DCMPdsp_ccs_v4&HQSccs 2.最新…

速通pytorch库

速通pytorch库&#xff08;长文&#xff09; 前言 ​ 本篇文章主要为那些对于pytorch库不熟悉、还没有上手的朋友们准备&#xff0c;梳理pytorch库的主要内容&#xff0c;帮助大家入门深度学习最重要的库之一。 目录结构 文章目录 速通pytorch库&#xff08;长文&#xff09;1.…

13 springboot项目——准备数据和dao类

13.1 静态资源下载 https://download.csdn.net/download/no996yes885/88151513 13.2 静态资源位置 css样式文件放在static的css目录下&#xff1b;static的img下放图片&#xff1b;template目录下放其余的html文件。 13.3 创建两个实体类 导入依赖&#xff1a;lombok <!…

35岁后的测试工程师出路?测试工程师能干多久?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 你有没有一刹那意…

服务器硬件、部署LNMP动态网站、部署wordpress、配置web与数据库服务分离、配置额外的web服务器

day01 day01项目实战目标单机安装基于LNMP结构的WordPress网站基本环境准备配置nginx配置数据库服务部署wordpressweb与数据库服务分离准备数据库服务器迁移数据库配置额外的web服务器 项目实战目标 主机名IP地址client01192.168.88.10/24web1192.168.88.11/24web2192.168.88…

产业大数据应用:精准剖析区域产业,摸家底 明方向 促发展

随着信息技术的飞速发展&#xff0c;大数据和新一代信息技术的崛起&#xff0c;这些技术的应用正在逐渐渗透到各个领域&#xff0c;在区域产业发展上&#xff0c;他们不仅为区域产业诊断分析带来了高效的工具&#xff0c;更为区域制定产业发展战略和政策提供了有效的数据支撑。…

活动预告 | 中国数据库联盟(ACDU)中国行第二站定档杭州,邀您探讨数据库技术与实践!

数据库技术一直是信息时代中不可或缺的核心组成部分&#xff0c;随着信息量的爆炸式增长和数据的多样化&#xff0c;其重要性愈发凸显。作为中国数据库联盟&#xff08;ACDU&#xff09;的品牌活动之一&#xff0c;【ACDU 中国行】在线下汇集数据库领域的行业知名人士&#xff…

Keil出现Flash Timeout.Reset the Target and try it again.我有一种解决方法

2.解决方法 网上查找了找原因&#xff0c;是因为之前代码设置了读保护功能。 读保护即大家通常说的“加密”&#xff0c;是作用于整个Flash存储区域。一旦设置了Flash的读保护&#xff0c;内置的Flash存储区只能通过程序的正常执行才能读出&#xff0c;而不能通过下述任何一种…

echarts绘制关系图

效果图&#xff1a; 代码&#xff1a; <template><div id"serveGraph" style"height: 100%; width: 100%; z-index: 88;"></div> </template> <script> import { defineComponent,reactive,toRefs,onMounted,watch } from …

网络工程师 快速入门

需要掌握 以下技术 1.网络 基础 知识 TCP/IP 、OSI 7层协议、IP地址、ARP地址解析协议、ICMP&#xff08;英特网控制报文协议&#xff0c;ping&#xff09;等 入门面试常问问题。 2.路由 路由匹配 三原则、静态路由、OSPF路由协议。 2.交换 如何放数据&#xff1f; VLAN TRU…

【Spring】bean的生命周期

1.具体的生命周期过程 bean对象创建&#xff08;调用无参构造器&#xff09; 给bean对象设置属性 bean对象初始化之前操作&#xff08;由bean的后置处理器负责&#xff09; bean对象初始化&#xff08;需在配置bean时指定初始化方法&#xff09; bean对象初始化之后操作&am…

C# Blazor 学习笔记(0.1):如何开始Blazor和vs基本设置

文章目录 前言资源推荐环境如何开始Blazor个人推荐设置注释快捷键热重载设置 前言 Blazor简单来说就是微软提供的.NET 前端框架。使用 WebAssembly的“云浏览器”&#xff0c;集成了Vue,React,Angular等知名前端框架的特点。 资源推荐 微软官方文档 Blazor入门基础视频合集 …

Arcgis地图实战一:单个图层中设施的隐藏及显示

文章目录 1.效果图预览2.弹框的实现3.显示及隐藏的实现 1.效果图预览 2.弹框的实现 let alert this.alertCtrl.create();alert.setTitle(请选择设施);for (let item of this.ctralllayers) {alert.addInput({type: checkbox,label: item.name,value: item.id,checked: item.vi…

音量压低处理流程

开始 通过申请临时DUCK焦点可以压低其他在播放的音源&#xff0c;如源码中的注释&#xff0c;不会暂停其他在播放的音源&#xff0c;而是降低输出&#xff0c;在车载情景下&#xff0c;一般在地图导航或者语音播报的情景下会申请这个焦点。 // AudioManager.java /*** Used t…

Netty自定义消息协议的实现逻辑处理粘包拆包、心跳机制

Netty 自定义消息协议的实现逻辑自定义编码器 心跳机制实现客户端发送心跳包 自定义消息协议的实现逻辑 消息协议&#xff1a;这一次消息需要包含两个部分&#xff0c;即消息长度和消息内容本身。 自定义消息编码器︰消息编码器将客户端发送的消息转换成遵守消息协议的消息&…

Andorid解析XML格式数据遇到的坑

以下是《第一行代码 第三版》解析XML格式数据部分遇到的坑 一、首先是安装Apache遇到的坑 具体参考文章Apache服务器下载安装及使用&#xff08;更新&#xff09;_apache下载_★邱↓邱★的博客-CSDN博客&#xff08;可以不看文中的安装部分了&#xff09; 启动服务那块儿建议…

Java:Map的getOrDefault()方法结果仍为null

1、问题 今天在工作中遇到一个问题&#xff0c;在一个通用的数据处理方法中&#xff0c;方法会从一个Map类型参数通过key里获取对象value&#xff0c;但方法的调用者并不都会传递value实例&#xff0c;若没有获取到value则需要初始化一个&#xff0c;处理方式是调用了Map的getO…