点击在 p标签上,鼠标移动,触发事件
鼠标的移动事件最好帮顶给 div 或者 document
整个文档定义鼠标抬起,给move事件赋值null
坐标:
x : 鼠标pageX - div左外边距 - div左边框 - p标签宽度一半
y : 鼠标pageY - div上外边距 - div上边框 - p标签高度一半
极值 :
最小 0 0
最大 div占位(无border) - p占位(有border)
htmlcssjs
<div>
<p></p>
</div>
* {
margin: 0;
padding: 0;
}
body {
height: 5000px;
}
div {
width: 800px;
height: 800px;
background: pink;
position: relative;
margin: 300px auto;
display: flex;
justify-content: center;
align-items: center;
border: 40px solid green;
}
p {
width: 100px;
height: 100px;
background: orange;
position: absolute;
border: 20px solid black;
top: 0;
left: 0;
}
// 获取当前对象
var oDiv = document.querySelector('div');
var oP = document.querySelector('p');
// 先获取相关数据
// 无border占位
var oDivWidth = oDiv.clientWidth;
var oDivHeight = oDiv.clientHeight;
// div,border
var oDivBorderLeft = oDiv.clientLeft;
var oDivBorderTop = oDiv.clientTop;
// div,margin 通过 css样式获取
var oDivMarginLeft = parseInt(myGetStyle(oDiv, 'marginLeft'));
var oDivMarginTop = parseInt(myGetStyle(oDiv, 'marginTop'));
// p,占位,包括border
var oPWidth = oP.offsetWidth;
var oPHeight = oP.offsetHeight;
// 给p标签,添加事件,鼠标按下
oP.onmousedown = function () {
oDiv.onmousemove = function (e) {
e = e || window.event;
// 将鼠标的坐标赋值给p标签,作为定位的数值
// 点击在p标签上,获取的offset,是相对于p标签左上角的距离
// 不符和相对于div左上角的定位
// 如果有滚动条,要是用pageX 和 pageY
// 距离文档左上角的坐标
// page - 外边距 - border - p宽高的一半
var x = e.pageX - oDivMarginLeft - oDivBorderLeft - oPWidth / 2;
var y = e.pageY - oDivMarginTop - oDivBorderTop - oPHeight / 2;
// 设定极值
// 最小是 0 0
// 最大是 div占位(无border) - p占位(有border)
if (x < 0) {
x = 0;
}
if (y < 0) {
y = 0
}
if (x > oDivWidth - oPWidth ) {
x = oDivWidth - oPWidth ;
}
if (y > oDivHeight - oPHeight ) {
y = oDivHeight - oPHeight;
}
// 将结果赋值给p标签作为定位数值
oP.style.left = x + 'px';
oP.style.top = y + 'px';
}
}
// 最好给 document 添加鼠标抬起事件
// 鼠标在任意位置上抬起,都会终止move效果
document.onmouseup = function () {
oDiv.onmousemove = null;
}
// 获取标签css样式的兼容语法函数
// 参数1: 需要获取样式的标签对象
// 参数2: 需要获取样式的属性名称
function myGetStyle(element, style) {
// 如果 浏览器 支持 window.getComputedStyle 执行结果有内容,自动转化为 true
// 如果 浏览器 不支持 window.getComputedStyle 执行结果,为undefined,自动转化为 false
if (window.getComputedStyle) {
// window.getComputedStyle 转化为 true 的情况
// 也就是 浏览器 支持 window.getComputedStyle 可以使用
return window.getComputedStyle(element)[style];
} else {
// window.getComputedStyle 转化为 false 的情况
// 浏览器不支持 window.getComputedStyle 方法 不能使用
return element.currentStyle[style];
}
}

Comments | NOTHING