css自学框架之消息弹框

news2024/11/25 23:35:58

首先我们还是看看消息弹框效果:
请添加图片描述
主要实现代码分为三部分

一、CSS部分,这部分主要是定义样式,也就是我们看到的外表,主要代码:

/* - 弹窗 */
		notice{top: 0;left: 0;right: 0;z-index: 10;padding: 1em;position: fixed;user-select: none;pointer-events: none;}		
		.myth-notice{color: var(--white);display: table;background: #333;border-radius: 3em;pointer-events: auto;margin: 0 auto 1em auto;box-shadow: 0 5px 5px -2px rgba(0, 0, 0, .2);animation: fade-small-large .3s both;-webkit-animation: fade-small-large .3s both;}		
		.myth-notice.remove{
		    animation: fade-in-top .3s both reverse;
		    -webkit-animation: fade-in-top .3s both reverse;
		}
		
		/* -- 弹窗颜色 */
		.myth-notice.red{
		    color: var(--red-color);
		    background: var(--red);
		}
		
		.myth-notice.yellow{
		    color: var(--yellow-color);
		    background: var(--yellow);
		}
		
		.myth-notice.blue{
		    color: var(--blue-color);
		    background: var(--blue);
		}
		
		.myth-notice.green{
		    color: var(--green-color);
		    background: var(--green);
		}
		
		.myth-notice > span{
		    padding: .5em 1em;
		    display: table-cell;
		    vertical-align: middle;
		}
		
		.myth-notice .close{
		    cursor: pointer;
		    border-radius: 0 1em 1em 0;
		    transition: background .3s;
		}
		
		.myth-notice .close:hover{
		    background: rgba(0, 0, 0, .1);
		}
		
		.myth-notice .close:after{
		    content: '×';
		    font: inherit;
		}

二、JavaScript部分,这部分我们主要实现单击按钮显示根据不同输入,显示不同消息弹框,功能包括自动关闭消息弹框和手动关闭消息弹框;样式包括红色、黄色、蓝色、绿色和黑色五种消息弹框,代码如下:

; //JavaScript 弱语法的特点,如果前面刚好有个函数没有以";"结尾,那么可能会有语法错误
var myth = (function(selector) {
	'use strict';
	Array.prototype.remove = function(val) {
	    var index = this.indexOf(val);
	    if (index > -1) {
	        this.splice(index, 1);
	    }
	};
	
	var _myth = function(selector) {
		//如果默认参数不设置,自动赋值document
		if (!selector) {
			selector = document;
		}
		//获取selector数据类型,代码后面序号1有详细用法解释
		var selectorType = typeof(selector);
		//根据selector数据类型,进行同操作,代码后面序号2有详细用法解释
		switch (selectorType) {
			case 'string': //如果是字符串类型,使用querySelectorAll获取selector对象,结果记录到reObj内
				var doms = document.querySelectorAll(selector); //通过该方法查找HMTL中select对象,代码后面序号2有详细用法解释
				//reObj是个数据对象,目前设置了两个属性:dom是Javascript数据对象,length表示doms对象数量
				var reObj = {
					dom: doms,
					length: doms.length
				};
				break;
			case 'object': //如果是object类型,结果直接记录到reObj内
				var reObj = {
					dom: [selector],
					length: 1
				};
				break;
			default: //除了上述两种类型外,其它返回null对象
				return null;
		}
		reObj.__proto__ = mythExtends;
		//__proto__:表示一个对象拥有的内置属性,是JS内部使用寻找原型链的属性。可以理解为它是一个指针,用于指向创建它的函数对象的原型对象prototype(即构造函数的prototype),简单理解为“为reObj添加了一些扩展属性,myth(selector)选择对象后,可以进一步执行mythExtends中的方法。
		return reObj;
	};
	//myth(selector)对象的扩展方法
	var mythExtends = {		
		create:function(tag,prop){
			var obj=document.createElement(tag)
			//alert(prop)
			if (prop) {
				if(prop.id)    obj.id = prop.id;
				if(prop.src)   obj.src = prop.src;
				if(prop.href)  obj.href = prop.href;
				if(prop.class) obj.className = prop.class;
				if(prop.text)  obj.innerText = prop.text;
				if(prop.html)  obj.innerHTML = prop.html;
				if(prop.parent) prop.parent.appendChild(obj);;
			}
			return obj;
		},
		showInfo:function(content, attr){
			if(!document.querySelector("body > notice"))
			{
				this.create('notice',{parent:document.body});
			}
			var item = this.create("div", {class: "myth-notice", html: "<span class='content'>" + content + "</span>",parent:document.querySelector("body > notice")});
			if(attr && attr.color){
			    item.classList.add(attr.color);
			}
			if(attr && attr.time){
				setTimeout(this.notice_remove.bind(null,item), attr.time)
			}
			else{				
			    var close = this.create("span", {class: "close", parent: item});
				var that = this;
				close.onclick = function(e){
					that.notice_remove(item);
				}
			}
		},
		notice_remove:function(item){
			item.classList.add("remove");
			if(document.querySelector("body > notice"))
			{
				item.remove()
			}
		},
		infoTip:function(content, attr){
			var that = this;
			this.click(function(){
				that.showInfo(content,attr);
			});
		},
		/* dom 元素遍历 */
		each: function(callBack) {
			if (!callBack) {
				return;
			}
			for (var i = 0; i < this.length; i++) {
				this.dom[i].index = i;
				callBack(this.dom[i]); //返回每一个dom对象
			}
		},
		// 设置或读取html
		html: function(html) {
			if (this.length < 1) {
				return this;
			}
			//设置HTML
			if (typeof(html) != 'undefined') {
				for (var i = 0; i < this.length; i++) {
					this.dom[i].innerHTML = html;
				}
				return this;
			}
			//读取HTML
			try {
				return this.dom[0].innerHTML;
			} catch (e) {
				return null;
			}
		},
		/*读取或设置属性开始*/
		attr: function(attrName, val) {
			if (val) {
				this.setAttr(attrName, val);
			} else {
				return this.getAttr(attrName);
			}
		},
		getAttr: function(attrName) {
			try {
				return this.dom[0].getAttribute(attrName);
			} catch (e) {
				console.log(_lang.domEmpty);
				return null;
			}
		},
		setAttr: function(attrName, val) {
			for (var i = 0; i < this.length; i++) {
				this.dom[i].setAttribute(attrName, val);
			}
			return this;
		},
		/*读取或设置属性结束*/
		/* 样式操作开始 */
		css: function(csses) {
			for (var i = 0; i < this.length; i++) {
				var styles = this.dom[i].style;
				for (var k in csses) {
					styles[k] = csses[k];
				}
			}
			return this;
		},
		hasClass: function(cls) {
			if (this.length != 1) {
				return false;
			}
			return this.dom[0].className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
		},
		addClass: function(cls) {
			for (var i = 0; i < this.length; i++) {
				if (!this.dom[i].className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))) {
					this.dom[i].className += " " + cls;
				}
			}
			return this;
		},
		removeClass: function(cls) {
			var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
			for (var i = 0; i < this.length; i++) {
				this.dom[i].className = this.dom[i].className.replace(reg, ' ');
			}
			return this;
		},
		/* 样式操作结束 */
		// 隐藏元素。isAnimate为真,动画方式隐藏元素
		hide: function(isAnimate) {
			for (var i = 0; i < this.length; i++) {
				if (isAnimate) {
					var ctdom = myth(this.dom[i]);
					ctdom.addClass('myth-fade-out');
					setTimeout(function() {
						ctdom.dom[0].style.display = 'none';
						ctdom.removeClass('myth-fade-out');
					}, 300);
				} else {
					this.dom[i].style.display = 'none';
				}
			}
			return this;
		},
		// 显示元素 isAnimate为真,动画方式显示元素
		show: function(isAnimate) {
			for (var i = 0; i < this.length; i++) {
				if (isAnimate) {
					var ctdom = _myth(this.dom[i]);
					ctdom.addClass('myth-fade-in');
					setTimeout(function() {
						ctdom.dom[0].style.display = 'block';
						ctdom.removeClass('myth-fade-in');
					}, 300);
				} else {
					this.dom[i].style.display = 'block';
				}
			}
			return this;
		},
		// 单击事件
		click: function(callBack) {
			for (var i = 0; i < this.length; i++) {
				if (callBack == undefined) {
					_myth(this.dom[i]).trigger('click');
				}
				this.dom[i].addEventListener('click', callBack);
			}
		},
		setWidth: function(swidth) { //设置myth(selector)对象宽度
			this.dom[0].style.width = swidth;
		},
		getWidth: function() { //获取myth(selector)对象宽度
			return this.dom[0].offsetWidth;
		},
		setHeight: function(sheight) { //设置myth(selector)对象高度
			this.dom[0].style.height = sheight;
		},
		getHeight: function() { //获取myth(selector)对象高度
			return this.dom[0].offsetHeight;
		},
		appendChild:function(aobject){
			this.dom[0].appendChild(aobject);
		},
		config:function(opts, options) {
		    //默认参数
		    if (!opts) return options;
		    for (var key in opts) {
		      if (!!opts[key]) {
		        options[key] = opts[key];
		      }
		    }
		    return options;
		}
	}
	_myth.version = 'myth 1.0'; //设置版本
	return _myth;
})(document);

