html弹窗

  <div class="popupForm" id="popupForm10"><div class="pop-box"><i class="iconfont icon-quxiao cancel" onclick="toggleForm(10)"></i><div class="title">选择时间</div><div class="time-box"><div class="time"><!-- <span class="active">2025-7-28</span> --><span>开始时间</span>至<span>结束时间</span></div><div class="time-list flex-sb"><!-- 年 --><div class="year"><div class="li"></div><div class="li"></div><div class="li">2025年</div><div class="li">2024年</div><div class="li">2023年</div><div class="li">2022年</div><div class="li">2021年</div><div class="li">2020年</div><div class="li"></div><div class="li"></div></div><!-- 月 --><div class="month"><div class="li"></div><div class="li"></div><div class="li">1月</div><div class="li">2月</div><div class="li">3月</div><div class="li">4月</div><div class="li">5月</div><div class="li">6月</div><div class="li">7月</div><div class="li">8月</div><div class="li">9月</div><div class="li">10月</div><div class="li">11月</div><div class="li">12月</div><div class="li"></div><div class="li"></div></div><!-- 日 --><div class="day"><div class="li"></div><div class="li"></div><div class="li">1日</div><div class="li">2日</div><div class="li">3日</div><div class="li">4日</div><div class="li">5日</div><div class="li">6日</div><div class="li">7日</div><div class="li">8日</div><div class="li">9日</div><div class="li">10日</div><div class="li">11日</div><div class="li">12日</div><div class="li">13日</div><div class="li">14日</div><div class="li">15日</div><div class="li">16日</div><div class="li">17日</div><div class="li">18日</div><div class="li">19日</div><div class="li">20日</div><div class="li">21日</div><div class="li">22日</div><div class="li">23日</div><div class="li">24日</div><div class="li">25日</div><div class="li">26日</div><div class="li">27日</div><div class="li">28日</div><div class="li">29日</div><div class="li">30日</div><div class="li"></div><div class="li"></div></div></div><div class="bottom flex-cc"><button class="reset" onclick="resetTime()">重置</button><button class="confirm" onclick="confirmTime()">确定</button></div></div></div></div>

 less样式

.popupForm {display: none;width: 100%;height: 100%;position: fixed;bottom: 0;left: 0;background-color: #57575748;.pop-box {position: absolute;bottom: 0;left: 0;height: auto;width: 100%;border-radius: 0.625rem 0.625rem 0rem 0rem;background: #ffffff;padding: 1.25rem 0;}// 取消.cancel {font-size: 0.75rem;color: #606266;position: absolute;top: 1rem;right: 1.375rem;}.title {font-size: 1rem;color: #3d3d3d;text-align: center;}// 时间选择器.time-box {padding: 0.625rem 0;.time {font-size: 1rem;color: #606266;text-align: center;span {margin: 0 1.6875rem;padding: 0.1875rem 0.625rem;border-bottom: 0.0625rem solid #d8d8d8;font-size: 0.875rem;color: #909399;}.active {color: #1890ff;}}.time-list {height: 12.5rem;margin: 1.875rem 0;position: relative;box-shadow: inset 0 0.3125rem 0.625rem #d5d5d52e,inset 0 -0.3125rem 0.625rem #d5d5d52e;&::after {content: "";position: absolute;top: 5rem;left: 0;width: 100%;height: 0.0625rem;background-color: #eaeaea;}&::before {content: "";position: absolute;bottom: 5rem;left: 0;width: 100%;height: 0.0625rem;background-color: #eaeaea;}& > div {flex: 1;text-align: center;overflow-y: auto;&::-webkit-scrollbar {width: 0;height: 0;}.li {height: 2.5rem;font-size: 0.875rem;color: #606266;padding: 0.625rem 0;}}}.bottom {gap: 2.5rem;.reset {width: 7.875rem;height: 1.6875rem;border-radius: 2.125rem;border: 0.0625rem solid #c4302c;font-size: 0.875rem;color: #c4302c;}.confirm {width: 7.875rem;height: 1.6875rem;border-radius: 2.1875rem;background: linear-gradient(180deg, #eb140f 0%, #c70504 100%);font-size: 0.875rem;color: #ffffff;}}}
}

js整体逻辑 

