jQuery遮罩层插件

原创 2015年07月07日 17:42:59

在网页上经常遇到需要等待很久的操作,比如导出报表等。为了预防用户点击其他操作或者多次点击同个功能,需要用遮罩层把页面或者操作区盖住,防止用户进行下一步操作,同时可以提高界面友好度,让用户知道操作正在执行。

$.fn.extend({
	/**
	 * 给元素添加遮罩层
	 * @param  message  {String}  [可选]遮罩层显示内容
	 */
	mask: function (message) {
		var $target = this,
			fixed = false,
			targetStatic = true;

		if (Object.prototype.toString.call(message) !== '[object String]' || !message) {
			//如果message为空或者不是字符串,则用默认的消息提示。
			message = '请稍候。。。';
		}

		if ($target.length === 0) {
			$target = $('body');
		} else {
			if ($target.length > 1) {
				$target = $target.first();
			}

			if ($target[0] === window || $target[0] === document) {
				$target = $('body');
			}
		}
		
		if($target[0] === document.body){
			fixed = true;
		}

		//如果目标元素已经有遮罩层,获取遮罩层
		var old = $target.data('rhui.mask');
		if (old) {
			old.$content.html(message);
			center($target, old.$content, fixed);
			return;
		}

		//如果被遮盖的元素是static,把元素改成relative
		if ($target.css('position') === 'static') {
			targetStatic = true;
			$target.css('position', 'relative');
		}

		var $content, $overlay;
		if (fixed) {
			$overlay = $('<div class="rhui-mask" style="position:fixed;"></div>');
			$content = $('<div class="rhui-mask-content" style="position:fixed;">' + message + '</div>');
		} else {
			$overlay = $('<div class="rhui-mask"></div>');
			$content = $('<div class="rhui-mask-content">' + message + '</div>');
		}

		$overlay.appendTo($target);
		$content.appendTo($target);

		//显示遮罩层
		$overlay.show();
		$content.show();

		//让遮罩层居中
		center($target, $content, fixed);

		//把遮罩层信息添加到$target
		$target.data('rhui.mask', {
			fixed: fixed,
			$overlay: $overlay,
			$content: $content,
			targetStatic: targetStatic
		});

		/**
		 * 让遮罩层内容居中显示
		 * @param  $target   被遮盖的元素
		 * @param  $content  遮罩层内容元素
		 * @param  fixed     遮罩层是否固定显示
		 */
		function center($target, $content, fixed) {
			var $window,
				height = $content.outerHeight(true),
				width = $content.outerWidth(true);

			if (fixed) {
				//如果遮罩层固定显示,让遮罩层在window居中
				$window = $(window);
				$content.css({
					left: ($window.width() - width) / 2,
					top: ($window.height() - height) / 2
				});
			} else {
				//让遮罩层在$target中居中
				$content.css({
					left: ($target.width() - width) / 2,
					top: ($target.height() - height) / 2
				});
			}
		}
	},

	/**
	 * 取消遮罩层
	 */
	unmask: function () {
		var $target;

		if (this.length === 0) {
			$target = $('body');
		} else {
			$target = this.first();
			if ($target[0] === window || $target[0] === document) {
				$target = $('body');
			}
		}

		var data = $target.data('rhui.mask');
		if (!data) {
			return;
		}

		//还原目标元素的position属性
		if (data.targetStatic) {
			$target.css('position', 'static');
		}

		data.$overlay.remove();
		data.$content.remove();

		$target.removeData('rhui.mask');
	}
});


插件样式由rhui-mask和rhui-mask-content类控制,rhui-mask是遮罩层样式,rhui-mask-content是遮罩层的提示内容样式。

/* 遮罩层样式 */
.rhui-mask {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 9000;
	display: block;
	margin: 0;
	padding: 0;
	border-style: none;
	background-color: #777;
	opacity: 0.3;
	zoom: 1;
	filter: alpha(opacity=30);
}

/* 遮罩层显示内容样式 */
.rhui-mask-content {
	position: absolute;
	z-index: 9999;
	display: block;
	margin: 0;
	padding: 15px 20px;
	border: 2px solid rgb(109, 157, 215);
	background-color: #fff;
	color: blue;
	letter-spacing: 2px;
	font-weight: bold;
	font-size: 15px;
	cursor: wait;
}

效果如图所示


页面调用完整代码

