纯js封装一个弹出窗口

news2024/11/23 6:49:02

先上效果图:

左图是默认的样式(默认标题是黑色的。不是橙色的。截图时我改了点东西所以变了色。。。)。右图是通过传递参数自定义了外观的样式。

 封装实现:

function showWindow() {
	this.rnd = Math.random();
    this.obj = null;
    this.title = '';
    this.content = '';
    this.scroll = false;
    this.zindex = 0;
    this.width = 500;
    this.top = 0;
    this.left = 0;
    this.dimensions = this.calcDimensions();
    this.titleColor = 'background:#f0f0f0; color:#7e7975';
    this.titleBottomBoder = '1px solid #c2c2c2';
    this.scrollColor = '#7e7975';
    this.border = '6px solid rgba(181,181,181,0.4);border-radius:5px';
    this.bodyColor = 'color:#7e7975;background:#fff';
    this.scrollText = 'scroll';
}
showWindow.prototype = {
    isMobile: function () {
        return navigator.userAgent.toLowerCase().match(/(ipod|iphone|android|coolpad|mmp|smartphone|midp|wap|xoom|symbian|j2me|blackberry|wince)/i) != null;
    },
    
    show: function (param) {
        if (typeof param != 'undefined') {
            this.title = param.title || '';
            this.content = param.content || '';
            this.scroll = param.scroll || false;
            this.zindex = param.zindex || 0;
            this.width = param.width || 500;
            this.top = param.top || 0;
            this.left = param.left || 0;
            this.titleColor = param.titlecolor || 'background:#f0f0f0; color:#7e7975';
            this.titleBottomBoder = param.titlebottomboder || '1px solid #c2c2c2';
            this.scrollColor = param.scrollcolor || '#7e7975';
            this.border = param.border || '6px solid rgba(181,181,181,0.4);border-radius:5px';
            this.bodyColor = param.bodycolor || 'color:#7e7975;background:#fff';
            this.scrollText = param.scrolltext || 'scroll';
        }
        
        var divObj = document.createElement("div");
        this.obj = divObj;
        divObj.id = "window_" + this.rnd;

        if (typeof this.width != "undefined") {
			width = this.width + "";
			if (width.indexOf("%") > -1) {
				divObjWidth = width;
			} else {
				if (parseInt(width) > 0) {
					divObjWidth = parseFloat(width) + 'px';
				} else {
					divObjWidth = "500px";
				}
			}
        }
        
        if (this.isMobile() == true) {
            divObjWidth = window.innerWidth + "px";
        }

        divObj.style = "opacity: 0;transition: opacity 0.3s;position:fixed;left:0; right:0; color: #7e7975;box-shadow:0 10px 10px rgba(0,0,0,0.1),10px 10px 10px rgba(0,0,0,0.3);border: " + this.border + ";width:" + divObjWidth + ";z-index:" + this.zindex;
        divObj.innerHTML =
            "<div style='display:flex;font-weight:bold; border-bottom:" + this.titleBottomBoder + "; height:40px; line-height:40px; padding:0 10px; cursor:move;" + this.titleColor + ";' id='showwin_title_" + this.rnd + "'><div style='width:80%;overflow:hidden'>" + this.title + "</div><div style=' display:flex;justify-content: end;width:20%;align-items:center'><span style='margin-right:8px;display: inline-block;vertical-align: middle;'><input type='checkbox' id='showwin_scrollchk_" + this.rnd + "' style='cursor:pointer;vertical-align:middle' /><label style='color:#7e7975' for='showwin_scrollchk_" + this.rnd + "'><span style='cursor:pointer; font-weight:normal; margin-left:2px; font-size:11px;color:" + this.scrollColor + "'>" + this.scrollText + "</span></label></span><a style ='height:20px;display:block;width:20px; background:url(data:image/gif;base64,R0lGODlhFAAoANUlAJ2dnZycnAOdz7S0tCS/5w2n1hWv2xu14BOt2q2traOjo6ioqKenp6urqxex3Rmz3hGr2Q+p16SkpKampqqqqrGxsaGhoa6urgmj0wul1J6enhy34R654rKysq+vrwWf0Aeh0aCgoCC75CK95f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACUALAAAAAAUACgAAAb/wFKJRCwajyThcMBsOp+DJKlDrVqvVWJly+16uUSPeEwuj4mXtHrNVhMTcPg7PqeTGnh8UU/M8ymAgUiBgiQLh4gLRomIRAyPkAxGkZBEE5eYSJiZJBKenkWgRJ+iCqamRKcKqapEFq+wsbKwRCG2t7i5t0Qavb6/wL5EAMTFxsfFUgHLzM3OAUlCSNNFSkPU00okBNzd3t8EUiPj5OXm5EQi6uvs7etEHPHy8/TyRBv4+fr7+UQH///8ARQ4kMSDgweLJCSCcKGDhxCRQIxIwoDFiwaMYLxIBIHHjwiMgPxIBILJk0hOoiQRoWXLIi+JuIxZoGZNIjYL4MxJJIPPK59Ag/4kgqGo0aNIjRIBwbSp06dNiXyYSrWqVapSBGjdyrWrgGjXsB0REgQAOw==)' href='javascript:;' onmousedown='event.cancelBubble = true' onmouseleave='console.log(333);this.style.backgroundPosition=\"0 0\"' onmouseover='console.log(222);this.style.backgroundPosition=\"0 20px\"' id='showwin_close_" + this.rnd + "'></a></div></div>\
		    <div style='" + this.bodyColor + "; padding: 10px; word-wrap: break-word; word-break: break-all;'>" + this.content + "</div>";
        document.body.appendChild(divObj);
        setTimeout(function(){
            divObj.style.opacity = 1;
        },0)
        if (this.scroll) {
			divObj.style.position = "absolute";
			document.getElementById( "showwin_scrollchk_" + this.rnd).checked = true;
		} else {
			divObj.style.position = "fixed";
        }
        
        var that = this;
        document.getElementById("showwin_scrollchk_" + this.rnd).addEventListener('click', function (e) {
            if (e.target.checked == true) {
                divObj.style.position = "absolute";
                scrollTo(0, 0);
            } else {
                divObj.style.position = "fixed";
                divObj.style.top = that.calcTop() + "px";
            }
        }, false);
        document.getElementById("showwin_title_" + this.rnd).addEventListener('mousedown', function (e) {
            that.onmousedown(e)
        }, false);
        document.getElementById("showwin_close_" + this.rnd).addEventListener('click', function (e) {
            that.close();
        }, false);

        divObj.style.left = this.calcLeft() + "px";
        divObj.style.top = this.calcTop() + "px";
        return this;
    },
    close: function(){
        this.obj.style.opacity = 0;
        setTimeout(() => {
            document.body.removeChild(document.getElementById(this.obj.id))
        }, 300);
        
    },
    calcLeft: function() {
        var _left;
        if (width.indexOf("%") > -1) {
            _left = (this.dimensions[0] - (this.dimensions[0] * parseFloat(this.width)) / 100) / 2 + this.left;
        } else {
            _left = (this.dimensions[0] - parseFloat(this.width)) / 2 + this.left;
        }
        return _left < 0 ? 0 : _left;
    },
    calcTop: function() {
        var _top;
        if (!this.scroll) {
            _top = (this.dimensions[1] - this.obj.offsetHeight) * 0.382;
        } else {
            _top = parseFloat(this.getScrollTop() + (document.documentElement.clientHeight - this.obj.offsetHeight)) * 0.382;
        }
        return _top < 0 ? 0 : _top;
    },
    getScrollTop: function () {
        var scroll_top = 0;
        if (document.documentElement && document.documentElement.scrollTop) {
            scroll_top = document.documentElement.scrollTop;
        }
        else if (document.body) {
            scroll_top = document.body.scrollTop;
        }
        return scroll_top;
    },
    onmousedown: function (ev) {
		o = (document.getElementById(this.obj.id));
		var t = o;
		var mxy = this.getMouseP(ev);
        var by = { x: mxy.x - (t.offsetLeft), y: mxy.y - (t.offsetTop) };
        var that = this;
		document.body.onmousemove = function(ev){
			var mxyz = that.getMouseP(ev);
			t.style.left = mxyz.x - by.x + "px";
			t.style.top = mxyz.y - by.y + "px";
		};
		document.body.onmouseup = function(){
			this.onmousemove = null;
		}
    },
    getMouseP: function (e){
			e = e || window.event;
			var m=(e.pageX || e.pageY)?{ x:e.pageX, y:e.pageY } : { x:e.clientX + document.body.scrollLeft - document.body.clientLeft, y:e.clientY + document.body.scrollTop  - document.body.clientTop };
			return m;
    },
    calcDimensions: function () {
        if (window.innerWidth){
            winWidth = window.innerWidth;
        }else if ((document.body) && (document.body.clientWidth)){
            winWidth = document.body.clientWidth;
        }
            
        if (window.innerHeight){
            winHeight = window.innerHeight;
        } else if ((document.body) && (document.body.clientHeight)){
            winHeight = document.body.clientHeight;
        }
            
        if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientWidth) {
            winHeight = document.documentElement.clientHeight;
            winWidth = document.documentElement.clientWidth;
        }
        s = [winWidth, winHeight];
        return s;
    },
}

