对话框组件
对话框是一种模态窗口,在当前页面打开一个浮层,承载相关操作或反馈信息。常用于需要用户处理事务,又不希望跳转页面的场景。
基础用法
基础的对话框,包含标题、内容和底部操作按钮。
注意:当前展示的是静态组件示例。如需自定义样式,请使用AI编辑器进行修改。
对话框标题
这是一个基础对话框,您可以在此处添加任何内容。
对话框支持多行文本和各种HTML元素。
HTML
<!-- 对话框遮罩层 -->
<div class="dialog-mask">
<!-- 对话框容器 -->
<div class="dialog">
<!-- 对话框头部 -->
<div class="dialog-header">
<div class="dialog-title">对话框标题</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<!-- 对话框内容 -->
<div class="dialog-body">
<p>这是一个基础对话框,您可以在此处添加任何内容。</p>
<p>对话框支持多行文本和各种HTML元素。</p>
</div>
<!-- 对话框底部按钮 -->
<div class="dialog-footer">
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">确认</button>
</div>
</div>
</div>
JavaScript
// 创建并显示对话框
function showDialog() {
// 创建遮罩层
const mask = document.createElement('div');
mask.className = 'dialog-mask';
// 创建对话框
const dialog = document.createElement('div');
dialog.className = 'dialog';
// 对话框头部
const header = document.createElement('div');
header.className = 'dialog-header';
header.innerHTML = `
<div class="dialog-title">对话框标题</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
`;
// 对话框内容
const body = document.createElement('div');
body.className = 'dialog-body';
body.innerHTML = `
<p>这是一个基础对话框,您可以在此处添加任何内容。</p>
<p>对话框支持多行文本和各种HTML元素。</p>
`;
// 对话框底部
const footer = document.createElement('div');
footer.className = 'dialog-footer';
footer.innerHTML = `
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">确认</button>
`;
// 组装对话框
dialog.appendChild(header);
dialog.appendChild(body);
dialog.appendChild(footer);
mask.appendChild(dialog);
document.body.appendChild(mask);
// 绑定关闭事件
const closeBtn = header.querySelector('.dialog-close');
closeBtn.addEventListener('click', () => {
document.body.removeChild(mask);
});
const cancelBtn = footer.querySelector('.btn-secondary');
cancelBtn.addEventListener('click', () => {
document.body.removeChild(mask);
});
// 阻止点击对话框内部关闭对话框
dialog.addEventListener('click', (e) => {
e.stopPropagation();
});
// 点击遮罩层关闭对话框
mask.addEventListener('click', () => {
document.body.removeChild(mask);
});
return dialog;
}
// 绑定按钮点击事件
document.getElementById('show-basic-dialog').addEventListener('click', showDialog);
不同尺寸
对话框有三种不同尺寸:小型、默认和大型,适用于不同内容量的场景。
HTML
<!-- 小型对话框 -->
<div class="dialog-mask">
<div class="dialog dialog-small">
<div class="dialog-header">
<div class="dialog-title">小型对话框</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<p>小型对话框适用于简单的确认信息。</p>
</div>
<div class="dialog-footer">
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">确认</button>
</div>
</div>
</div>
<!-- 默认对话框 -->
<div class="dialog-mask">
<div class="dialog">
<div class="dialog-header">
<div class="dialog-title">默认对话框</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<p>默认对话框适用于常规内容展示。</p>
</div>
<div class="dialog-footer">
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">确认</button>
</div>
</div>
</div>
<!-- 大型对话框 -->
<div class="dialog-mask">
<div class="dialog dialog-large">
<div class="dialog-header">
<div class="dialog-title">大型对话框</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<p>大型对话框适用于复杂表单或大量内容展示。</p>
</div>
<div class="dialog-footer">
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">确认</button>
</div>
</div>
</div>
JavaScript
// 创建对话框函数,增加size参数
function createDialog(size = '') {
// 创建遮罩层
const mask = document.createElement('div');
mask.className = 'dialog-mask';
// 创建对话框,添加尺寸类
const dialog = document.createElement('div');
dialog.className = 'dialog';
if (size) {
dialog.classList.add(`dialog-${size}`);
}
// 对话框头部
const header = document.createElement('div');
header.className = 'dialog-header';
let title = '默认对话框';
if (size === 'small') title = '小型对话框';
if (size === 'large') title = '大型对话框';
header.innerHTML = `
<div class="dialog-title">${title}</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
`;
// 对话框内容
const body = document.createElement('div');
body.className = 'dialog-body';
let content = '默认对话框适用于常规内容展示。';
if (size === 'small') content = '小型对话框适用于简单的确认信息。';
if (size === 'large') content = '大型对话框适用于复杂表单或大量内容展示。';
body.innerHTML = `<p>${content}</p>`;
// 对话框底部
const footer = document.createElement('div');
footer.className = 'dialog-footer';
if (Array.isArray(buttonText)) {
footer.innerHTML = `
<button class="btn ${buttonClass[0]}">${buttonText[0]}</button>
<button class="btn ${buttonClass[1]}">${buttonText[1]}</button>
`;
} else {
footer.innerHTML = `<button class="btn ${buttonClass}">${buttonText}</button>`;
}
// 组装对话框
dialog.appendChild(header);
dialog.appendChild(body);
dialog.appendChild(footer);
mask.appendChild(dialog);
document.body.appendChild(mask);
// 绑定关闭事件
const closeBtn = header.querySelector('.dialog-close');
closeBtn.addEventListener('click', () => {
document.body.removeChild(mask);
});
// 绑定按钮事件
const buttons = footer.querySelectorAll('.btn');
buttons.forEach(btn => {
btn.addEventListener('click', () => {
document.body.removeChild(mask);
});
});
// 阻止点击对话框内部关闭对话框
dialog.addEventListener('click', (e) => {
e.stopPropagation();
});
// 点击遮罩层关闭对话框
mask.addEventListener('click', () => {
document.body.removeChild(mask);
});
return dialog;
}
// 绑定不同尺寸对话框按钮点击事件
document.getElementById('show-small-dialog').addEventListener('click', () => createDialog('small'));
document.getElementById('show-default-dialog').addEventListener('click', () => createDialog());
document.getElementById('show-large-dialog').addEventListener('click', () => createDialog('large'));
消息对话框
根据使用场景,对话框有不同类型,包括信息提示、成功提示、警告提示和错误提示。
HTML
<!-- 信息对话框 -->
<div class="dialog-mask">
<div class="dialog dialog-info">
<div class="dialog-header">
<div class="dialog-icon"><i class="mdi mdi-information"></i></div>
<div class="dialog-title">信息提示</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<p>这是一条重要的信息提示。</p>
</div>
<div class="dialog-footer">
<button class="btn btn-primary">我知道了</button>
</div>
</div>
</div>
<!-- 成功对话框 -->
<div class="dialog-mask">
<div class="dialog dialog-success">
<div class="dialog-header">
<div class="dialog-icon"><i class="mdi mdi-check-circle"></i></div>
<div class="dialog-title">操作成功</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<p>您的操作已成功完成。</p>
</div>
<div class="dialog-footer">
<button class="btn btn-primary">确定</button>
</div>
</div>
</div>
<!-- 警告对话框 -->
<div class="dialog-mask">
<div class="dialog dialog-warning">
<div class="dialog-header">
<div class="dialog-icon"><i class="mdi mdi-alert"></i></div>
<div class="dialog-title">操作警告</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<p>此操作需要注意,是否继续?</p>
</div>
<div class="dialog-footer">
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">继续</button>
</div>
</div>
</div>
<!-- 错误对话框 -->
<div class="dialog-mask">
<div class="dialog dialog-error">
<div class="dialog-header">
<div class="dialog-icon"><i class="mdi mdi-alert-circle"></i></div>
<div class="dialog-title">错误提示</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<p>操作失败,请检查并重试。</p>
</div>
<div class="dialog-footer">
<button class="btn btn-danger">重试</button>
</div>
</div>
</div>
JavaScript
// 创建消息对话框函数
function createMessageDialog(type) {
// 创建遮罩层
const mask = document.createElement('div');
mask.className = 'dialog-mask';
// 创建对话框
const dialog = document.createElement('div');
dialog.className = `dialog dialog-${type}`;
// 配置不同类型对话框的属性
let iconClass, title, message, buttonText, buttonClass;
switch(type) {
case 'info':
iconClass = 'mdi-information';
title = '信息提示';
message = '这是一条重要的信息提示。';
buttonText = '我知道了';
buttonClass = 'btn-primary';
break;
case 'success':
iconClass = 'mdi-check-circle';
title = '操作成功';
message = '您的操作已成功完成。';
buttonText = '确定';
buttonClass = 'btn-primary';
break;
case 'warning':
iconClass = 'mdi-alert';
title = '操作警告';
message = '此操作需要注意,是否继续?';
buttonText = ['取消', '继续'];
buttonClass = ['btn-secondary', 'btn-primary'];
break;
case 'error':
iconClass = 'mdi-alert-circle';
title = '错误提示';
message = '操作失败,请检查并重试。';
buttonText = '重试';
buttonClass = 'btn-danger';
break;
}
// 对话框头部
const header = document.createElement('div');
header.className = 'dialog-header';
header.innerHTML = `
<div class="dialog-icon"><i class="mdi ${iconClass}"></i></div>
<div class="dialog-title">${title}</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
`;
// 对话框内容
const body = document.createElement('div');
body.className = 'dialog-body';
body.innerHTML = `<p>${message}</p>`;
// 对话框底部
const footer = document.createElement('div');
footer.className = 'dialog-footer';
if (Array.isArray(buttonText)) {
footer.innerHTML = `
<button class="btn ${buttonClass[0]}">${buttonText[0]}</button>
<button class="btn ${buttonClass[1]}">${buttonText[1]}</button>
`;
} else {
footer.innerHTML = `<button class="btn ${buttonClass}">${buttonText}</button>`;
}
// 组装对话框
dialog.appendChild(header);
dialog.appendChild(body);
dialog.appendChild(footer);
mask.appendChild(dialog);
document.body.appendChild(mask);
// 绑定关闭事件
const closeBtn = header.querySelector('.dialog-close');
closeBtn.addEventListener('click', () => {
document.body.removeChild(mask);
});
// 绑定按钮事件
const buttons = footer.querySelectorAll('.btn');
buttons.forEach(btn => {
btn.addEventListener('click', () => {
document.body.removeChild(mask);
});
});
// 阻止点击对话框内部关闭对话框
dialog.addEventListener('click', (e) => {
e.stopPropagation();
});
// 点击遮罩层关闭对话框
mask.addEventListener('click', () => {
document.body.removeChild(mask);
});
return dialog;
}
// 绑定不同类型消息对话框按钮点击事件
document.getElementById('show-info-dialog').addEventListener('click', () => createMessageDialog('info'));
document.getElementById('show-success-dialog').addEventListener('click', () => createMessageDialog('success'));
document.getElementById('show-warning-dialog').addEventListener('click', () => createMessageDialog('warning'));
document.getElementById('show-error-dialog').addEventListener('click', () => createMessageDialog('error'));
自定义内容
对话框可以包含复杂的内容,例如表单、图表或其他复杂的组件。
HTML
<!-- 带表单的对话框 -->
<div class="dialog-mask">
<div class="dialog">
<div class="dialog-header">
<div class="dialog-title">用户信息</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
</div>
<div class="dialog-body">
<form id="user-form">
<div style="margin-bottom: 16px;">
<label for="username" style="display: block; margin-bottom: 8px;">用户名</label>
<input type="text" id="username" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
</div>
<div style="margin-bottom: 16px;">
<label for="email" style="display: block; margin-bottom: 8px;">邮箱</label>
<input type="email" id="email" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
</div>
<div>
<label for="role" style="display: block; margin-bottom: 8px;">角色</label>
<select id="role" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
<option value="admin">管理员</option>
<option value="user">普通用户</option>
<option value="guest">访客</option>
</select>
</div>
</form>
</div>
<div class="dialog-footer">
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">提交</button>
</div>
</div>
</div>
JavaScript
// 创建表单对话框
function createFormDialog() {
// 创建遮罩层
const mask = document.createElement('div');
mask.className = 'dialog-mask';
// 创建对话框
const dialog = document.createElement('div');
dialog.className = 'dialog';
// 对话框头部
const header = document.createElement('div');
header.className = 'dialog-header';
header.innerHTML = `
<div class="dialog-title">用户信息</div>
<div class="dialog-close"><i class="mdi mdi-close"></i></div>
`;
// 对话框内容
const body = document.createElement('div');
body.className = 'dialog-body';
body.innerHTML = `
<form id="user-form">
<div style="margin-bottom: 16px;">
<label for="username" style="display: block; margin-bottom: 8px;">用户名</label>
<input type="text" id="username" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
</div>
<div style="margin-bottom: 16px;">
<label for="email" style="display: block; margin-bottom: 8px;">邮箱</label>
<input type="email" id="email" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
</div>
<div>
<label for="role" style="display: block; margin-bottom: 8px;">角色</label>
<select id="role" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
<option value="admin">管理员</option>
<option value="user">普通用户</option>
<option value="guest">访客</option>
</select>
</div>
</form>
`;
// 对话框底部
const footer = document.createElement('div');
footer.className = 'dialog-footer';
footer.innerHTML = `
<button class="btn btn-secondary">取消</button>
<button class="btn btn-primary">提交</button>
`;
// 组装对话框
dialog.appendChild(header);
dialog.appendChild(body);
dialog.appendChild(footer);
mask.appendChild(dialog);
document.body.appendChild(mask);
// 绑定关闭事件
const closeBtn = header.querySelector('.dialog-close');
closeBtn.addEventListener('click', () => {
document.body.removeChild(mask);
});
// 绑定取消按钮事件
const cancelBtn = footer.querySelector('.btn-secondary');
cancelBtn.addEventListener('click', () => {
document.body.removeChild(mask);
});
// 绑定提交按钮事件
const submitBtn = footer.querySelector('.btn-primary');
submitBtn.addEventListener('click', () => {
const username = dialog.querySelector('#username').value;
const email = dialog.querySelector('#email').value;
const role = dialog.querySelector('#role').value;
console.log('提交的表单数据:', { username, email, role });
document.body.removeChild(mask);
});
// 阻止点击对话框内部关闭对话框
dialog.addEventListener('click', (e) => {
e.stopPropagation();
});
// 点击遮罩层关闭对话框
mask.addEventListener('click', () => {
document.body.removeChild(mask);
});
return dialog;
}
// 绑定表单对话框按钮点击事件
document.getElementById('show-form-dialog').addEventListener('click', createFormDialog);
API
对话框组件的属性和类。
类名 | 说明 | 类型 | 默认值 |
---|---|---|---|
dialog-mask | 对话框遮罩层,用于覆盖整个页面 | string | - |
dialog | 对话框容器 | string | - |
dialog-small | 小型对话框 | string | - |
dialog-large | 大型对话框 | string | - |
dialog-header | 对话框头部 | string | - |
dialog-title | 对话框标题 | string | - |
dialog-close | 对话框关闭按钮 | string | - |
dialog-body | 对话框内容区域 | string | - |
dialog-footer | 对话框底部 | string | - |
dialog-info | 信息类型对话框 | string | - |
dialog-success | 成功类型对话框 | string | - |
dialog-warning | 警告类型对话框 | string | - |
dialog-error | 错误类型对话框 | string | - |
dialog-icon | 对话框图标 | string | - |
JavaScript函数
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
showDialog | 显示基础对话框 | - | dialog元素 |
createDialog | 创建不同尺寸的对话框 | (size) | dialog元素 |
createMessageDialog | 创建消息类型对话框 | (type) | dialog元素 |
createFormDialog | 创建带表单的对话框 | - | dialog元素 |