十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Layui layer 弹层实战:layer.open 配置、关闭方法与高频坑点速查

Layui layer 弹层实战:layer.open 配置、关闭方法与高频坑点速查 Layui layer 弹层实战layer.open 配置、关闭方法与高频坑点速查【免费下载链接】layui一套遵循浏览器原生态开发模式的 Web UI 组件库。项目地址: https://gitcode.com/GitHub_Trending/la/layui页面弹层一多就开始打架遮罩叠了三四层、关掉一个弹层把别的也带走了、loading 转完圈却忘了关。这些问题的根源通常是没吃透 layer 的 index 机制和几种内置类型。layer 是 layui 内置的通用弹出层组件原生 JavaScript 实现、不依赖 jQueryalert/confirm/msg/load/tips 这些快捷方法覆盖了绝大多数弹窗场景下面按先跑通、再套场景、最后排坑的顺序讲。一、能力速览能力点一句话说明典型适用场景五种原生类型type 0~4 对应 dialog / page / iframe / loading / tips一套 API 全覆盖提示框、弹窗页面、内嵌页面、等待转圈、元素旁气泡快捷方法alert / confirm / msg / load / tips / prompt 开箱即用确认删除、操作结果反馈、口令输入index 管理每次 open 返回唯一 indexclose/closeLast/closeAll 精确控制异步请求中关闭指定 loading动画与方位anim 数字或 slide 方向、offset 九宫格定位底部抽屉、从右侧滑入的面板主题覆写skin 传入任意 class叠加自定义样式即可换肤品牌色弹窗、特殊业务皮肤五种类型在源码里写得很直白type: [dialog, page, iframe, loading, tips]type 数字就是数组下标记不住就翻 源码 开头这几行。二、三步跑通第一个 layer第一步引入 layui一个 html 文件引入样式和脚本即可layer 随主包加载无需单独引 layer.js。这段代码只做资源引入!doctype html html head meta charsetutf-8 / titlelayer 弹层入门/title link relstylesheet hreflayui.css / /head body button idbtn弹出提示/button script srclayui.js/script第二步弹出第一个 msglayer.msg 是最常用的轻提示默认 3 秒自动消失、无遮罩适合操作成功这类反馈。下面这行就是官方演示页里的第一句代码layui.use(() { var layer layui.layer; document.getElementById(btn).onclick function () { // 返回 index需要手动关闭时用它 var index layer.msg(保存成功); }; });第三步带按钮的 confirm 与手动关闭confirm 弹确认框点击确定才会执行回调回调里用 index 关掉弹层这就是 layer 最核心的开-关闭环。layer.confirm(确定要删除这条数据吗, function (index) { // 确定回调先干正事再关弹层 layer.close(index); // 注释忘记 close弹层会一直挂着 }); // 自定义页面层type 1 area 定宽高yes 是确定按钮回调 var idx layer.open({ type: 1, title: 编辑信息, area: [420px, auto], content: div stylepadding:20px这里放你的表单/div, btn: [保存, 取消], yes: function (i) { layer.close(i); }, });跑通后你应该看到点按钮出现一条居中的小提示两秒左右自动淡出confirm 弹出一个带确定/取消的对话框点确定后弹层关闭、遮罩消失。三、场景驱动的配置技巧登录页忘记密码弹窗痛点确认框只能显示文本要用户输入一次验证码就得自己拼输入框。layer.prompt 是内置的输入型弹层formType 1 是密码框不用手写 input。// 弹出口令输入框formType: 1 渲染为密码输入 layer.prompt({ title: 重置密码请输入当前密码, formType: 1 }, (pass, index) { fetch(/api/reset, { method: POST, body: JSON.stringify({ pwd: pass }), }).then(() { layer.close(index); // 注释无论成败都要关失败再弹 msg layer.msg(重置成功, { icon: 1 }); }); });formType0 文本 / 1 密码 / 2 多行文本决定输入框形态回调第二个参数就是index关闭时直接用它弹窗样式想统一可以传**title**或外层skin覆写异步请求的 loading 遮罩痛点请求耗时两秒以上页面无反馈用户会连点三次。layer.load 弹转圈层关键点是用它返回的 index 精确关闭而不是 closeAll。var loadIndex layer.load(1, { shade: [0.1, #fff], // 注释浅色遮罩用户还能看到页面 }); fetch(/api/list) .then(r r.json()) .then(data { layer.close(loadIndex); // 注释必须用 open 时拿到的 index layer.msg(已加载 data.length 条); });load(icon, options)icon 0/1 是两种转圈2 是风格 2shade传数组[透明度, 背景色]可自定义遮罩回调里忘了 close 是最常见事故可加.catch兜底关闭商品列表的图片查看器痛点缩略图列表点一张要能放大、左右切换自己写全屏预览很费劲。layer.photos 直接吃一个列表选择器自动接管查看器。ul idgoods liimg srca.jpg alt商品1 //li liimg srcb.jpg alt商品2 //li /ullayer.photos({ photos: #goods, // 注释选择器直接指向缩略图容器src 自动取 img hideFooter: true, // 隐藏底部操作栏界面更干净 });photos可以传选择器也可以传{ data: [...] }对象两种都认点击缩略图即全屏预览hideFooter控制底部栏显隐四、高频坑点与调优坑一closeAll 一关关所有你大概率遇到过关了 loading 之后本来还开着的业务弹层也被带走了。原因是closeAll()不带参数会清掉全部类型而 loading 和页面层经常同时存在。// 错误写法连业务弹层一起关了 layer.closeAll(); // 正确只清 loading 类型其他弹层不受影响 layer.closeAll(loading);坑二异步里忘传 index弹层挂死你大概率遇到过转圈转到页面刷新还没停。原因是回调闭包里忘了 index或用了layer.close()这种不存在的调用。var loadIndex layer.load(); ajax(/api/save, { success: () layer.close(loadIndex), error: () layer.close(loadIndex), // 注释失败分支同样要关 });坑三同 id 重复 open 不会返回 index你大概率遇到过想用 id 防重复弹出结果第二次点击拿不到 index后续 close 失败。源码逻辑是同 id 的弹层已存在时直接显示旧弹层并return不再返回新 index。// 复用场景拿到已有弹层的 index 再操作 var layero $(.lay-layer #my-form).closest(.lay-layer); var index layero.attr(times); // times 属性存的就是 index性能调优iframe 层type 2配合idhideOnClose: true关闭时只隐藏不销毁二次打开不用重新加载页面性能调优弹层多时把minStack设为 false避免最小化窗口在左下角越堆越多性能调优能用layer.msg就别开layer.openmsg 默认无遮罩无标题DOM 开销小得多五、主题定制与生态集成自定义主题给 open 传skin: my-skin再覆写几个核心 class 就能换肤。容器主 class 是lay-layer不是网上老文章的layui-layer这是 v3 源码里的实际命名。.lay-layer-my-skin { border-radius: 10px; box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2); } .lay-layer-my-skin .lay-layer-title { color: #fff; background: linear-gradient(135deg, #667eea, #764ba2); border-radius: 10px 10px 0 0; }覆写样式建议放在 src/css/modules/layer.css 同级之后引入保证优先级生效。与 datePicker 组件集成弹层内的组件要在success回调里初始化此时 DOM 已经挂载。以 datePicker 为例layer.open({ type: 1, title: 选择日期, area: [300px, auto], content: input iddp classlayui-input /, success: function () { // 注释必须在 success 里 render此时弹层 DOM 已就位 layui.datePicker.render({ elem: #dp, done: (d, i) { layer.close(i); console.log(选中, d.value); }, }); }, });datePicker 的渲染参数与用法可对照 src/components/datePicker.js 及演示页 tests/visual/datePicker.html。六、速查卡API / 配置项作用典型值layer.open(options)通用弹层返回 indexoptions 见下type弹层类型0 对话 / 1 页面 / 2 iframe / 3 加载 / 4 提示1area宽高[420px, auto]offset方位auto 居中 / t / r / b / l / lt / lb / rt / rbbanim动画0~6 数字或 slide 方向4、slideUpshade遮罩数字透明度或数组[0.1, #fff]time自动关闭毫秒数0 为不关3000layer.close(index)/closeLast/closeAll(type)关闭指定 / 最近 / 某类型全部弹层closeAll(loading)官方演示页见 tests/visual/layer.html核心源码见 src/components/layer.js配置默认值集中在文件内Class.pt.config一段查参数行为时直接看那里最快。【免费下载链接】layui一套遵循浏览器原生态开发模式的 Web UI 组件库。项目地址: https://gitcode.com/GitHub_Trending/la/layui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表