三、HTML部分,该部分就是如何使用第一、二部分的代码。

一是引入CSS代码,引入JavaScript代码。

<link rel="stylesheet" href="css/myth.css">
<script src="js/myth.js"></script>

二是THML展示代码

<div class="mythBox mid">
		<br/>
		手动关闭的提示信息:<button class="btn red" id="infoTrip1">红色信息提示</button>
		<button class="btn blue" id="infoTrip2">红色信息提示</button>
		<button class="btn green" id="infoTrip3">红色信息提示</button>
		<button class="btn yellow" id="infoTrip4">红色信息提示</button>
		<button class="btn " id="infoTrip5">默认消息提示</button>
		<br/><br/>
		自动关闭的提示信息:<button class="btn blue" id="infoTrip6">自动关闭信息提示</button>
	</div>

三是JavaScript调用代码。

<script type="text/javascript">
			myth('#infoTrip1').infoTip('数据加载完毕....',{color:'red'});
			myth('#infoTrip2').infoTip('数据加载完毕....',{color:'blue'});
			myth('#infoTrip3').infoTip('数据加载完毕....',{color:'green'});
			myth('#infoTrip4').infoTip('数据加载完毕....',{color:'yellow'});
			myth('#infoTrip5').infoTip('数据加载完毕....');
			myth('#infoTrip6').infoTip('数据加载完毕....',{color:'blue',time:3000});
</script>

ok,这样就完成了。
源代码下载:请单击

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

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

相关文章

【Docker】01-Centos安装、简单使用

参考教程&#xff1a; https://www.bilibili.com/video/BV1Qa4y1t7YH/?p5&spm_id_frompageDriver&vd_source4964ba5015a16eb57d0ac13401b0fe77 什么是Docker&#xff1f; Docker是一种开源的容器化平台&#xff0c;用于构建、打包、部署和运行应用程序。它通过使用容…

MybatisPlus插件篇—逻辑删除+p6spy

文章目录 一、前言二、插件1、逻辑删除1.1、官方说明&#xff1a;1.2、配置依赖1.3、配置全局配置1.4、实体类字段上添加TableLogic注解1.5、验证是否成功 2、执行SQL分析打印2.1、配置依赖2.2、数据库驱动配置2.3、spy配置文件配置2.4、注意事项 三、总结提升 一、前言 本文将…

DOM破坏绕过XSSfilter例题

目录 一、什么是DOM破坏 二、例题1 三、多层关系 1.Collection集合方式 2.标签关系 3.三层标签如何获取 四、例题2 五、例题3 1.代码审计 2.payload分析 一、什么是DOM破坏 DOM破坏&#xff08;DOM Clobbering&#xff09;指的是对网页上的DOM结构进行不当的修改&am…

微信小程序请求接口返回的二维码(图片),本地工具和真机测试都能显示,上线之后不显示问题

请求后端接口返回的图片&#xff1a; 页面展示&#xff1a; 代码实现&#xff1a; :show-menu-by-longpress"true" 是长按保存图片 base64Code 是转为base64的地址 <image class"code" :src"base64Code" alt"" :show-menu-by-long…

Linux通信--构建进程通信System-V 消息队列|信号量

文章目录 目录 一、消息队列 二、信号量 1.互斥 2.信号量 一、消息队列 消息队列提供了从一个进程向另一个进程发送数据块的方法每个数据块都被认为是有一个类型&#xff0c;接收者进程接收的数据块可以有不同的类型值IPC资源必须删除&#xff0c;不会随进程自动清楚&#…

软件系统测试的类型和方法有哪些?

在软件开发过程中&#xff0c;系统测试是至关重要的一步&#xff0c;它可以帮助客户确保软件系统的质量和稳定性。本文将从多个角度出发&#xff0c;详细描述软件系统测试的类型和方法。 一、软件系统测试的类型 1、静态测试&#xff1a;在软件开发的早期阶段&#xff0c;通过…

Apollo配置中心介绍

更多内容参看官网文档&#xff1a;https://www.apolloconfig.com/#/zh/README 架构设计 Config Service和Admin Service都是多实例、无状态部署&#xff0c;所以需要将自己注册到Eureka中并保持心跳在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口Client通过…

Python基础算法——反转链表

视频详解&#xff1a;https://www.bilibili.com/video/BV1sd4y1x7KN/?spm_id_from333.788&vd_source11069f01f7471094186b646e3a184ca3 一、反转链表 LeetCode 206题&#xff1a;https://leetcode.cn/problems/reverse-linked-list/description/ 给你单链表的头节点 h…

lab11 net

background 在开始写代码之前&#xff0c;回顾一下xv6book的第五章会有帮助你将使用E1000去处理网络通信 E1000会和qemu模拟的lan通信在qemu模拟的lan中 xv6的地址是10.0.2.15qemu模拟的计算机的地址是10.0.2.2 qemu会将所有的网络包都记录在packets.pcap中文件kernel/e1000.…

【CSS左右上角斜标签】CSS实现左右上角飘带功能,左右上角斜标签(附源码)

文章目录 写在前面涉及知识点实现效果1、实现过程1.1左上角飘带Html代码Css代码效果 1.2右上角飘带Html代码Css代码效果 2、源码分享2.1 百度网盘2.2 123网盘2.3 邮箱留言 总结 写在前面 其实在公司页面开发过程就遇到过&#xff0c;需要在方块右上角展示一个斜的文字或者告警…

gitee上传本地项目bug

&#x1f92e;这个破bug不知道浪费了多长时间&#xff0c;以前没有记录&#xff0c;每次都忘记&#xff0c;这次记下来 问题描述 gitee创建仓库&#xff0c;然后根据它提示的如下命令&#xff0c;但一直报错 原因分析&#xff1a; 把命令复制出来&#xff0c;粘贴到Sublime …

印尼语翻译,如何提升翻译质量

据了解&#xff0c;印尼是东南亚地区的重要国家&#xff0c;与中国有着密切的经济联系。随着中印两国经贸合作的日益加深&#xff0c;印尼语翻译需求也越来越大。那么&#xff0c;印尼语翻译有什么特点&#xff0c;如何提升印尼语翻译质量&#xff1f; 业内人士指出&#xff0c…

百度百科词条怎么更新?怎么能顺利更新百科词条?

企业和个人百度百科词条的更新对于他们来说都具有重要的意义&#xff0c;具体如下&#xff1a; 对企业来说&#xff1a; 塑造品牌形象&#xff1a;百度百科是一个常被用户信任并参考的知识平台&#xff0c;通过更新企业词条可以提供准确、全面的企业信息&#xff0c;帮助企业塑…

8种最常用的3D CAD中性格式

CAD&#xff08;计算机辅助设计&#xff09;文件是包含物理对象 3D 和 2D 模型的数字文件。 CAD 文件可以包含几何数据、制造数据、材料属性和其他产品/过程数据等信息。 从设计到生产&#xff0c;一切都从 CAD 文件开始。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场…

vue项目中使用开源Vditor

Vditor 是一款所见即所得编辑器&#xff0c;支持 Markdown。 支持多种前端框架 这里介绍在vue中使用包括编辑所见即所得模式&#xff0c;以及仅仅预览展示 更多细节和用法请参考 Vditor - 浏览器端的 Markdown 编辑器&#xff0c;谢谢 ❤️ 所见即所得&#xff08;编辑预览状…

Windows安装6s模型

官网给出了详细的安装步骤 第一步&#xff1a;安装编译器 安装GnuWin32&#xff0c;按照提示安装&#xff0c;安装到你想安装的地方&#xff0c;记住目录。 安装G77&#xff0c;下载链接里面的Fort99.zip&#xff0c;将G77文件夹提取到C盘根目录。 将这两个目录的bin目录添加…

低代码/无代码平台:加速应用开发的工具

在数字化时代&#xff0c;软件应用已经成为企业和组织不可或缺的一部分。然而&#xff0c;传统的应用开发过程往往需要大量的时间、资源和专业知识。为了解决这个问题&#xff0c;低代码/无代码平台应运而生&#xff0c;它们为开发者提供了一种更快速、更简便的应用开发方式。本…

Spring Security注销后未正确保存空的SecurityContext漏洞CVE-2023-20862

文章目录 0.前言漏洞Spring Security介绍 1.参考文档2.基础介绍3.解决方案3.1. 升级版本3.2. 临时替代方案 4.Spring Security使用教程简单代码示例 0.前言 背景&#xff1a;公司项目扫描到 Spring-security 组件 注销后未正确保存空的SecurityContext CVE-2023-20862 漏洞 高…

基于 Docker 的 MySQL 主从复制搭建(Mac M1版本)

系统&#xff1a;Macbook M1 镜像版本&#xff1a;mysql:5.7 如果是要查 slave连接不上 master的问题&#xff0c;可以直接跳到文章末尾踩坑处 准备工作 拉取镜像 docker pull mysql:5.7本地数据卷挂载 因为mysql不挂载的话&#xff0c;重启丢失数据&#xff0c;所以在本地创…

低价监测的必要性

当品牌线上数据变多时&#xff0c;监测工作就变得非常重要了&#xff0c;品牌的线上监测工作&#xff0c;一般是围绕价格进行的&#xff0c;监测价格有无低价&#xff0c;也是看渠道是否健康的一种体现&#xff0c;当品牌线上渠道存在很多低价链接时&#xff0c;品牌要及时的进…