$(() => {// 当前年份const thisYear = new Date().getFullYear();const ITEM_HEIGHT = 40; // 每个选项高度// 滚动类型:0=开始时间,1=结束时间let type = 0;let startTime = ""; //开始时间let endTime = ""; //结束时间// 存储滚动下标const scrollValues = {startYear: 0,startMonth: 1,startDay: 1,endYear: 0,endMonth: 1,endDay: 1,};// 缓存 DOM 元素const $year = $(".time-list .year");const $month = $(".time-list .month");const $day = $(".time-list .day");const $timeSpans = $(".time-box .time span");// ========== 生成年份列表(100年)==========function renderYearList() {let html = '<div class="li"></div><div class="li"></div>';for (let i = 0; i < 100; i++) {html += `<div class="li">${thisYear - i}年</div>`;}html += '<div class="li"></div><div class="li"></div>';$year.html(html);}// ========== 生成月份列表(1~12月)==========function renderMonthList() {let html = '<div class="li"></div><div class="li"></div>';for (let i = 1; i <= 12; i++) {html += `<div class="li">${i}月</div>`;}html += '<div class="li"></div><div class="li"></div>';$month.html(html);}// ========== 获取某年某月的天数(month: 1~12)==========function getDaysInMonth(year, month) {return new Date(year, month, 0).getDate();}// ========== 更新日列表(根据当前年月动态生成)==========function updateDayList() {const yearOffset =type === 0 ? scrollValues.startYear : scrollValues.endYear;const month = type === 0 ? scrollValues.startMonth : scrollValues.endMonth;const year = thisYear - yearOffset;const days = getDaysInMonth(year, month);const dayKey = type === 0 ? "startDay" : "endDay";const currentDay = scrollValues[dayKey];// 如果当前日超出该月最大天数,修正为最后一天if (currentDay > days) {scrollValues[dayKey] = days;}// 生成日 HTMLlet html = '<div class="li"></div><div class="li"></div>';for (let i = 1; i <= days; i++) {html += `<div class="li">${i}日</div>`;}html += '<div class="li"></div><div class="li"></div>';$day.html(html);// 滚动到当前日$day.scrollTop((scrollValues[dayKey] - 1) * ITEM_HEIGHT);}// ========== 格式化为 YYYY-MM-DD 字符串 ==========function formatTime(yearOffset, month, day) {const y = thisYear - yearOffset;const m = month < 10 ? `0${month}` : month;const d = day < 10 ? `0${day}` : day;return `${y}-${m}-${d}`;}// ========== 更新显示文本 ==========function updateDisplay() {const isStart = type === 0;const prefix = isStart ? "start" : "end";const year = scrollValues[prefix + "Year"];const month = scrollValues[prefix + "Month"];const day = scrollValues[prefix + "Day"];const formatted = formatTime(year, month, day);isStart ? (startTime = formatted) : (endTime = formatted); // 更新时间$timeSpans.eq(type).addClass("active").text(formatted);}// ========== 初始化滚动事件 ==========function initWheel() {[$year, $month, $day].forEach(($container) => {let isAnimating = false;$container.on("wheel", function (e) {e.preventDefault();if (isAnimating) return;const delta = e.originalEvent.deltaY > 0 ? 1 : -1;const current = $container.scrollTop();const maxScroll = this.scrollHeight - this.clientHeight;const nextScroll = Math.max(0,Math.min(maxScroll, current + delta * ITEM_HEIGHT));isAnimating = true;$container.animate({ scrollTop: nextScroll }, 200, () => {isAnimating = false;});// 计算滚动索引const index = Math.round(nextScroll / ITEM_HEIGHT);// 更新对应值if ($container.is($year)) {scrollValues[`${type === 0 ? "start" : "end"}Year`] = index;} else if ($container.is($month)) {scrollValues[`${type === 0 ? "start" : "end"}Month`] = index + 1;} else if ($container.is($day)) {scrollValues[`${type === 0 ? "start" : "end"}Day`] = index + 1;}updateDisplay(); // 更新显示updateDayList(); // 重新生成日(月或年变化时)});});}// ========== 切换时间类型(点击“开始/结束”)==========$timeSpans.parent().on("click", "span", function () {type = $(this).index();const values = [scrollValues[`${type === 0 ? "start" : "end"}Year`],scrollValues[`${type === 0 ? "start" : "end"}Month`] - 1,scrollValues[`${type === 0 ? "start" : "end"}Day`] - 1,];$year.scrollTop(values[0] * ITEM_HEIGHT);$month.scrollTop(values[1] * ITEM_HEIGHT);$day.scrollTop(values[2] * ITEM_HEIGHT);});// ========== 初始化 ==========$(function () {renderYearList();renderMonthList();updateDayList(); // 初始生成日initWheel();// 默认显示当前日期(可选)// $timeSpans.eq(0).text(formatTime(0, 1, 1));// $timeSpans.eq(1).text(formatTime(0, 1, 1));});// ========== 确认时间 ==========window.confirmTime = function () {// 判断开始结束时间是否正确console.log(startTime, endTime);if (startTime && endTime && startTime > endTime) {// message.error("结束时间不能小于开始时间");} else if (!startTime && endTime) {// message.error("请选择开始时间");} else if (startTime && !endTime) {// message.error("请选择结束时间");} else {// 关闭弹窗 请求接口toggleForm(10);}};// ========== 重置时间 ==========window.resetTime = function () {$(".time-box .time").html("<span>开始时间</span>至<span>结束时间</span>");Object.assign(scrollValues, {startYear: 0,startMonth: 1,startDay: 1,endYear: 0,endMonth: 1,endDay: 1,});$(".time-box .time span").eq(0).click(); // 触发切换并滚动};
});

