码迷,mamicode.com
首页 > Web开发 > 详细

jQuery遮罩层插件

时间:2015-07-07 19:31:43      阅读:376      评论:0      收藏:0      [点我收藏+]

标签:jquery   web前端   mask   遮罩层   

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

$.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遮罩层插件

标签:jquery   web前端   mask   遮罩层   

原文地址:http://blog.csdn.net/accountwcx/article/details/46791949

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!