基于 Layui 的分步表单(Step Form)高度自适应与状态持久化解决方案
在前端开发中使用 Layui 的carousel轮播图扩展分步表单时经常会遇到以下三大痛点隐藏步骤不显示/高度塌陷切换到 Step 3 或后续步骤时因 DOM 处于隐藏状态导致高度计算为0内容无法正常显示。性能警告Forced reflow频繁手动获取scrollHeight并设置 CSSheight触发浏览器的强制重排。刷新后状态丢失页面刷新后默认重置到第一步用户体验不佳。本文提供一套完整的重构方案采用原生ResizeObserver实现无感高度自适应并结合localStorage与URL参数实现无缝状态刷新。1、预览图首先导入扩展 js和css 文件可以直接引用官网里面的js或者本地资源位置【免费】step步骤表单分步表单测试测试测试资源-CSDN文库一、 CSS 样式修复/* 覆盖 Layui Carousel 的固定高度限制 */ #stepForm, #stepForm [carousel-item], #stepForm [carousel-item] div { height: auto !important; min-height: 380px; /* 设置底线防塌陷 */ } /* 控制步骤内容的显隐彻底解决切到 Step 3 内容不显示的问题 */ #stepForm [carousel-item] div { display: none; } #stepForm [carousel-item] div.layui-this { display: block !important; }二、 步骤扩展组件优化 (step.js)重构step.js增加精准跳转接口goStep()并处理好头部 DOM 的响应式同步。layui.define([layer, carousel], function (exports) { var $ layui.jquery; var carousel layui.carousel; // 渲染头部步骤条 DOM var renderDom function (elem, stepItems, postion) { $(elem).find(.lay-step).remove(); var stepDiv div classlay-step; for (var i 0; i stepItems.length; i) { stepDiv div classstep-item; // 步骤连接线 if (i (stepItems.length - 1)) { var lineClass i postion ? step-item-tail-done : ; stepDiv div classstep-item-taili class lineClass /i/div; } // 节点数字与状态图标 var number stepItems[i].number || (i 1); if (i postion) { stepDiv div classstep-item-head step-item-head-activei classlayui-icon number /i/div; } else if (i postion) { stepDiv div classstep-item-head step-item-head-donei classlayui-icon layui-icon-ok/i/div; } else { stepDiv div classstep-item-headi classlayui-icon number /i/div; } // 标题和描述 var title stepItems[i].title || ; var desc stepItems[i].desc || ; if (title || desc) { stepDiv div classstep-item-main; if (title) stepDiv div classstep-item-main-title title /div; if (desc) stepDiv div classstep-item-main-desc desc /div; stepDiv /div; } stepDiv /div; } stepDiv /div; $(elem).prepend(stepDiv); var bfb 100 / stepItems.length; $(.step-item).css(width, bfb %); }; var step { render: function (param) { param.indicator none; param.arrow none; param.autoplay false; var stepItems param.stepItems; var elem param.elem; // 渲染 Carousel carousel.render(param); // 渲染头部 var initStep param.step || 0; renderDom(elem, stepItems, initStep); if (param.stepWidth) { $(elem).find(.lay-step).css(width, param.stepWidth); } // 监听轮播图切换事件 carousel.on(change( param.filter ), function (obj) { renderDom(elem, stepItems, obj.index); if (param.stepWidth) { $(elem).find(.lay-step).css(width, param.stepWidth); } if (typeof param.stepChange function) { param.stepChange(obj.index); } }); // 隐藏默认按钮并去掉背景 $(elem).find(.layui-carousel-arrow).css(display, none); $(elem).css(background-color, transparent); }, // 跳转指定步骤 goStep: function (elem, index) { var $elem $(elem); var items $elem.find([carousel-item] div); if (index 0 || index items.length) return; items.removeClass(layui-this).eq(index).addClass(layui-this); $elem.find(.layui-carousel-ind li).eq(index).trigger(click); }, next: function (elem) { var currentIndex $(elem).find([carousel-item] div.layui-this).index(); this.goStep(elem, currentIndex 1); }, pre: function (elem) { var currentIndex $(elem).find([carousel-item] div.layui-this).index(); this.goStep(elem, currentIndex - 1); } }; exports(step, step); });三、 主页面逻辑实现在主页面中利用ResizeObserver代替手动的 DOM 高度计算逻辑无需在展开/收缩等事件里重复手动调用调整高度的方法。script layui.config({ base: ./step-lay/ }).use([form, step, jquery], function () { var $ layui.jquery, form layui.form, step layui.step; // 1. 读取步骤优先 URL 参数其次 LocalStorage var urlParams new URLSearchParams(window.location.search); var savedStep parseInt(localStorage.getItem(currentStepIndex)) || 0; var currentStep parseInt(urlParams.get(step)) || savedStep; // 2. 初始化分步表单 step.render({ elem: #stepForm, filter: stepForm, width: 100%, stepWidth: 92%, stepItems: [ { title: 阅读须知 }, { title: 填写信息 }, { title: 上传材料 }, { title: 结果领取 }, { title: 申请成功 } ], step: currentStep, stepChange: function (index) { // 同步保存到 LocalStorage 并更新 URL 参数 localStorage.setItem(currentStepIndex, index); var url new URL(window.location.href); url.searchParams.set(step, index); window.history.replaceState({}, , url.toString()); // 触发容器高度自适应更新 updateContainerHeight(); } }); // 初始跳至对应步骤 if (currentStep 0) { step.goStep(#stepForm, currentStep); } // 3. 表单事件绑定 form.on(submit(formStep), function () { step.next(#stepForm); return false; }); $(.pre).click(function () { step.pre(#stepForm); }); // 4. 高度实时自适应机制 function updateContainerHeight() { var $activeItem $(#stepForm [carousel-item] div.layui-this); if ($activeItem.length 0) { var activeHeight $activeItem.outerHeight(true); $(#stepForm, #stepForm [carousel-item]).css(height, activeHeight px); } } // 利用 ResizeObserver 自动感知页面内容高度变动折叠、展开、异步渲染等 if (ResizeObserver in window) { var observer new ResizeObserver(function () { updateContainerHeight(); }); $(#stepForm [carousel-item] div).each(function () { observer.observe(this); }); } else { // 兜底方案 setInterval(updateContainerHeight, 300); } }); // 内容展开/收缩控制函数ResizeObserver 会自动响应尺寸变化无需手动计算高度 function toggleContent(divId, toggleImage) { var contentDiv document.getElementById(divId); if (contentDiv.style.display none) { contentDiv.style.display block; toggleImage.src ../image/收缩.png; } else { contentDiv.style.display none; toggleImage.src ../image/展开.png; } } /script

