拖动选择元素(jquery选择元素)

336 阅读1分钟

实现方式

绑定mouse的事件,鼠标结束后将选择框内我们想选中的元素找出来

<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=gbk" />
		<title>jquery选择元素</title>
		<style>
			#outer-wapper {
				/* 禁止选择, 这样我们自己的选择框就能出来了 */
				-moz-user-select: none; /*火狐*/
				-webkit-user-select: none; /*webkit浏览器*/
				-ms-user-select: none; /*IE10*/
				-khtml-user-select: none; /*早期浏览器*/
				user-select: none;
			}
			#rect {
				position: absolute;
				border: 2px dashed rgb(141, 141, 141);
				background-color: black;
				opacity: 0.1;
				filter: alpha(opacity=10);
				filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=10);
				-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=10)';
			}
			#outer-wapper {
				width: 500px;
				height: 500px;
				visibility: visible;
				border: solid 1px #eee;
				margin-top: 100px;
				position: relative;
			}
			#outer-wapper button {
				margin: 50px;
				height: 40px;
				line-height: 40px;
			}
			button.selected {
				border: 1px solid green;
				background-color: darkseagreen;
			}
		</style>
	</head>
	<body>
		<div id="outer-wapper">
			<button>多福多寿</button>
			<button>华尔兹</button>
			<button>报批单</button>
			<button>金域诊断</button>
			<button>英语学习</button>
			<button>40不立</button>
			<button>流落街头</button>
			<div id="rect"></div>
		</div>
		<script src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>

		<script language="javascript">
			var SelectBtns = function (c, r) {
				//
				var select = false

				var rect = document.getElementById(r)

				rect.style.width = 0
				rect.style.height = 0
				rect.style.visibility = 'hidden'
				//设置选择蹭
				rect.style.zIndex = 1000

				// 记录鼠标按下时的坐标
				var downX = 0
				var downY = 0
				// 记录鼠标抬起时候的坐标
				var mouseX2 = downX
				var mouseY2 = downY

				this.init = function () {}

				//处理鼠标按下事件
				this.down = function (event) {
					select = true

					downX = event.offsetX
					downY = event.offsetY

					//设置你要画的矩形框的起点位置
					rect.style.left = downX
					rect.style.top = downY
					rect.style.width = 0
					rect.style.height = 0
					$btns.removeClass('selected')
				}

				//鼠标移动事件,最主要的事件
				this.move = function (event) {
					// 取得鼠标移动时的坐标位置
					mouseX2 = event.clientX
					mouseY2 = event.clientY

					/*
        
          这个部分,根据你鼠标按下的位置,和你拉框时鼠标松开的位置关系,可以把区域分为四个部分,根据四个部分的不同,
          我们可以分别来画框,否则的话,就只能向一个方向画框,也就是点的右下方画框.
          
          */
					if (select) {
						// 设置拉框的大小
						rect.style.width = Math.abs(mouseX2 - downX)
						rect.style.height = Math.abs(mouseY2 - downY)

						rect.style.visibility = 'visible'

						// A part
						if (mouseX2 < downX && mouseY2 < downY) {
							rect.style.left = mouseX2
							rect.style.top = mouseY2
						}

						// B part
						if (mouseX2 > downX && mouseY2 < downY) {
							rect.style.left = downX
							rect.style.top = mouseY2
						}

						// C part
						if (mouseX2 < downX && mouseY2 > downY) {
							rect.style.left = mouseX2
							rect.style.top = downY
						}

						// D part
						if (mouseX2 > downX && mouseY2 > downY) {
							rect.style.left = downX
							rect.style.top = downY
						}
						return get_select_list()
					}
				}

				//鼠标抬起事件
				this.up = function (event) {
					//鼠标抬起,就不允许在处理鼠标移动事件
					select = false
					//隐藏图层
					rect.style.visibility = 'hidden'
					return get_select_list()
				}
				function get_select_list() {
					var rect = {
						x0: $rect.offset().left,
						y0: $rect.offset().top,
						x1: $rect.offset().left + $rect.outerWidth(),
						y1: $rect.offset().top + $rect.outerHeight(),
						width: $rect.outerWidth(),
						height: $rect.outerHeight(),
					}
					var selBtns = []
					if (rect.width > 64 && rect.height > 40) {
						$btns.each(function () {
							var btn = $(this)
							var x0 = btn.offset().left
							var y0 = btn.offset().top
							var x1 = x0 + btn.outerWidth()
							var y1 = y0 + btn.outerHeight()
							// console.log(rect, btn, { x0, y0, x1, y1 })
							if (x0 > rect.x0 && y0 > rect.y0 && x1 <= rect.x1 && y1 <= rect.y1) {
								selBtns.push(btn)
								btn.addClass('selected')
							} else {
								btn.removeClass('selected')
							}
						})
					}
				}
			}

			var select_list, $btns, $outer, $rect, selectBtns
			$(function () {
				$outer = $('#outer-wapper')
				$btns = $('button')
				$rect = $('#rect')
				selectBtns = new SelectBtns('outer-wapper', 'rect')
				selectBtns.init()
				$outer.on('mousedown', function (event) {
					selectBtns.down(event)
				})
				$outer.on('mousemove', function (event) {
					selectBtns.move(event)
				})
				$outer.on('mouseup', function (event) {
					selectBtns.up(event)
				})
			})
		</script>
	</body>
</html>