注意,以上封装代码,里面有三个斜杠(///),其实是七个(///)CSDN的编辑器总是把7个变成3个。请自行修改。如果不会修改请看最后面的下载地址下载使用。

调用方法:

第一步:把封装代码保存为js文件,然后在html中引用。

开始

小试牛刀式调用:

var win = new showWindow().show()

但是这样调用似乎没什么鸟用。所以:

基本调用在show的方法中传递参数。show方法有一个参数,它必须是一个json对象,像下面这样:

var win = new showWindow().show({
    title: '我是标题',
    content: '这里是内容部分'
})

基本调用只需要传递标题和内容即可。效果如下(标题是黑色的):

title和content参数均可以传递html代码。我想这样已经满足了大多数人的需求。

除了基本调用,还可以传递下面的扩展参数,以满足某些人变态的需求:

 width:指定弹窗的宽度。取值可以为 800、 "800"、"800px"、"50%"  这些类型。在移动环境下,指定此值无效。此值始终为100%。默认为500px

top:该值为弹窗距离顶部距离的微调参数。默认情况下,顶部距离为黄金分割点。如果内容过高,弹窗距离顶部的距离将变为0。而在某些环境下,例如layui,它有一个头部,这个头部会遮住距离顶部为0的弹窗,在这个情况下,可以传递top这个值让弹窗往下一些。取值必须为数字。默认为0

left: 该值为弹窗距离左边距离的微调参数。取值必须为数字。默认为0

 scroll:弹窗是否跟随滚动条一块滚动。取值可以为:true、false。若为false,弹窗始终停留在最初弹出的位置不动。默认为false

 zindex:层级。即css里的z-index

 border:取值为css代码。用来渲染弹窗的边框样式。例如上面效果图的取值为:'15px solid gold; border-image: linear-gradient(to bottom right, greenyellow, gold) 1;border-radius:10px'     //注意,当使用border-image时,border-radius 无效。

titlecolor:取值为css代码。用来渲染弹窗的标题部分。例如上面效果图的取值为:'background:linear-gradient(to right, #9cdd3a, #f9b30d);color:gold;text-shadow: 5px 1px 5px rgba(192, 100, 181, 0.8);'

titlebottomboder:取值为css代码。 用来渲染弹窗标题下面的边框。例如上面效果图的取值为:'2px solid greenyellow;border-image: linear-gradient(to right, yellow, coral) 1;'

 scrollcolor:取值为css代码。用来渲染弹窗标题右测滚动按钮的文字颜色。例如:'#f00' 或者 'red'

scrolltext:取值为任意文本。用来显示滚动按钮的文字内容。例如:'滚动' 

bodycolor:取值为css代码。用来渲染弹窗正文区域背景及文字颜色。例如上面效果图的取值为:'color:#f00;background:linear-gradient(315deg, #f9b30d,#9cdd3a);'

 以上参数均为小写,并且都可以忽略不传递。

如果不传递以上参数,系统会使用默认值。以上参数的默认值,最终效果即为效果图左边的图的样子。

如果传递以上某些参数,直接在content参数后面往下写就行了。例如:

var win = new showWindow().show({
    title: '标题',
    content: '内容',
    width: "800",       // 也可以用百分比,例如: '35%'
    top: 0,         //对顶部距离的微调
    left: 0,         //对左边距离的微调
    scroll: false,      //是否跟随滚动条的滚动
    zindex: 1000000,     //层级
    border: '15px solid gold; border-image: linear-gradient(to bottom right, greenyellow, gold) 1;border-radius:10px',     //边框
    scrollcolor:'red',
    scrolltext:'滚动',
    bodycolor:'color:#f00;background:linear-gradient(315deg, #f9b30d,#9cdd3a);'
})

关闭弹窗,可以调用对象的 close() 方法。例如上面的代码,我们可以这样关闭:win.close()

不同的弹窗的对象名不同,关闭不同的弹窗要调用不同对象名的close方法。例如

var win1 = new showWindow().show({
    title: '标题',
    content: '内容'
})
var win2 = new showWindow().show({
    title: '标题',
    content: '内容'
})

console.log(win1.obj);    //win1.obj可以取到弹窗dom元素

win1.close();
win2.close();

虽然字不少,其实非常简单。扩展参数无非是传递一些css来改变弹窗的外观。

由于CSDN编辑器自动修改了封装代码,导致可能无法显示关闭按钮,所以我把封装代码上传到了资源中心,如果不会自己修改(上面红色字的三个斜杠改七个斜杠),那就下载资源吧。下载地址:

https://download.csdn.net/download/superfans98/88239745

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/910756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NER(命名实体识别)的介绍与使用--附源码

概述 本文将向您简要介绍命名实体识别,这是一种用于识别文本文档中存在的实体的流行方法。本文针对 NLP 领域的初学者。在本文末尾,已经实现了预训练的 NER 模型来展示实际用例。 为什么是NER? 图1 通过观察上

排序算法之详解选择排序

引入 选择排序顾名思义是需要进行选择的&#xff0c;那么就要问题了&#xff0c;选择到底是选择什么呢?选择排序的选择是选择数组中未排序的数组中最小的值&#xff0c;将被选择的元素放在未排序数组的首位 如果你对 ‘未排序数组’ &#xff0c; ‘选择’ 的概念不理解&#…

C++中机器人应用程序的行为树(ROS2)

马库斯布赫霍尔茨 一、说明 以下文章为您提供了对机器人应用程序或框架中经常使用的行为树的一般直觉&#xff1a;ROS&#xff0c;Moveit和NAV2。了解行为 Tress &#xff08;BT&#xff09; 框架的原理为您提供了在游戏领域应用知识的绝佳机会。BT可以与Unity或Unreal集成。 由…

淘宝有哪些值得抓取的数据?通过API可以获取到哪些数据?

淘宝是中国最大的在线购物平台&#xff0c;有丰富的数据可供抓取。以下是一些值得抓取的数据以及通过API可以获取到的数据&#xff1a; 1. 商品信息&#xff1a;包括商品标题、价格、销量、评价等。 2. 店铺信息&#xff1a;包括店铺名称、店铺信用、开店时间等。 3. 物流信…

java测试抽红包接口概率《搬代码》

1.首先我们进行抽红包概率测试的时候&#xff0c;为了测试抽取红包的概率完全正确。个人建议不使用线程池多线程执行&#xff0c;建议直接使用for循环执行 2.我们调取抽红包接口返回的信息值进行判断 3.下面就是判断代码&#xff0c;然后是抽红包接口代码 Test public static …

探索智能文字识别:技术、应用与发展前景

探索智能文字识别&#xff1a;技术、应用与发展前景 前言一张图全览大赛作品解读随心记你不对我对小结 智能文字识别体系化解读图像预处理文字定位和分割文字区域识别图像校正字体识别和匹配结果后处理小结 如何应对复杂场景下挑战复杂场景应对方法小结 人才时代对人才要求合合…

源代码审计对企业有哪些好处?

源代码扫描 源代码扫描&#xff0c;对应用程序进行静态漏洞扫描&#xff0c;分析源代码中存在的安全风险&#xff0c;运行应用于模拟器中对应用进行实时漏洞攻击检测。 你是否了解源代码扫描对企业的好处&#xff1f; 一、源代码扫描&#xff0c;通常能够帮助企业解决这些问题…

docker 01(初识docker)

一、docker概念 Docker是一个开源的应用容器引擎&#xff1b;诞生于2013年初&#xff0c;基于Go 语言实现&#xff0c;dotCloud公司出品(后改名为Dockerlnc);Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux …

KCC@杭州-在初秋,来一场智力与体能的比拼

本次主题&#xff1a; 开源知识问答桌游/运动&#xff08;一场智力与体力的比拼&#xff09; KCC杭州活动又来啦&#xff01; 在这个如火的八月&#xff0c;我们将要开启KCC杭州的一场特色开源活动。 为了让活动更加有趣味&#xff0c;更加具有互动性&#xff0c;我们将采用知识…

QTreeWidget和QTreeWidgetItem

QTreeWidget介绍 QTreeWidget 是一个用于显示层次结构数据的 Qt 控件&#xff0c;它以树状结构的形式展示项目和子项。每个项目都可以包含子项&#xff0c;并且可以通过展开和折叠来浏览整个树。 QTreeWidget类是一个方便的类&#xff0c;它提供了一个带有经典基于项目的界面…

AI极客日报0822 - AI创作是否应该有版权?

&#x1f440;AI 日报合集 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 人工智能系统依法享有版权吗&#xff1f;这位法官给出了肯定的答案。让我们开始吧。 今日看点&#xff1a; 一位联邦法官明确表示&#xff0c;AI创作的艺术品没有版权&#xff01;中国&#xff0c…

WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集

野火 ATGM332D简介 高性能、低功耗 GPS、北斗双模定位模块 STM32 GPS定位_为了维护世界和平_的博客-CSDN博客 秉火多功能调试助手上位机开源&#xff01;共六款软件&#xff0c;学到你吐... , - 电脑上位机 - 野火电子论坛 - Powered by Discuz! https://www.firebbs.cn/for…

静态代码扫描工具 Sonar 配置及使用

概览 Sonar 是一个用于代码质量管理的开放平台。通过插件机制&#xff0c;Sonar 可以集成不同的测试工具&#xff0c;代码分析工具&#xff0c;以及持续集成工具。与持续集成工具&#xff08;例如 Hudson/Jenkins 等&#xff09;不同&#xff0c;Sonar 并不是简单地把不同的代…

定向流量卡怎么没人买了呢?你知道定向流量卡有多坑吗?

在购买流量卡的时候大家可能都注意了&#xff0c;市面上的流量卡有三种&#xff0c;定向流量卡&#xff0c;通用流量卡&#xff0c;通用流量定向流量卡&#xff0c;据小编了解&#xff0c;现在越来越多的人比较喜欢购买后两者&#xff0c;而关注定向流量卡越来越少了。 其实用过…

中国移动秋招攻略,网申测评和面试

中国移动秋招简介 按照往年的惯例来看&#xff0c;移动会在每年的8月份发布相关秋招信息&#xff0c;紧接着考生并进行网申&#xff0c;面试的时间跨度也非常的长&#xff0c;大概是9~12月份。整个招聘流程&#xff0c;包括投递简历网申&#xff0c;笔试测评&#xff0c;面试录…

SQL Server、MySQL和Oracle数据库分页查询的区别与联系

摘要&#xff1a;本文将通过一个现实例子&#xff0c;详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例&#xff0c;并解释每个数据库的分页查询用法以及优化方法&#xff0c;帮助读者更好地选择适合自…

大白话聊聊Innodb的锁机制

大白话聊聊Innodb的锁机制 引言理清 "锁" 类型锁锁的类型非锁定读(MVCC)锁定读用来保护 "自增长计数器" 的锁外键和锁 加锁算法精确匹配查询如何关闭Gap Lock小结 幻读问题小结 锁问题脏读不可重复读丢失更新 阻塞死锁死锁发生概率死锁案例 锁升级小结 引言…

go 微服务 consul

服务发现 在微服务中每一个服务都有一个ip端口&#xff0c;如果由客户端来之间进行连接会不方便&#xff0c;因此服务将自己的ip端口提交给服务发现&#xff08;常见的有consul,etcd&#xff0c;nacos&#xff09;,客户端通过服务发现来获取服务的ip端口 consul 去下载&…

Serialize对象二进制序列化与反序列化存储参数代替ini文件

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在C#中&#xff0c;可以使用System.Runtime.Serialization命名空间中的类来进行序列化操作。 以下是在C#中使用序列化的基本步骤&#xff1a; 创建一个可序列化的类&#xff0c;并标记该类和需要序列化的属性或字段…

deeplabv3+源码之慢慢解析26 第五章utils文件夹(1)ext_transforms.py--2个翻转类和ExtCompose类

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之慢…