Skip to content

悬浮可拖动组件 - 移动端

效果展示

示例代码

html
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>悬浮可拖动组件 - 移动端</title>
		<script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script>
		<style>
			* {
				margin: 0;
				padding: 0;
			}

			body {
				background-color: gray;
				text-align: center;
			}

			#box {
				width: 50px;
				height: 50px;
				position: fixed;
				right: 20px;
				bottom: 200px;
				background-color: red;
				cursor: pointer;
				z-index: 10;
			}

			#footer {
				width: 100%;
				height: 100px;
				position: fixed;
				bottom: 0;
				background-color: blue;
			}
		</style>
	</head>
	<body>

		<div>悬浮可拖动组件 - 移动端</div>

		<div id="box"> </div>

		<div id="footer"></div>

	</body>
	<script>
		var _x_start, _y_start, _x_move, _y_move, _x_end, _y_end, left_start, top_start;

		//按下
		document.getElementById("box").addEventListener("touchstart", function(e) {
			_x_start = e.touches[0].pageX; //起始点击位置
			_y_start = e.touches[0].pageY; //起始点击位置
			left_start = $("#box").css("left"); //元素左边距
			top_start = $("#box").css("top"); //元素上边距
		});

		//移动
		document.getElementById("box").addEventListener("touchmove", function(e) {
			e.preventDefault(); //取消事件的默认动作。
			_x_move = e.touches[0].pageX; //当前屏幕上所有触摸点的集合列表
			_y_move = e.touches[0].pageY; //当前屏幕上所有触摸点的集合列表
			console.log(e.touches[0], 'e.touches[0]');
			//左边距=当前触摸点-鼠标起始点击位置+起始左边距
			$("#box").css("left", parseFloat(_x_move) - parseFloat(_x_start) + parseFloat(left_start));
			//上边距=当前触摸点-鼠标起始点击位置+起始上边距
			$("#box").css("top", parseFloat(_y_move) - parseFloat(_y_start) + parseFloat(top_start) + "px").css(
				'bottom', 'auto');
		});

		//松开
		document.getElementById("box").addEventListener("touchend", function(e) {

			var bodyW = $(window).width(); //屏幕宽
			var bodyH = $(window).height(); //屏幕高
			var _x_end = e.changedTouches[0].pageX; //松开位置
			var _y_end = e.changedTouches[0].pageY; //松开位置
			var divH = $("#box").height(); //元素高
			var divW = $("#box").width(); //元素宽

			var domRect = document.getElementById("box").getBoundingClientRect();
			console.log(domRect, 'domRect');

			var footerDom = document.getElementById("footer");
			var footerRect = {};
			if (footerDom) {
				footerRect = footerDom.getBoundingClientRect();
			}
			console.log(footerRect, 'footerRect');

			//当元素左边在屏幕外时
			if (parseFloat($("#box").css("left")) < 0) {
				//置于左边
				$("#box").css("left", 0); //置于顶部
			}

			//当元素右边在屏幕外时
			if (bodyW - domRect.right < 0) {
				//置于右边
				$("#box").css('left', 'auto').css("right", 0);
			}

			//当元素顶部在屏幕外时
			if (parseFloat($("#box").css("top")) < 0) {
				//置于顶部
				$("#box").css("top", 0); //置于顶部
			}

			//当元素底部在屏幕外时
			if (bodyH - footerRect.height < domRect.top + domRect.height) {
				//置于底部
				$("#box").css("top", 'auto').css("bottom", footerRect.height + 10);
			}
		});
	</script>
</html>
</html>