相关新闻

php反序列化学习 pop链构造

php反序列化学习 pop链构造

php反序列化之pop链的构造 想复习一下之前学习的构造pop链&#xff0c;于是我自己摘抄了一个题目&#xff1a;UnserializeOne的源码, 来复习一下这个知识点 题目源码&#xff1a; <?phperror_reporting(0); highlight_file(__FILE__);#Something useful for you : https://…

2026/8/20 22:03:13 阅读更多 →
CVE-2026-64531 OVSwrap本地提权实战:全版本排查、漏洞原理与永久加固清单

CVE-2026-64531 OVSwrap本地提权实战:全版本排查、漏洞原理与永久加固清单

0. 前置风险判定&#xff08;3秒快速认知&#xff09; CVE-2026-64531&#xff08;OVSwrap&#xff09;是2026年公开的高危Linux内核本地提权漏洞&#xff0c;漏洞潜伏长达13年&#xff0c;2025年内核代码迭代后被正式触发。普通本地低权限用户、容器低权限账号&#xff0c;无需…

2026/8/22 0:03:53 阅读更多 →
终极Prettymaps安装指南:快速本地部署与Google Colab环境配置

终极Prettymaps安装指南:快速本地部署与Google Colab环境配置

终极Prettymaps安装指南&#xff1a;快速本地部署与Google Colab环境配置 【免费下载链接】prettymaps Draw pretty maps from OpenStreetMap data! Built with osmnx matplotlib shapely 项目地址: https://gitcode.com/GitHub_Trending/pr/prettymaps 想要用Python轻…

2026/8/20 22:02:13 阅读更多 →

最新新闻

Cherry MX 键帽 3D 模型:用 36 个免费 STL 从零补出缺失键帽的完整指南

Cherry MX 键帽 3D 模型:用 36 个免费 STL 从零补出缺失键帽的完整指南

Cherry MX 键帽 3D 模型&#xff1a;用 36 个免费 STL 从零补出缺失键帽的完整指南 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 一颗键帽磨穿&#xff0c;整个键盘"残废&qu…

2026/8/22 0:04:13 阅读更多 →
杰理之MP3格式提示音播放断续卡顿杂音【篇】

杰理之MP3格式提示音播放断续卡顿杂音【篇】

替换lib_mp3_dec.a后rebuild

2026/8/22 0:04:13 阅读更多 →
杰理之发射器主动发起通话【篇】

杰理之发射器主动发起通话【篇】

user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_LAST_NO, 0, NULL)

2026/8/22 0:04:13 阅读更多 →
5 分钟上手 VideoDownloadHelper:把网页视频存到本地的完整教程

5 分钟上手 VideoDownloadHelper:把网页视频存到本地的完整教程

5 分钟上手 VideoDownloadHelper&#xff1a;把网页视频存到本地的完整教程 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper VideoDownloadHel…

2026/8/22 0:03:12 阅读更多 →
webdav:5分钟跑通的单二进制WebDAV文件服务器

webdav:5分钟跑通的单二进制WebDAV文件服务器

webdav&#xff1a;5分钟跑通的单二进制WebDAV文件服务器 【免费下载链接】webdav A simple and standalone WebDAV server. 项目地址: https://gitcode.com/gh_mirrors/we/webdav webdav 是一个用 Go 写的轻量级 WebDAV 服务器&#xff1a;单二进制、单 YAML 配置&…

2026/8/22 0:03:12 阅读更多 →
ChineseOCR_Lite:4.7MB 模型跑通中文文字识别,竖排也能认

ChineseOCR_Lite:4.7MB 模型跑通中文文字识别,竖排也能认

ChineseOCR_Lite&#xff1a;4.7MB 模型跑通中文文字识别&#xff0c;竖排也能认 【免费下载链接】chineseocr_lite 超轻量级中文ocr&#xff0c;支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) crnn(2.5M) anglenet(378KB)) 总模型仅4.7M 项目地址: https://gi…

2026/8/22 0:03:12 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域&#xff0c;PCB&#xff08;印制电路板&#xff09;的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡&#xff0c;如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目&#xff0c;选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具&#xff0c;而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说&#xff0c;电路分析是专业课的重中之重&#xff0c;也是拉开分差的关键。进入8月&#xff0c;复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好&#xff0c;我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时&#xff0c;你是否也遇到过这样的困扰&#xff1a;生成的代码功能上没问题&#xff0c;但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →