Web前端中实现一个拖动效果

发布时间:2021-05-06

在原生客户端开发中,窗口拖动是一个比较常用的操作。今天把这个效果在网页客户端中实现以下,文章记录一下效果。

分析梳理

拖动操作主要分为三部分:第一,对着需要拖动的元素按下鼠标,获取要拖动物体的位置;第二,滑动鼠标,注意在滑动鼠标的时候,鼠标一直是处于按下状态的并且元素应该是随着鼠标一起移动;第三,到达目标位置,松开鼠标。

实现

首先,拿到要拖动的物体,并注册鼠标按下事件。当鼠标按下时,开始监听页面的鼠标滑动事件,拿到实时位置坐标。再监听鼠标弹起事件,用来移除之前注册的页面事件,防止物体一直跟随无法停止。

<div id="container">container</div>

Js代码如下

const container = document.querySelector('div#container');
let disX = 0,
    disY = 0;
container.addEventListener('mousedown', ev => {
    disX = ev.clientX - container.offsetLeft;
    disY = ev.clientY - container.offsetTop;
    document.addEventListener('mousemove', mov);
    document.addEventListener('mouseup', up);
})

function mov(ev) {
    var ev = ev || event;
    container.style.left = ev.clientX - disX + 'px';
    container.style.top = ev.clientY - disY + 'px';
}

function up(ev) {
    document.removeEventListener('mousemove', mov);
    document.removeEventListener('mouseup', up);
    container.classList.remove('mov');
}

有兴趣可以自己试一试不注销事件监听会有什么效果。

其他阅读

Angular使用路由复用实现单页多窗(Tab页形式)

我们在开发后台管理系统时,一个很重要的需求就是多窗口编辑,来回切换使用。一种思路是使用iframe来记录多个多页面展示,本文通过Angular路由复用来实现这一需求。

查看原文

C#本质论7.0

《C#本质论》是C#最权威、最值得尊重的参考书之一,作者为此付出了非凡的努力!Mark Michaelis的《Essential C#》系列多年来一直是畅销经典。

查看原文

Angular中开发一个代码库

Angular 的复杂项目中,我们可以对其拆分出不同功能模块进行开发,但是对于大型项目,或者我们直接考虑拆成库,将一部分的模块合起来组成一个库,方便复用,比如我们熟悉的各种设计组件库,就是一堆模块的合集。

查看原文

使用正则表达式来判断邮箱

在开发中,很多地方都需要用户输入邮箱,用户注册,登录需要邮箱,订阅消息需要邮箱,为了防止被恶意使用,一般都会使用正则表达式来判断输入是否符合邮箱规范

查看原文

浅析web前端中的MVC模式

MVC是常见的软件架构设计模式,它通过分离关注点改进代码的组织方式。区别于软件设计模式,只是为了解决问题总结出的抽象方法,一种架构模式种往往会用到多种设计模式。

查看原文