弹出层
弹出层组件 layer 是 Layui 最古老的组件,也是使用覆盖面最广泛的代表性组件。 在实现网页弹出层的首选交互方案,使用的非常频繁。
打开弹层
layer.open(options);
- 参数 options : 基础属性配置项。
打开弹层的核心方法,其他不同类型的弹出方法均为该方法的二次封装。
// 该方法返回当前层的唯一索引,以便其他方法对该弹层进行相关操作
var index = layer.open({
type: 1, // page 层类型,其他类型详见「基础属性」
content: '<div style="padding: 16px;">test</div>',
});
基础属性
属性名 | 描述 | 类型 | 默认值 |
---|---|---|---|
type | 弹层类型。 可选值有:0 dialog 信息框(默认), 同时只能存在一个层1 page 页面层,可同时存在多个层2 iframe 内联框架层,可同时存在多个层3 loading 加载层,同时只能存在一个层4 tips 贴士层,可配置同时存在多个层layer 弹层由以上 5 种类型构成。 不同的类型代表不同的弹出形态,layer 提供的所有的弹出方式均由此衍生。 | number | 0 |
title | 弹层标题。其值支持以下可选类型: 1. 若为 string 类型 : 则表示为弹层的标题文本,如:title: '标题' 2.若为 array 类型 : 则可设置标题文本和标题栏 CSS 样式:title: ['标题', 'font-size: 18px;'] 3.若为 boolean 类型 : 则可设为 false 不显示标题栏。title: false // 不显示标题栏 | string、array、boolean | 信息 |
content | 弹层内容。 可传入的值比较灵活,支持以下使用场景: 1. 若 type: 1 (页面层): 则 content 可传入 文本 、 HTML 、 DOM 元素 、 jQuery 对象 2. 若 type: 2 (iframe 层): 则 content 可传入 URL 3. 若为其他弹层类型,传入普通字符即可。 | ||
area | 设置弹层的宽高,其值支持以下可选类型: 1. 若为 array 类型,则可同时设置宽高 area: ['520px', '320px'] 固定宽度和高度 area: ['auto', '320px'] 宽度自动,高度固定 area: ['520px', 'auto'] 宽度固定,高度自动2. 若为 string 类型,则可定义宽度和宽高均自适应: area: '520px' 宽度固定,高度自适应area: 'auto' 宽度和高度均自适应 |
警告
layui.open 是最重要的方法,尤其是基础属性设置。因为官网内容实在太多,并且用法很多,推荐直接看官方文档。复制粘贴调试一下,就能很快上手。
page 层
1、普通页面层
layer.open({
type: 1,
// area: ['420px', '240px'], // 宽高
content: '<div style="padding: 16px;">任意 HTML 内容</div>',
});
2、捕获层
<div id="ID-test-layer-wrapper" style="display: none;">
<div style="padding:16px;">
弹出已经存在于页面中的一段元素<br />
通常是放置在 `body` 根节点下
</div>
</div>
layer.open({
type: 1,
shade: false, // 不显示遮罩
content: $("#ID-test-layer-wrapper"), // 捕获的元素
end: function () {
// layer.msg('关闭后的回调', {icon:6});
},
});
3、剔除默认标题栏
layer.open({
type: 1,
area: ["420px", "240px"], // 宽高
title: false, // 不显示标题栏
closeBtn: 0,
shadeClose: true, // 点击遮罩关闭层
content: `<div style="padding: 16px;">任意 HTML 内容。可点击遮罩区域关闭。</div>`,
});
4、弹出自定义内容
layui.use(function () {
let $ = layui.$;
let form = layui.form;
let layer = layui.layer;
layer.open({
type: 1,
area: "350px",
resize: false,
shadeClose: true,
title: "demo : layer + form",
content: `
<div class="layui-form" lay-filter="filter-test-layer" style="margin: 16px;">
<div class="demo-login-container">
<div class="layui-form-item">
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-username"></i>
</div>
<input type="text" name="username" value="" lay-verify="required" placeholder="用户名" lay-reqtext="请填写用户名" autocomplete="off" class="layui-input" lay-affix="clear">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-password"></i>
</div>
<input type="password" name="password" value="" lay-verify="required" placeholder="密 码" lay-reqtext="请填写密码" autocomplete="off" class="layui-input" lay-affix="eye">
</div>
</div>
<div class="layui-form-item">
<div class="layui-row">
<div class="layui-col-xs7">
<div class="layui-input-wrap">
<div class="layui-input-prefix">
<i class="layui-icon layui-icon-vercode"></i>
</div>
<input type="text" name="captcha" value="" lay-verify="required" placeholder="验证码" lay-reqtext="请填写验证码" autocomplete="off" class="layui-input" lay-affix="clear">
</div>
</div>
<div class="layui-col-xs5">
<div style="margin-left: 10px;">
<img src="https://www.oschina.net/action/user/captcha" onclick="this.src='https://www.oschina.net/action/user/captcha?t='+ new Date().getTime();">
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<input type="checkbox" name="remember" lay-skin="primary" title="记住密码">
<a href="#forget" style="float: right; margin-top: 7px;">忘记密码?</a>
</div>
<div class="layui-form-item">
<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="demo-login">登录</button>
</div>
<div class="layui-form-item demo-login-other">
<label>社交账号登录</label>
<span style="padding: 0 21px 0 6px;">
<a href="javascript:;"><i class="layui-icon layui-icon-login-qq" style="color: #3492ed;"></i></a>
<a href="javascript:;"><i class="layui-icon layui-icon-login-wechat" style="color: #4daf29;"></i></a>
<a href="javascript:;"><i class="layui-icon layui-icon-login-weibo" style="color: #cf1900;"></i></a>
</span>
或 <a href="#reg">注册帐号</a></span>
</div>
</div>
</div>
`,
success: function () {
// 对弹层中的表单进行初始化渲染
form.render();
// 表单提交事件
form.on("submit(demo-login)", function (data) {
var field = data.field; // 获取表单字段值
// 显示填写结果,仅作演示用
layer.alert(JSON.stringify(field), {
title: "当前填写的字段值",
});
// 此处可执行 Ajax 等操作
// …
return false; // 阻止默认 form 跳转
});
},
});
});
layer.open({
type: 1,
area: ["420px", "240px"], // 宽高
title: false,
content: [
'<div style="padding: 11px;">',
"任意 HTML 内容",
'<div style="padding: 16px 0;">',
'<button class="layui-btn" id="ID-test-layer-move">拖拽此处移动弹层</button>',
"</div>",
"</div>",
].join(""),
move: "#ID-test-layer-move",
});
iframe 层
1、iframe 的父子操作
<script>
layui.use(function () {
var $ = layui.$;
var layer = layui.layer;
var util = layui.util;
layer.open({
type: 2,
area: ["680px", "520px"],
content: "/iframe",
fixed: false, // 不固定
maxmin: true,
shadeClose: true,
btn: ["获取表单值", "取消"],
btnAlign: "c",
yes: function (index, layero) {
// 获取 iframe 的窗口对象
var iframeWin = window[layero.find("iframe")[0]["name"]];
console.log(iframeWin);
var elemMark = iframeWin.$("input"); // 获得 iframe 中某个输入框元素
var value = elemMark.val();
if ($.trim(value) === "") return elemMark.focus();
// 显示获得的值
layer.msg("获得 iframe 中的输入框标记值:" + value);
},
});
});
</script>
iframe 子页
<!--iframe.html-->
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>iframe html</title>
<link href="/static/css/layui.css" rel="stylesheet" />
</head>
<body>
<script src="/static/layui.js"></script>
<input type="text" name="" placeholder="文本输入框" class="layui-input" />
<script src="/static/layui.js"></script>
<script>
layui.use(function () {
var $ = layui.$;
var layer = layui.layer;
window.$ = $;
});
</script>
</body>
</html>
2、禁止滚动
layer.open({
type: 2,
area: ["360px", "500px"],
skin: "layui-layer-rim", // 加上边框
content: ["iframe", "no"], // 数组第二个成员设为 no 即屏蔽 iframe 滚动条
});
3、任意 url
layer.open({
type: 2,
title: "iframe 任意 URL",
shadeClose: true,
maxmin: true, //开启最大化最小化按钮
area: ["900px", "600px"],
content: "https://notes.zhengxinonly.com/",
});
对话框(dialog)
layer.msg 消息提示
layer.msg(content, options, end);
- 参数
content
: 弹出内容 - 参数
options
: 基础属性配置项。 - 参数
end
: 提示框关闭后的回调函数
该方法用于弹出 dialog
类型提示框(type: 0
),默认 3 秒后自动关闭。参数自动向左补位。
<script>
layui.use(function () {
let $ = layui.$;
let layer = layui.layer;
layer.msg("消息提示框");
});
</script>
案例:
// 案例 1
layer.msg("普通提示");
// 案例 2
layer.msg("带 icon 的提示", { icon: 6 });
// 案例 3
layer.msg("关闭后想做些什么", function () {
console.log("do something");
});
// 案例 4
layer.msg(
"提示框",
{
icon: 1,
time: 2000, // 设置 2 秒后自动关闭,默认是3秒
},
function () {
console.log("do something");
},
);
layer.confirm 弹出询问框
layer.confirm(content, options, yes, cancel);
参数
content
: 弹出内容参数
options
: 基础属性配置项。#详见属性参数
yes
: 点击确定后的回调函数参数
cancel
: 点击第二个按钮(默认「取消」)后的回调函数该方法用于弹出
dialog
类型询问框(type: 0
),参数自动向左补位。
<script>
layui.use(function () {
let $ = layui.$;
let layer = layui.layer;
layer.confirm(
"一个询问框的示例?",
{ icon: 3 },
function () {
layer.msg("点击确定的回调", { icon: 1 });
},
function () {
layer.msg("点击取消的回调");
},
);
});
</script>
案例:
// 案例
layer.confirm("确定吗?", { icon: 3, title: "提示" }, function (index) {
// do something
// …
layer.close(index); // 取认回调,关闭窗口
});
layer.alert 弹出信息框
layer.alert(content, options, yes);
参数
content
: 弹出内容参数
options
: 基础属性配置项。#详见属性参数
yes
: 点击确定后的回调函数该方法用于弹出
dialog
类型信息框(type: 0
),参数自动向左补位。
// eg1
layer.alert("一个简单的信息框");
// eg2
layer.alert("开启图标", { icon: 1 }, function (index) {
// do something
// …
layer.close(index);
});
// eg3
layer.alert("不开启图标", function (index) {
// do something
// …
layer.close(index);
});
加载层
layer.load 弹出加载层
layer.load(icon, options);
- 参数
icon
: 加载图标风格,支持 0-2 可选值 - 参数
options
: 基础属性配置项。
该方法用于弹出 load
类型加载层(type: 3
)。
// eg1
var index = layer.load(); // 默认加载图标风格
// eg2
var index = layer.load(1); // 加载图标风格 1
// eg3
var index = layer.load(2, { time: 10 * 1000 }); // 加载图标风格,并设置最长等待 10 秒
// 关闭加载层
layer.close(index);
layer.tips 弹出贴士层
layer.tips(content, elem, options);
- 参数 content : 弹出内容
- 参数 elem : 吸附的目标元素选择器或对象
- 参数 options : 基础属性配置项。#详见属性
该方法用于弹出 tips
类型贴士层(type: 4
),默认 3 秒后自动关闭。
<body>
<script src="/static/layui.js"></script>
<div class="layui-btn" id="id" style="margin: 100px">按钮</div>
<script>
layui.use(function () {
let $ = layui.$;
let layer = layui.layer;
layer.tips("小贴士", "#id");
});
</script>
</body>
案例:
// eg1
layer.tips("小贴士", "#id");
// eg2
$("#id").on("click", function () {
var elem = this;
layer.tips("小贴士", elem); // 在元素的事件回调体中,follow直接赋予this即可
});
// eg3
layer.tips("显示在目标元素上方", "#id", {
tips: 1, // 支持 1-4 可选值,更多详见基础属性中的 tips 介绍
});
关闭弹层
layer.close 关闭弹层
layer.close(index);
- 参数
index
: 打开弹层时返回的唯一索引
该方法用于关闭对应的弹层。
// 每一种弹层调用方式,都会返回一个 index
var index1 = layer.open();
var index2 = layer.alert();
var index3 = layer.load();
var index4 = layer.tips();
// 关闭对应的弹层
layer.close(index1);
在 iframe
弹层页面中关闭自身
var index = parent.layer.getFrameIndex(window.name); // 先得到当前 iframe 层的索引
parent.layer.close(index); // 再执行关闭
layer.closeAll 关闭所有层
layer.closeAll(type);
- 参数
type
: 弹层的类型。可选值:dialog
,page
,iframe
,loading
,tips
该方法用于关闭所有同类型的弹层。
layer.closeAll(); // 关闭所有类型的层
layer.closeAll("dialog"); // 关闭所有的信息框
layer.closeAll("page"); // 关闭所有的页面层
layer.closeAll("iframe"); // 关闭所有的 iframe 层
layer.closeAll("loading"); // 关闭所有的加载层
layer.closeAll("tips"); // 关闭所有的 tips 层
关闭最近一次打开的层
layer.closeLast(type);
- 参数
type
: 弹层的类型。可选值:dialog
,page
,iframe
,loading
,tips
该方法用于关闭最近一次打开的对应类型的层。
layer.closeLast("dialog"); // 关闭最近一次打开的信息框
layer.closeLast("page"); // 关闭最近一次打开的页面层
layer.closeLast("iframe"); // 关闭最近一次打开的 iframe 层
layer.closeLast("loading"); // 关闭最近一次打开的加载层
layer.closeLast("tips"); // 关闭最近一次打开的 tips 层
iframe
获取 iframe 页中的元素
layer.getChildFrame(selector, index);
- 参数 selector : iframe 子页面的选择器或元素对象
- 参数 index : 打开弹层时返回的唯一索引
该方法用于在父页面获取 iframe 子页面中的元素
<!--filename: index.html-->
<body>
<script src="/static/layui.js"></script>
<script>
layui.use(function () {
let $ = layui.$;
let layer = layui.layer;
layer.open({
type: 2, // iframe 层
content: "/iframe",
success: function (layero, index) {
// 获取 iframe 中 body 元素的 jQuery 对象
var body = layer.getChildFrame("body", index);
// 给 iframe 页中的某个输入框赋值
body.find("input").val("Hello layer.");
},
});
});
</script>
</body>
<!--iframe.html-->
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>iframe html</title>
<link href="/static/css/layui.css" rel="stylesheet" />
</head>
<body>
<script src="/static/layui.js"></script>
<input type="text" name="" placeholder="文本输入框" class="layui-input" />
</body>
</html>
在 iframe 页中获取弹层索引
layer.getFrameIndex(window.name);
- 参数 window.name : 当前 iframe 窗口的 name 属性值
该方法用于在 iframe 页面内部获取当前 iframe 弹层的索引,以便关闭自身。
var index = parent.layer.getFrameIndex(window.name); // 获取当前 iframe 层的索引
parent.layer.close(index); // 关闭当前 iframe 弹层
设置 iframe 层高度自适应
layer.iframeAuto(index);
- 参数 index : 打开弹层时返回的唯一索引
该方法可让 iframe 高度跟随内容自适应
layer.open({
type: 2, // iframe 层
content: "/iframe",
area: "600px", // 弹层初始宽度
success: function (layero, index, that) {
layer.iframeAuto(index); // 让 iframe 高度自适应
that.offset(); // 重新自适应弹层坐标
},
});
重新设置 iframe 层 URL
layer.iframeSrc(index, url);
- 参数 index : 打开弹层时返回的唯一索引
- 参数 url : URL 地址
// 打开弹层
var index = layer.open({
type: 2, // iframe 层
content: "/iframe",
});
// 重置 iframe 页面 URL
layer.iframeSrc(index, "https://cn.bing.com/");