PHP仿百度实现弹窗登录效果,js仿百度登录页实现拖动窗口效果

在web开发中,鼠标拖拽效果非常常见,例如百度的登录页,点击登录会弹出一个窗口,并且这个窗口可以拖动;那么这样的拖拽效果如何实现呢 ?其实实现很简章,搞清楚他的原理就很容易了;首当其冲的,要涉及到鼠标的三个事件,分别为鼠标按下、移动、松开;在这三个事件里分别计算元素鼠标的位置即可;

复制代码

/*******

拖拽原理1:

拖拽状态 = 0

鼠标在元素上按下的时候 {

拖拽状态 = 1

记录下鼠标的x和y坐标

记录下元素的x和y坐标

}

鼠标在元素上移动的时候 {

如果拖拽状态是0就什么也不做。

如果拖拽状态是1, 那么

元素y = 现在鼠标y - 原来鼠标y + 原来元素y

元素x = 现在鼠标x - 原来鼠标x + 原来元素x

}

鼠标在任何时候放开的时候 {

拖拽状态 = 0

}

将以上思路翻译成JS代码就可以实现拖拽的效果了。

*******/

上面这个原理也可以演变为:

/*******

拖拽原理2:

拖拽状态 = 0

鼠标在元素上按下的时候 {

拖拽状态 = 1

记录下鼠标的x和y坐标

记录下元素的x和y坐标

元素的偏移值X=元素的X-元素的offsetLeft

元素的偏移值Y=元素的Y-元素的offsetTop

}

鼠标在元素上移动的时候 {

如果拖拽状态是0就什么也不做。

如果拖拽状态是1, 那么

元素y = 现在鼠标y -元素的偏移值X

元素x = 现在鼠标x -元素的偏移值Y

}

鼠标在任何时候放开的时候 {

拖拽状态 = 0

}

将以上思路翻译成JS代码就可以实现拖拽的效果了。

*******/

上面两种思路其实是异曲同工,需要注意的是在移动事件里,还要处理元素边缘的位置,以防止元素被拖动的时候拖到浏览器以外的地方;直接来看代码:

代码一:

JS拖拽

*{padding: 0; margin: 0; }

.box{width: 100px;height: 100px;background: blue;position: absolute; }

var isDown = false;

var ObjLeft, ObjTop, posX, posY, obj;

window.onload = function() {

obj = document.getElementById('box');

obj.onmousedown = down;

document.onmousemove = move;

document.onmouseup = up;

}

function down(event) {

obj.style.cursor = "move";

isDown = true;

ObjLeft = obj.offsetLeft;

ObjTop = obj.offsetTop;

posX = parseInt(mousePosition(event).x);

posY = parseInt(mousePosition(event).y);

}

function move(event) {

if (isDown == true) {

var x = parseInt(mousePosition(event).x - posX + ObjLeft);

var y = parseInt(mousePosition(event).y - posY + ObjTop);

var w = document.documentElement.clientWidth - obj.offsetWidth;

var h = document.documentElement.clientHeight - obj.offsetHeight;

console.log(x + ',' + y);

if (x < 0) {

x = 0

} else if (x > w) {

x = w

};

if (y < 0) {

y = 0

}else if (y > h) {

y= h

};

obj.style.left = x + 'px';

obj.style.top = y + 'px';

}

}

function up() {

isDown = false;

}

function mousePosition(evt) {

var xPos, yPos;

evt = evt || window.event;

if (evt.pageX) {

xPos = evt.pageX;

yPos = evt.pageY;

} else {

xPos = evt.clientX + document.body.scrollLeft - document.body.clientLeft;

yPos = evt.clientY + document.body.scrollTop - document.body.clientTop;

}

return {

x: xPos,

y: yPos

}

}

代码二:

JS拖拽

*{padding: 0; margin: 0; }

.box{width: 100px;height: 100px;background: blue;position: absolute; }

var isDown = false;

var ObjLeft, ObjTop, posX, posY, obj,offsetX,offsetY;

window.onload = function() {

obj = document.getElementById('box');

obj.onmousedown = down;

document.onmousemove = move;

document.onmouseup = up;

}

function down(event) {

obj.style.cursor = "move";

isDown = true;

ObjLeft = obj.offsetLeft;

ObjTop = obj.offsetTop;

posX = parseInt(mousePosition(event).x);

posY = parseInt(mousePosition(event).y);

offsetX=posX-ObjLeft;

offsetY=posY-ObjTop;

}

function move(event) {

if (isDown == true) {

var x=mousePosition(event).x-offsetX

var y=mousePosition(event).y-offsetY

var w = document.documentElement.clientWidth - obj.offsetWidth;

var h = document.documentElement.clientHeight - obj.offsetHeight;

console.log(x + ',' + y);

x=Math.min(w,Math.max(0,x));

y=Math.min(h,Math.max(0,y));

obj.style.left = x + 'px';

obj.style.top = y + 'px';

}

}

function up() {

isDown = false;

}

function mousePosition(evt) {

var xPos, yPos;

evt = evt || window.event;

if (evt.pageX) {

xPos = evt.pageX;

yPos = evt.pageY;

} else {

xPos = evt.clientX + document.body.scrollLeft - document.body.clientLeft;

yPos = evt.clientY + document.body.scrollTop - document.body.clientTop;

}

return {

x: xPos,

y: yPos

}

}

代码一对应原理一,代码二对应原理二,效果都是一样的,只不过原理二是在原理一的基础上演变过来的,演变之后,元素拖动的边缘处理也相应的做了变化。

以上就是本文的全部内容,希望对大家的学习有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 QML 中,可以通过设置窗口的 `flags` 属性来启用窗口的拖拽效果。具体实现方法如下: 1. 在窗口的 `Component.onCompleted` 信号中设置窗口的 `flags` 属性: ``` Component.onCompleted: { flags: Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.X11BypassWindowManagerHint } ``` 2. 在窗口的 `MouseArea` 中添加鼠标事件处理程序: ``` MouseArea { anchors.fill: parent cursorShape: Qt.SizeAllCursor onPressed: { if (mouse.button === Qt.LeftButton) { mouse.accepted = true window.startDrag() } } onMouseXChanged: { if (mouse.button === Qt.LeftButton && mouse.accepted) { window.drag(x - mouse.startX, y - mouse.startY) } } onReleased: { if (mouse.button === Qt.LeftButton && mouse.accepted) { window.stopDrag() } } } ``` 其中,`startDrag()` 方法用于启动窗口的拖拽效果,`drag()` 方法用于实现窗口的拖拽,`stopDrag()` 方法用于停止窗口的拖拽。 3. 在窗口的 `onDragStarted`、`onDragUpdated` 和 `onDragFinished` 信号中实现窗口的拖拽效果: ``` onDragStarted: { startX = x startY = y } onDragUpdated: { window.x = startX + offsetX window.y = startY + offsetY } onDragFinished: { startX = 0 startY = 0 offsetX = 0 offsetY = 0 } ``` 其中,`startX` 和 `startY` 分别表示鼠标按下时窗口的位置,`offsetX` 和 `offsetY` 分别表示鼠标移动的偏移量。在 `onDragUpdated` 信号中,根据鼠标移动的偏移量更新窗口的位置,最后在 `onDragFinished` 信号中重置参数。 通过以上步骤,就可以实现窗口的拖拽效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值