打开关闭弹窗 

function toggleForm(type) {// console.log(type);$(`#popupForm${type}`).fadeToggle(200);
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于逻辑回归、随机森林、梯度提升树、XGBoost的广告点击预测模型的研究实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景与目标二、数据概览与预处理2.1 数据导入与初步分析2.2 缺失值与重复值处理2.3 目标变量分布三、探索性数据分析&#xff08;EDA&#xff09;3.1 数值变量分布3.2 类别变量分布3…

Docker学习相关视频笔记(三)

参考视频地址&#xff1a;40分钟的Docker实战攻略&#xff0c;一期视频精通Docker。感谢作者的辛苦付出。 本文是Docker学习相关视频笔记&#xff08;一&#xff09;与Docker学习相关视频笔记&#xff08;二&#xff09;的后续 4、Docker命令 4.8 Docker 网络 4.8.1 桥接模式…

RK3568笔记九十五:基于FFmpeg和Qt实现简易视频播放器

若该文为原创文章,转载请注明原文出处。 一、开发环境 1、硬件:正点原子ATK-DLRK3568 2、QT: 5.14.2 3、系统: buildroot 二、实现功能 使用ffmpeg音视频库软解码实现视频播放器 支持打开多种本地视频文件(如mp4,mov,avi等) 视频播放支持实时开始,暂停,继续播放 采…

【LLM】Kimi-K2模型架构(MuonClip 优化器等)

note Kimi K2 的预训练阶段使用 MuonClip 优化器实现万亿参数模型的稳定高效训练&#xff0c;在人类高质量数据成为瓶颈的背景下&#xff0c;有效提高 Token 利用效率。MuonClip Optimizer优化器&#xff0c;解决随着scaling up时的不稳定性。Kimi-K2 与 DeepSeek-R1 架构对比…

Vue基础(25)_组件与Vue的内置关系(原型链)

了解组件与Vue的内置关系前&#xff0c;我们需要回顾js原型链基础知识&#xff1a;1、构造函数构造函数是一种特殊的方法&#xff0c;用于创建和初始化一个新的对象。它们是使用 new 关键字和函数调用来创建对象的。构造函数实际上只是一个普通的函数&#xff0c;通常以大写字母…

kafka中生产者的数据分发策略

在 Kafka 中&#xff0c;生产者的数据分发策略决定了消息如何分配到主题的不同分区。在 Python 中&#xff0c;我们通常使用 kafka-python 库来操作 Kafka&#xff0c;下面详细讲解其数据分发策略及实现代码。一、Kafka 生产者数据分发核心概念分区&#xff08;Partition&#…

【动态规划算法】斐波那契数列模型

一. (1137.)第N个泰波那契数(力扣)1.1动态规划的算法流程 对于初学者来讲学术上的概念晦涩难懂,将用通俗易懂的方式带来感性的理解. 1.状态表示dp表(一维或二维数组)里面的值所表示的含义 从哪获取? 1.题目要求,如本题 2.题目没有明确说明的情况下做题经验的累积 3.分析问题的…

Odoo 18 PWA 全面掌握:从架构、实现到高级定制

本文旨在对 Odoo 18 中的渐进式网络应用&#xff08;Progressive Web App, PWA&#xff09;技术进行一次全面而深入的剖析。本文的目标读者为 Odoo 技术顾问、高级开发人员及解决方案架构师&#xff0c;旨在提供一份权威的技术参考&#xff0c;以指导 PWA 相关的实施项目与战略…

Binary Classifier Optimization for Large Language Model Alignment

2025.acl-long.93.pdfhttps://aclanthology.org/2025.acl-long.93.pdf 1. 概述 在生产环境中部署大型语言模型(LLMs)时,对齐LLMs一直是一个关键因素,因为预训练的LLMs容易产生不良输出。Ouyang等人(2022)引入了基于人类反馈的强化学习(RLHF),该方法涉及基于单个提示的…

在CentOS上以源码编译的方式安装PostgreSQL

下载目录&#xff1a;PostgreSQL: File Browser&#xff0c;我使用的PostgreSQLv17.5。Linux系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 安装依赖包和工具链&#xff08;必须且重要&#xff01;&#xff09; yum groupinstall "Development Tools" -y yu…

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现沙滩小人检测识别(C#代码UI界面版)

Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现沙滩小人检测识别&#xff08;C#代码UI界面版&#xff09;工业相机使用YoloV8模型实现沙滩小人检测识别工业相机通过YoloV8模型实现沙滩小人检测识别的技术背景在相机SDK中获取图像转换图像的代码分析工业相机图像转换…

Ubuntu服务器安装与运维手册——操作纯享版

本手册汇总了从硬件预配置、Ubuntu 安装、网络与服务配置&#xff0c;到 Windows/macOS 访问共享、MySQL 初始化的完整流程&#xff0c;便于今后运维参考。 目录 环境与硬件概览BIOS/UEFI 设置制作与启动安装介质Ubuntu 24.04 LTS 安装流程静态 IP 配置&#xff08;netplan&am…

【Nginx】Nginx进阶指南:解锁代理与负载均衡的多样玩法

在Web服务的世界里&#xff0c;Nginx就像是一位多面手&#xff0c;它不仅能作为高性能的Web服务器&#xff0c;还能轻松胜任代理服务器、负载均衡器等多种角色。今天&#xff0c;我们就来深入探索Nginx的几个常见应用场景&#xff0c;通过实际案例和关键配置解析&#xff0c;带…

原创-锐能微82xx系列电能计量芯片软件驱动开发与精度校准流程完全指南

引言 电能计量芯片的软件驱动开发是整个计量系统的核心&#xff0c;它直接决定了计量精度、系统稳定性和功能完整性。锐能微82xx系列电能计量芯片凭借其强大的数字信号处理能力和丰富的功能特性&#xff0c;为开发者提供了灵活的软件开发平台。本文将详细介绍82xx系列芯片的软…

如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端

这份文档是关于 如何使用 Apache Ignite 作为 Spring 框架的缓存&#xff08;Spring Cache&#xff09;后端&#xff0c;实现方法级别的缓存功能。 这和前面我们讲的 Spring Data Ignite 是两个不同的概念。我们先明确区别&#xff0c;再深入理解。&#x1f501; 一、核心区别…

Android 超大图片、长图分割加载

在Android开发中&#xff0c;处理大图片的加载是一个常见且重要的问题&#xff0c;尤其是在需要显示高分辨率图片时。大图片如果不正确处理&#xff0c;可能会导致内存溢出或应用性能下降。下面是一些常用的策略和技术来优化大图片的加载&#xff1a;1. 使用图片压缩库a. Glide…

Linux:理解操作系统

文章目录数据流动操作系统数据流动 软件运行&#xff0c;必须先加载到内存&#xff0c;本质要把磁盘上的文件 加载到内存。 我们写的算法是处理存储器里面的数据&#xff0c;数据就是文件&#xff0c;我们自己写的可执行文件。 图中QQ就是软件&#xff0c;加载内存后进行下一步…

【每日一错】PostgreSQL的WAL默认段大小

文章目录题目扩展学习WAL工作原理流程图题目 扩展学习 WAL&#xff08;Write Ahead Log&#xff09;预写日志&#xff1a; WAL是PostgreSQL先写日志、后写数据的机制&#xff0c;用来防止数据丢失、提升数据恢复能力。 流程&#xff1a; 事务先写日志文件&#xff08;WAL&…

Visual Studio Code 使用指南 (2025年版)

Visual Studio Code (VS Code) 是一款由微软开发的免费、开源、跨平台的现代化轻量级代码编辑器&#xff0c;凭借其强大的核心功能、丰富的扩展生态系统以及高度可定制性&#xff0c;已成为全球数百万开发者的首选工具。本指南旨在帮助您快速上手 VS Code&#xff0c;掌握其核心…

【Java】JVM虚拟机(java内存模型、GC垃圾回收)

一、Java内存模型&#xff08;JMM&#xff09;JMM&#xff08;Java Memory Model&#xff0c;Java 内存模型&#xff09;是 Java 虚拟机规范中定义的一种抽象概念&#xff0c;用于规范 Java 程序中多线程对共享内存的访问规则&#xff0c;解决可见性、原子性和有序性问题&#…