<!DOCTYPE html>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>网页遮罩层的实现</title>
	<style type="text/css">
		/* 遮罩层样式 */		
		.rhui-mask {
			position: absolute;
			top: 0;
			right: 0;
			bottom: 0;
			left: 0;
			z-index: 9000;
			display: block;
			margin: 0;
			padding: 0;
			border-style: none;
			background-color: #777;
			opacity: 0.3;
			zoom: 1;
			filter: alpha(opacity=30);
		}
		
		/* 遮罩层显示内容样式 */		
		.rhui-mask-content {
			position: absolute;
			z-index: 9999;
			display: block;
			margin: 0;
			padding: 15px 20px;
			border: 2px solid rgb(109, 157, 215);
			background-color: #fff;
			color: blue;
			letter-spacing: 2px;
			font-weight: bold;
			font-size: 15px;
			cursor: wait;
		}
	</style>
	<script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.3/jquery.js"></script>
	<script type="text/javascript">
		$.fn.extend({
			/**
			 * 给元素添加遮罩层
			 * @param  message  {String}  [可选]遮罩层显示内容
			 */
			mask: function (message) {
				var $target = this,
					fixed = false,
					targetStatic = true;

				if (Object.prototype.toString.call(message) !== '[object String]' || !message) {
					//如果message为空或者不是字符串,则用默认的消息提示。
					message = '请稍候。。。';
				}

				if ($target.length === 0) {
					$target = $('body');
				} else {
					if ($target.length > 1) {
						$target = $target.first();
					}

					if ($target[0] === window || $target[0] === document) {
						$target = $('body');
					}
				}

				if ($target[0] === document.body) {
					fixed = true;
				}

				//如果目标元素已经有遮罩层,获取遮罩层
				var old = $target.data('rhui.mask');
				if (old) {
					old.$content.html(message);
					center($target, old.$content, fixed);
					return;
				}

				//如果被遮盖的元素是static,把元素改成relative
				if ($target.css('position') === 'static') {
					targetStatic = true;
					$target.css('position', 'relative');
				}

				var $content, $overlay;
				if (fixed) {
					$overlay = $('<div class="rhui-mask" style="position:fixed;"></div>');
					$content = $('<div class="rhui-mask-content" style="position:fixed;">' + message + '</div>');
				} else {
					$overlay = $('<div class="rhui-mask"></div>');
					$content = $('<div class="rhui-mask-content">' + message + '</div>');
				}

				$overlay.appendTo($target);
				$content.appendTo($target);

				//显示遮罩层
				$overlay.show();
				$content.show();

				//让遮罩层居中
				center($target, $content, fixed);

				//把遮罩层信息添加到$target
				$target.data('rhui.mask', {
					fixed: fixed,
					$overlay: $overlay,
					$content: $content,
					targetStatic: targetStatic
				});

				/**
				 * 让遮罩层内容居中显示
				 * @param  $target   被遮盖的元素
				 * @param  $content  遮罩层内容元素
				 * @param  fixed     遮罩层是否固定显示
				 */
				function center($target, $content, fixed) {
					var $window,
						height = $content.outerHeight(true),
						width = $content.outerWidth(true);

					if (fixed) {
						//如果遮罩层固定显示,让遮罩层在window居中
						$window = $(window);
						$content.css({
							left: ($window.width() - width) / 2,
							top: ($window.height() - height) / 2
						});
					} else {
						//让遮罩层在$target中居中
						$content.css({
							left: ($target.width() - width) / 2,
							top: ($target.height() - height) / 2
						});
					}
				}
			},

			/**
			 * 取消遮罩层
			 */
			unmask: function () {
				var $target;

				if (this.length === 0) {
					$target = $('body');
				} else {
					$target = this.first();
					if ($target[0] === window || $target[0] === document) {
						$target = $('body');
					}
				}

				var data = $target.data('rhui.mask');
				if (!data) {
					return;
				}

				//还原目标元素的position属性
				if (data.targetStatic) {
					$target.css('position', 'static');
				}

				data.$overlay.remove();
				data.$content.remove();

				$target.removeData('rhui.mask');
			}
		});
	</script>
</head>

<body>
	<div id="div" style="width:600px;height:300px;margin:10px;border:1px solid red;"></div>

	<script type="text/javascript">
		$(function () {
			//遮盖整个页面
			//只要对window、document和body使用遮罩层,都会遮盖整个页面
			//$(window).mask();			
			//$(window).unmask(); 取消遮罩

			//遮盖div
			$('#div').mask('加载中,请稍候。。。');
		});
	</script>
</body>

</html>

jQuery BlockUI 插件(遮罩层)

部分效果 概述 当使用AJAX时,jQuery BlockUI插件可以模拟同步行为,并且不会锁定浏览器。一旦被激活,它便会防止页面上(或页面的一部分)用户的操作,直到被停用。BlockUI给DOM...

Jquery简洁遮罩层插件:jqLoding 演示及demo下载

http://www.suchso.com/UIweb/jquery-jqLoding-demo-down.html

Jquery 加载等待遮罩层插件

/**  * 弹出遮罩的waitbar  * loadMsg: 加载的消息字符串  * waitCls: waitbar的样式(可选参数)  */ $.fn.showWaitbar = fu...

Jquery超简单遮罩层实现代码

在开发中,为了避免二次提交,遮罩层的运用越来越普遍 找了很多
  • tolcf
  • tolcf
  • 2014年08月20日 21:36
  • 89358

jquery.nyroModal 强大的遮罩层插件

今天在写个人空间时,相册部分用到了遮罩层效果。之前在一次项目中也有用到过,只是那时候还不知道可以使用插件呢,呵呵 主要在两个地方使用了这个效果,第一是创建相册,第二是图片查看,类似于QQ空间里照片查...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

jQuery遮罩插件jQuery.blockUI介绍及使用

jQuery BlockUI Plugin概述: jQuery BlockUI插件可以在不锁定浏览器的同时,模拟同步模式下发起Ajax请求的行为。该插件激活时,会阻止用户在页面进行的操作,直到插...
  • wang725
  • wang725
  • 2015年11月17日 20:54
  • 1792

【jQuery】遮罩效果的实现

暑假的实习,本来不怎么懂JavaScript的我,写了挺多JavaScript或者是jQuery的一些小效果,现在记录下来,方便以后查看。 遮罩效果一般用在数据处理需要一定时间,这段等待的时间不希望...
  • LZGS_4
  • LZGS_4
  • 2015年11月03日 17:04
  • 1426

jQuery设置div居中及实现遮罩层

jquer设置div居中级实现遮罩层 这里主要讲遮罩层 web前端开发,写网站静态页面时经常遇到些遮罩层和设置div(物体)居中。 这里又我自己写的一个实例,提供参考。 一、效果图 效果图1: ...

发布个JQuery的遮罩层实现(mask)

用过ExtJs的可能知道在ExtJs中集成了很多的UI元素可以很方便我们的使用。其中有mask()和unmask()这两个方法,这两个方法在指定的元素上添加一个遮罩层和一个提示消息实现,增加客户体验。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jQuery遮罩层插件
举报原因:
原因补充:

(最多只允许输入30个字)