我的编程空间,编程开发者的网络收藏夹
学习永远不晚

原生JavaScript怎么实现模态框

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

原生JavaScript怎么实现模态框

本篇内容介绍了“原生JavaScript怎么实现模态框”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

原生js封装模态框

最近需要一个模态框,然后一种是提示类的,一种是确认类型,我就想着再网上找一个然后修改一下,结果找到了,但是不深特别合适,我再次基础上在做了修改,对功能有所增强,纯原生写的,没有任何依赖性,适应性比较强,值copy即可使用。

配置:可以在实例化时对options进行参数设置,达到自己想要的效果

示例效果

原生JavaScript怎么实现模态框

代码

HTML部分

<head><meta charset="utf-8"> <title>弹出框</title></head>

CSS部分

.mask {position: fixed;top: 0;bottom: 0;left: 0;right: 0;background: #bfbfbf;opacity: 0.5;}.modal {position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 400px;background-color: aliceblue;border-radius: 5px;z-index: 99;border: 1px solid rgba(0, 0, 0, 0.2);}.modal .modalTitle {height: 50px;box-sizing: content-box;display: flex;align-items: center;justify-content: space-between;border-bottom: 2px solid #eeeeee;padding: 0 16px;}.modalTitle .closeModal {width: 20px;height: 20px;border-radius: 5px;line-height: 20px;text-align: center;font-size: 14px;cursor: pointer;background-image: url('https://typroas.oss-cn-hangzhou.aliyuncs.com/typroaImg/close.png');background-size: 100% 100%;}.modalTitleText {margin: 0 auto;font-size: 17px;}.modal .main {box-sizing: border-box;padding: 16px;height: calc(100% - 80px);}.modal .footer {height: 50px;text-align: right;box-sizing: border-box;padding-right: 16px;display: flex;align-items: center;justify-content: flex-end;}.footer .btnLeft,.footer .btnRight {width: 120px;height: 35px;text-align: center;line-height: 30px;border: none;border-radius: 0.2rem;margin-left: 8px;background-color: #dddddd;}.footer .btnOk {width: 120px;height: 35px;text-align: center;line-height: 30px;border: none;border-radius: 0.3rem;background-color: #1d73d3;margin: 0 auto;font-size: 17px;color: white;}.footer .btnLeft:hover,.footer .btnRight:hover {background-color: #1D73D3;color: #FFFFFF;}

JS部分

function Modal(options) {options = Object.assign({lateRelease: options.lateRelease ? options.lateRelease : false, //是否开启延时关闭lateReleaseTime: options.lateReleaseTime ? options.lateReleaseTime : 5000, // 延时关闭时间isCreateOpen: options.isCreateOpen ? options.isCreateOpen : true, //是否创建完毕后就打开弹出框type: options.type ? options.type : 'hint', // hint:提示框 confirm:确认框isTopRightcancel: true, // 是否需要右上角小x取消按钮modalTitle: options.modalTitle ? options.modalTitle : '温馨提示',backgroundColor: options.backgroundColor ? options.backgroundColor : '#fff', // 背景颜色mask: options.mask ? options.mask : true, //是否显示遮罩层,content: options.content ? options.content : '', //弹框内容cancelText: options.cancelText ? options.cancelText : '取消', //取消按钮文字okText: options.okText ? options.okText : '确认', // 确认按钮文字,width: options.width ? options.width : 500, //对话框的宽度onCancel: options.onCancel ? options.onCancel : this.closeModal, //取消按钮回调,默认是关闭弹框cancelCallBack: options.cancelCallBack ? options.cancelCallBack : () => {console.log('你点击了取消');}, //取消回调onOkCallBack: options.onOkCallBack ? options.onOkCallBack : () => {console.log('你点击了确认');}, // 确认按钮回调}, options);this.options = options;// 创建遮罩层function createMask() {let mask = document.createElement('div')mask.className = 'mask';document.body.appendChild(mask);}// 创建modal弹框function createModal(type) {let modal = document.createElement('div');let modalTitleDom = document.createElement('div');let main = document.createElement('div');let footer = document.createElement('div');let btnLeft;let btnRight;let btnOk;let closeIcon;if (type == 'hint') {btnOk = document.createElement('button');btnOk.className = 'btnOk';} else if (type == 'confirm') {btnLeft = document.createElement('button');btnLeft.className = 'btnLeft';btnRight = document.createElement('button');btnRight.className = 'btnRight';}let {modalTitle,content,cancelText,okText,width,onCancel,onOkCallBack,backgroundColor,cancelCallBack,isTopRightcancel,isCreateOpen} = this.options;modal.className = 'modal';modal.style.width = width + 'px';modal.style.backgroundColor = backgroundColor;modalTitleDom.className = 'modalTitle'modalTitleDom.innerHTML = `<span class="modalTitleText">${modalTitle}</span>`;if (isTopRightcancel) {closeIcon = document.createElement('span');closeIcon.addEventListener('click', closeModal.bind(this));closeIcon.className = 'closeModal';modalTitleDom.appendChild(closeIcon);}main.className = 'main';main.innerHTML = content;footer.className = 'footer';if (type == 'hint') {btnOk.innerHTML = '确认';footer.appendChild(btnOk);onCancel = onCancel ? onCancel : this.closeModal;btnOk.addEventListener('click', onCancel.bind(this));} else if (type == 'confirm') {btnLeft.innerHTML = '取消';btnRight.innerHTML = '确认';footer.appendChild(btnLeft);footer.appendChild(btnRight);onCancel = onCancel ? onCancel : this.closeModal;btnLeft.addEventListener('click', onCancel.bind(this));btnRight.addEventListener('click', onOkCallBack);}modal.appendChild(modalTitleDom);modal.appendChild(main);modal.appendChild(footer);modal.className = 'modal';this.options.onCancel = onCancel.bind(this);document.body.appendChild(modal);}// 关闭弹框function closeModal(ev) {options.cancelCallBack();let target = ev ? ev.path[2] : document.getElementsByClassName('modal')[0];let {mask} = this.optionsmask ? document.body.removeChild(document.querySelector('.mask')) : null;document.body.removeChild(target);}function openModal() {this.init();}// 初始化function init() {let {mask} = this.optionsmask ? createMask() : nullthis.createModal(this.options.type);}Modal.prototype.init = init;Modal.prototype.createModal = createModal;Modal.prototype.closeModal = closeModal;Modal.prototype.openModal = openModal;// 执行初始化方法if (this.options.isCreateOpen) {this.init();if (this.options.lateRelease) {setTimeout(() => {let modal = document.getElementsByClassName('modal')[0];if(modal){this.options.onCancel();}}, this.options.lateReleaseTime);}}}document.getElementById("btn").addEventListener('click', () => {let modal = new Modal({lateRelease: true,modalTitle: '我是第二个',content: `<p>日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一起进步。</p>`})// modal.closeModal();// modal.openModal();})

完整代码

<!DOCTYPE html><html><head><meta charset="utf-8"> <title>弹出框</title></head><style type="text/css">.mask {position: fixed;top: 0;bottom: 0;left: 0;right: 0;background: #bfbfbf;opacity: 0.5;}.modal {position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 400px;background-color: aliceblue;border-radius: 5px;z-index: 99;border: 1px solid rgba(0, 0, 0, 0.2);}.modal .modalTitle {height: 50px;box-sizing: content-box;display: flex;align-items: center;justify-content: space-between;border-bottom: 2px solid #eeeeee;padding: 0 16px;}.modalTitle .closeModal {width: 20px;height: 20px;border-radius: 5px;line-height: 20px;text-align: center;font-size: 14px;cursor: pointer;background-image: url('https://typroas.oss-cn-hangzhou.aliyuncs.com/typroaImg/close.png');background-size: 100% 100%;}.modalTitleText {margin: 0 auto;font-size: 17px;}.modal .main {box-sizing: border-box;padding: 16px;height: calc(100% - 80px);}.modal .footer {height: 50px;text-align: right;box-sizing: border-box;padding-right: 16px;display: flex;align-items: center;justify-content: flex-end;}.footer .btnLeft,.footer .btnRight {width: 120px;height: 35px;text-align: center;line-height: 30px;border: none;border-radius: 0.2rem;margin-left: 8px;background-color: #dddddd;}.footer .btnOk {width: 120px;height: 35px;text-align: center;line-height: 30px;border: none;border-radius: 0.3rem;background-color: #1d73d3;margin: 0 auto;font-size: 17px;color: white;}.footer .btnLeft:hover,.footer .btnRight:hover {background-color: #1D73D3;color: #FFFFFF;}</style><body><button type="button" id="btn">弹出</button><script type="text/javascript">function Modal(options) {options = Object.assign({lateRelease: options.lateRelease ? options.lateRelease : false, //是否开启延时关闭lateReleaseTime: options.lateReleaseTime ? options.lateReleaseTime : 5000, // 延时关闭时间isCreateOpen: options.isCreateOpen ? options.isCreateOpen : true, //是否创建完毕后就打开弹出框type: options.type ? options.type : 'hint', // hint:提示框 confirm:确认框isTopRightcancel: true, // 是否需要右上角小x取消按钮modalTitle: options.modalTitle ? options.modalTitle : '温馨提示',backgroundColor: options.backgroundColor ? options.backgroundColor : '#fff', // 背景颜色mask: options.mask ? options.mask : true, //是否显示遮罩层,content: options.content ? options.content : '', //弹框内容cancelText: options.cancelText ? options.cancelText : '取消', //取消按钮文字okText: options.okText ? options.okText : '确认', // 确认按钮文字,width: options.width ? options.width : 500, //对话框的宽度onCancel: options.onCancel ? options.onCancel : this.closeModal, //取消按钮回调,默认是关闭弹框cancelCallBack: options.cancelCallBack ? options.cancelCallBack : () => {console.log('你点击了取消');}, //取消回调onOkCallBack: options.onOkCallBack ? options.onOkCallBack : () => {console.log('你点击了确认');}, // 确认按钮回调}, options);this.options = options;// 创建遮罩层function createMask() {let mask = document.createElement('div')mask.className = 'mask';document.body.appendChild(mask);}// 创建modal弹框function createModal(type) {let modal = document.createElement('div');let modalTitleDom = document.createElement('div');let main = document.createElement('div');let footer = document.createElement('div');let btnLeft;let btnRight;let btnOk;let closeIcon;if (type == 'hint') {btnOk = document.createElement('button');btnOk.className = 'btnOk';} else if (type == 'confirm') {btnLeft = document.createElement('button');btnLeft.className = 'btnLeft';btnRight = document.createElement('button');btnRight.className = 'btnRight';}let {modalTitle,content,cancelText,okText,width,onCancel,onOkCallBack,backgroundColor,cancelCallBack,isTopRightcancel,isCreateOpen} = this.options;modal.className = 'modal';modal.style.width = width + 'px';modal.style.backgroundColor = backgroundColor;modalTitleDom.className = 'modalTitle'modalTitleDom.innerHTML = `<span class="modalTitleText">${modalTitle}</span>`;if (isTopRightcancel) {closeIcon = document.createElement('span');closeIcon.addEventListener('click', closeModal.bind(this));closeIcon.className = 'closeModal';modalTitleDom.appendChild(closeIcon);}main.className = 'main';main.innerHTML = content;footer.className = 'footer';if (type == 'hint') {btnOk.innerHTML = '确认';footer.appendChild(btnOk);onCancel = onCancel ? onCancel : this.closeModal;btnOk.addEventListener('click', onCancel.bind(this));} else if (type == 'confirm') {btnLeft.innerHTML = '取消';btnRight.innerHTML = '确认';footer.appendChild(btnLeft);footer.appendChild(btnRight);onCancel = onCancel ? onCancel : this.closeModal;btnLeft.addEventListener('click', onCancel.bind(this));btnRight.addEventListener('click', onOkCallBack);}modal.appendChild(modalTitleDom);modal.appendChild(main);modal.appendChild(footer);modal.className = 'modal';this.options.onCancel = onCancel.bind(this);document.body.appendChild(modal);}// 关闭弹框function closeModal(ev) {options.cancelCallBack();let target = ev ? ev.path[2] : document.getElementsByClassName('modal')[0];let {mask} = this.optionsmask ? document.body.removeChild(document.querySelector('.mask')) : null;document.body.removeChild(target);}function openModal() {this.init();}// 初始化function init() {let {mask} = this.optionsmask ? createMask() : nullthis.createModal(this.options.type);}Modal.prototype.init = init;Modal.prototype.createModal = createModal;Modal.prototype.closeModal = closeModal;Modal.prototype.openModal = openModal;// 执行初始化方法if (this.options.isCreateOpen) {this.init();if (this.options.lateRelease) {setTimeout(() => {let modal = document.getElementsByClassName('modal')[0];if(modal){this.options.onCancel();}}, this.options.lateReleaseTime);}}}document.getElementById("btn").addEventListener('click', () => {let modal = new Modal({lateRelease: true,modalTitle: '我是第二个',content: `<p>日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一起进步。</p>`})// modal.closeModal();// modal.openModal();})</script></body></html>

“原生JavaScript怎么实现模态框”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

原生JavaScript怎么实现模态框

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

原生JavaScript怎么实现模态框

本篇内容介绍了“原生JavaScript怎么实现模态框”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!原生js封装模态框最近需要一个模态框,然
2023-07-02

JavaScript怎么实现模态框拖拽效果

这篇文章主要介绍“JavaScript怎么实现模态框拖拽效果”,在日常操作中,相信很多人在JavaScript怎么实现模态框拖拽效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript怎么实现模
2023-06-22

JavaScript实现拖动模态框的代码怎么写

这篇文章主要介绍“JavaScript实现拖动模态框的代码怎么写”,在日常操作中,相信很多人在JavaScript实现拖动模态框的代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript实
2023-07-02

HTML5和CSS3怎么实现模态框

这篇文章主要介绍“HTML5和CSS3怎么实现模态框”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“HTML5和CSS3怎么实现模态框”文章能帮助大家解决问题。源码示例可能你并不想看我下面的一堆冗长的
2023-07-05

怎么使用js实现拖动模态框

本文小编为大家详细介绍“怎么使用js实现拖动模态框”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用js实现拖动模态框”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下:代码思路:1.点击弹出层,会弹出
2023-07-02

原生JavaScript怎么实现九宫格抽奖

本文小编为大家详细介绍“原生JavaScript怎么实现九宫格抽奖”,内容详细,步骤清晰,细节处理妥当,希望这篇“原生JavaScript怎么实现九宫格抽奖”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。思路:通过
2023-07-02

怎么使用HTML5原生对话框元素并轻松创建模态框组件

这篇文章主要介绍了怎么使用HTML5原生对话框元素并轻松创建模态框组件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。HTML 5.2草案加入了新的dialog元素。但是是一种
2023-06-09

JavaScript怎么实现生成动态表格和动态效果

本篇内容介绍了“JavaScript怎么实现生成动态表格和动态效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码:
2023-06-29

JavaScript设计模式之原型模式怎么实现

本篇内容主要讲解“JavaScript设计模式之原型模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript设计模式之原型模式怎么实现”吧!前言设计模式呢最多的可能是用到类
2023-07-02

javascript下拉框动态加载数据怎么实现

可以使用Ajax技术来实现JavaScript下拉框动态加载数据。步骤如下:1. 定义一个下拉框元素,例如:```html```2. 使用JavaScript代码获取该下拉框元素,并定义一个函数来动态加载数据,例如:```javascrip
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录