每日分享!~ 使用js原生方式对拖拉元素(鼠标的事件)

一个元素放置页面上。如何进行拖拉,实现想放哪里就放哪里的效果呢?

效果如下:

如果让你写这个效果,你会如何写呢?

--- 思路分析:我首先想到的是,对这个元素先绑定一个事件。(什么事件? 那当然是鼠标按下时的事件啦? )   那么绑定这个事件具体做啥子呢? 在绑定这个事件之前。我们需要先了解如下几个事情--

  1. 元素如何才能在页面上移动?  (是不是要脱离文档流呢? OK / 这时我们给设置一个position:absolute /  让其绝对定位。

  2. 获取元素当前距离页面两边的位置

  3. 获取鼠标距离页面两边的位置

  4.求得鼠标距离元素边框的距离

  5.在鼠标移动事件中。设置元素的left , top  值 。 便可以使元素动起来啦 。

  6. 在鼠标抬起的时候,清掉鼠标移动和鼠标抬起事件。

--- 下面是具体的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        div{
            position: absolute;
            width: 100px;
            height: 100px;
            background-color: red;
            top:100px ;
            left:100px;
        }
    </style>
</head>
<body>
    <button id="btn">test</button>
    <div id="dv"></div>

    <script>
        //  鼠标点击元素开启监听事件
        dv.addEventListener(‘mousedown‘,(e)=>{
            // 计算鼠标箭头和元素的左边缘和上边缘的距离
            var disX = e.pageX - dv.offsetLeft
            var disY = e.pageY - dv.offsetTop
            // console.log(dv.offsetLeft)
            // 当点击时,会一直触发监听鼠标的移动事件(监听document
            // document.addEventListener(‘mousemove‘, (e) =>{
            //     // console.log(e)
            //     // 设置元素的移动距离
            //     dv.style.left = e.pageX - disX + ‘px‘
            //     dv.style.top = e.pageY - disY + ‘px‘
            // })
            // document.addEventListener(‘mouseup‘,(e) =>{
            //     // 移除两个事件
            //     document.removeEventListener(‘mosedown‘,(e) =>{
            //           // console.log(e)
            //     // 设置元素的移动距离
            //     dv.style.left = e.pageX - disX + ‘px‘
            //     dv.style.top = e.pageY - disY + ‘px‘
            //     })
            //     document.removeEventListener(‘mosueup‘,() =>{})
            // })
            // // 阻止默认事件
            // console.log(e.preventDefault())
            document.onmousemove = function(e){
                dv.style.left = e.pageX - disX + ‘px‘
                dv.style.top = e.pageY - disY + ‘px‘
            }
            document.onmouseup = function(){
                document.onmousemove = document.onmouseup = null
            }
            e.preventDefault()
            // 总结: 使用addEventLister()  在移除事件的实际不方便!! 还是采用普通的事件监听函数~~
        })

    </script>
</body>
</html>      

好了~~~今天的分享就先到这里啦! 还有一点其他的知识留着明天分享吧!~~~每天分享一点~     2019-04-25 23:15:39

值得注意的是:获取距离的几个方法:  如:target.offsetTop /  e.pageY   / 等

原文地址:https://www.cnblogs.com/yaogengzhu/p/10771797.html

时间: 2024-10-14 04:35:37

每日分享!~ 使用js原生方式对拖拉元素(鼠标的事件)的相关文章

js原生方式实现jquery中的append()方法

一.在使用jquery时, append() 方法在被选元素的结尾(仍然在内部)插入指定内容 使用方法:$(selector).append(content),content为必需的.规定要插入的内容(可包含 HTML 标签) 二.在使用原生js时,使用appendChild() 方法可向节点的子节点列表的末尾添加新的子节点, 用法:parent.appendChild(child); child没有引号包住,child参数,是node类型.给一个空文档里面动态创建元素,要使用document.

分针网—每日分享:js刷新页面方法大全

如何实现刷新当前页面呢?借助js你将无所不能. 1,reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页.true, 则以 GET 方式,从服务端取最新的页面, 相当于客户端点击 F5("刷新") 2,replace 方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,你不能通过"前进

js原生添加事件的方式

js原生添加事件的方式: 1. 直接在html标签上添加 <div onclick="alert('div')">div</div> 2. 用dom的on...方法添加 document.getElementById('div').onclick = function () {alert('div')}; 3. 用addEventListener或attachEvent添加 document.getElementById('div').addEventListe

Js原生Ajax和Jquery的Ajax

一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死 2.Ajax的运行原理 页面发起请求,会将请求发送给浏览器内核中的Ajax引擎,Ajax引擎会提交请求到服务器端,在这段时间里,客户端可以任意进行任意操作,直到服务器端将数据返回给Ajax引擎后,会触发你设置的事件,从而执行自定义的js逻辑代码完成某种页面1 功能. 二

图片轮播(左右切换)--js原生和jquery实现

图片轮播(左右切换)--js原生和jquery实现 左右切换的做法基本步骤跟 上一篇文章  淡入淡出 类似,只不过修改了一些特定的部分 (1)首先是页面的结构部分 对于我这种左右切换式 1.首先是个外围部分(其实也就是最外边的整体wrapper) 2.接着就是你设置图片轮播的地方(也就是一个banner吧) 3.然后是一个图片组(可以用新的div 也可以直接使用 ul-->li形式) 4.然后是图片两端的左箭头和右箭头5.然后是一个透明背景层,放在图片底部 6.然后是一个图片描述info层,放在

JS原生Ajax请求

摘录一个JS原生Ajax请求行为,原文地址:http://caibaojian.com/ajax-jsonp.html ajax({ url: "./TestXHR.aspx", //请求地址 type: "POST", //请求方式 data: { name: "super", age: 20 }, //请求参数 dataType: "json", success: function (response, xml) { //

JS(原生)事件委托:为动态创建的节点绑定事件

项目开发中经常需要为动态创建的节点绑定事件, 比如需要创建一个动态列表:在li的数量非常少的时候,为每一个li绑定事件不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(假设),为每个li绑定事件就会对页面性能产生很大的影响.当有大量元素需要绑定相同事件的时候可采用事件委托,将在目标元素上要处理的事件委托给父元素或者祖先元素 优点    事件委托对于web应用程序的性能有如下几个优点:    1.需要管理的函数变少了    2.占用的内存少了    3.javascrip

一步步教你js原生瀑布流效果实现

一步步教你js原生瀑布流效果实现 什么是瀑布流效果 首先,让我们先看一段动画: 在动画中,我们不难发现,这个动画有以下特点: 1.所有的图片的宽度都是一样的 2.所有的图片的高度是不一样的 3.图片一张挨着一张竖直排列 4.鼠标向下滚动,一直不停的加载图片 5.浏览器的宽度改变,图片的列数会进行相应的更改 那么这种效果类似现实生活中的瀑布,所以我们叫它瀑布流的效果. Js原生瀑布流效果的实现 从上述分析中,我们可以把整个效果分为以下四个部分: html+css界面搭建 瀑布流效果 浏览器向下滚动

基于面向对象的图片轮播(js原生代码)

无论你想走多远,你都需要不断地走下去.前端最精华的便是原生的js,这也是我们前端工程师的技术分层的重要指标,也提现这你的代码能力,开发的水平.废话不多说,进入今天的主要分享----基于面向对象思想的图片轮播.其效果如下所示: 正如图片所示这样我们要实现的效果,这里与我们以往不同的是我们的布局十分简洁.其中html布局如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset