做一个简单的遮罩层

首先,我们写一个遮罩层,没错就是那种

页面有一个按钮,点击按钮遮罩层出现,遮罩层上面的按钮也出现 ,

点击遮罩层上面的按钮,遮罩层隐藏,遮罩层上的按钮也隐藏

先来看看页面html代码

<style>
	* {margin: 0;padding: 0;}
	html,body {width: 100%;}
	.mask {position: fixed;left: 0;top: 0;z-index: 1;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.5);	}
	.btn2 { position: fixed;left: 100px;top: 100px;z-index: 2;border: 1px solid blue;padding: 20px;background-color: palegreen;}
	.btn1 {border: 1px solid blue;padding: 20px;background-color: orange;}
</style>
<div class="btn1" id="btn1">点击我打开遮罩层</div>

然后是js部分,这是一开始我们写js的普通写法

var btn1 = document.getElementById("btn1");
btn1.onclick = function(){
	var mask = document.createElement("div");
	mask.id = "mask";
	mask.className = "mask";
	document.body.appendChild(mask);

	var btn2 = document.createElement("div");
	btn2.id = "btn2";
	btn2.className = "btn2"
	btn2.innerHTML = "点击我关闭遮罩层";
	btn2.onclick = function(){
		this.parentNode.removeChild(mask);
		this.parentNode.removeChild(this);
	}
	document.body.appendChild(btn2);
}

这种写法其实是面向过程的写法,优点是写法灵活,对于初学者来说比较易读。但是缺点也很明显,假如我们要增加新的东西,容易对前面的代码造成影响,有些可复用的东西其实可以封装个方法来调用,这样可以减少代码的冗余,那么我们在优化一下就变成了下面那样

var doc = document;
var body = doc.body;
var btn1 = getId("btn1");

btn1.onclick = function() {
	var mask = createEle(‘div‘);
	setAttr(mask, {
		"id": "mask",
		"class": "mask"
	});
	body.appendChild(mask);

	var btn2 = createEle(‘div‘);
	setAttr(btn2, {
		"id": "btn2",
		"class": "btn2",
	});
	btn2.innerHTML = ‘点击我关闭遮罩层‘;
	btn2.onclick = function() {
		removeSiblingEle(this, mask);
		removeSiblingEle(this, this);
	}
	body.appendChild(btn2)
}

function getId(n) {
	return doc.getElementById(n);
}

function removeSiblingEle(m, n) {
	m.parentNode.removeChild(n)
}

function createEle(n) {
	return doc.createElement(n);
}
//遍历属性穿插进去
function setAttr(self, attr) {
	for(var i in attr) {
		self.setAttribute(i, attr[i])
	}
}

可以看到我们做了些代码的优化,但是,我们还有个问题,就是全局变量的污染,而且以一个组件的角度而言,感觉方法之间没什么联系,那么我们使用面向对象的方法再将他进行优化一下,

//创建一个构造函数
function MaskFn(){
	this.doc = document;
	this.body = this.doc.body;
	this.getId = function(n){
		return this.doc.getElementById(n)
	}
}
//用prototype进行扩展
MaskFn.prototype = {
	init:function(){
		var _self = this;
		var btn1 = _self.getId("btn1");
		btn1.onclick = function(){
			_self.clickFn();
		}
	},
	createDom:function(n){
		var _self = this;
		return _self.doc.createElement(n);
	},
	setAttr:function(param,attrs){
		var _self = this;
		var i;
		for(i in attrs){
			param.setAttribute(i,attrs[i]);
		}
	},
	removeDom:function(param1,param2){
		var _self = this;
		param1.parentNode.removeChild(param2);
	},
	clickFn:function(){
		var _self = this;
		var mask = _self.createDom("div");
		_self.setAttr(mask, {
			"id": "mask",
			"class": "mask",
		});
		_self.body.appendChild(mask);
		var btn2 = _self.createDom("div");
		_self.setAttr(btn2,{
			"id":"btn2",
			"class":"btn2"
		})
		btn2.innerHTML = "点击我关闭遮罩层";

		btn2.onclick = function(){
			_self.removeDom(this,mask);
			_self.removeDom(this,this);
		}
		_self.body.appendChild(btn2)
	}
}
//实例构造函数
new MaskFn().init();

好了,大概就优化到这里了,要看到实例的效果,你可以狠狠的点击这里,查看例子

时间: 2024-08-09 19:26:06

做一个简单的遮罩层的相关文章

一个简单的遮罩层

比较简单,实用 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> <style> * { padd

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操

[3] 用D3.js做一个简单的图表吧!

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为可缩放矢量图形(Scalable Vector Graphics),SVG 使用 XML 格式定义图像,不清楚什么是SVG的朋友请先在 w3cschools 学习下

用EF DataBase First做一个简单的MVC3报名页面

使用EF DataBase First做一个简单的MVC3报名网站 ORM(Object Relational Mapping)是面向对象语言中的一种数据访问技术,在ASP.NET中,可以通过ADO.NET Entity Framework技术来简化数据访问.在EF里,有Code First,Model First和DataBase First三种方法来实现. 百度百科关于ORM的介绍: http://baike.baidu.com/view/197951.htm?fr=aladdin 1.就像

【Python】 做一个简单的 http 服务器

# coding=utf-8 ''' Created on 2014年6月15日 @author: Yang ''' import socket import datetime # 初始化socket s = socket.socket() # 获取主机名, 也可以使用localhost # host = socket.gethostname() host = "localhost" # 默认的http协议端口号 port = 80 # 绑定服务器socket的ip和端口号 s.bin

Jmeter初步使用二--使用jmeter做一个简单的性能测试

经过上一次的初步使用,我们懂得了Jmeter的安装与初步使用的方法.现在,我们使用Jmeter做一个简单的性能测试.该次测试,提交的参数不做参数化处理,Jmeter各元件使用将在介绍在下一博文开始介绍并使用. 首先,打开Jmeter工具,并建立一个测试计划(测试脚本).启动jmeter后,jmeter会自动生成一个空的测试计划,我们可以基于该测试计划建立自己的测试计划. 步骤: 步骤一:添加线程组 一个性能测试请求负载是基于一个线程组完成的.一个测试计划必须有一个线程组.测试计划添加线程组非常简

使用React并做一个简单的to-do-list

1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其visual-dom的这种技术创新,也算是早就有了初步了解.一来没有学的太深入,二来后来在工作中和业余项目中都没有用到,因此慢慢的就更加生疏了. 近期,因为我想把自己的开源项目wangEditor能放在React.angular和vuejs中使用.先从react开始,顺手自己也重试一下React的基础知识,顺便再做一个小d

【 D3.js 入门系列 — 3 】 做一个简单的图表!

图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 . SVG ,即可缩放矢量图形(Scalable Vector Graphics),使用 XML 格式定义图形,可在 W3School 学习 SVG 的相关语法,不需要记住所有标签,用的时候再查即可. 先看下面的代码: <script src="http://d3js.org/d3.v3.mi

【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看[demo],扫描后点击屏幕有惊喜哦… 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单的引擎里需要有三种元素:世界(World).发射器(Launcher).粒子(Grain).总得来说就是:发射器存在于世界之中,