H5拖拽事件-- 自定义创建a标签热区

有两个BUG未更正,

1.拖拽后,动态创建的div始终在鼠标的下方,导致拖拽定位不准确

2.当窗口为自适应时,定位left为百分比,窗口改变大小时会存在定位偏差

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <script src="./jquery-1.11.3.min.js"></script>
    <style>
        #zt{
            position: relative;
        }
        .div01{
            width: 100px;
            height: 100px;
            position: fixed;
            top: 0;
            left: 50%;
            border: 1px solid;
        }
        .test{
            width: 10px;
            height: 10px;
            overflow: hidden;
            cursor: se-resize;
            position: absolute;
            right: 0;
            bottom: 0;
            background-color: #000000;
        }
        .div01.boder{
            border:3px solid;
        }
        .warp{
            width: 100%;
            overflow: hidden;
        }
    </style>
    </head>
    <body>
        <div id="zt">
            <div class="warp">
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
                 <br>
            </div>

        </div>

<script>
$(function () {
        //第一部分,动态添加可移动div节点
        $("#zt").prepend(`<i class="add_a_btn" style="font-size: .4rem;background: #ccc;font-style: normal;padding: .1rem  .2rem;border-radius: .2rem;position: fixed;top: 0;left: .4rem;z-index: 999;cursor: pointer;">创建可移动按钮</i>`);
        $("#zt").on("click", ".add_a_btn", function(){

            $(".warp").append(`
                <div class="div01 link-box-area" draggable="true">
            <a href="">编辑链接</a>
                <div class="test"></div>
                <span>&times;</span>
            </div>
            `);
            //每次添加,遍历每个节点挂载触发函数
            $(‘.div01‘).each((i,e) =>{
                 bindResize($(‘.div01‘)[i]);
                 Drag($(‘.div01‘)[i])
            })

        //H5拖拽封装
    function Drag(divDrag){
        // 第二部分,拖拽事件
            // 生命周期
                // 1.鼠标按下,拖拽开始
                // 2.移动鼠标,拖拽中
                // 3.松开鼠标,拖拽结束
            var startX = 0;   //拖拽开始的坐标初始化
            var startY = 0;

            console.log(divDrag.offsetTop)

            divDrag.ondragstart = function(event){   //按下的时候必须移动一下
                var event = event || window.event;
                console.log(event)
                console.log(‘拖拽开始‘)
                console.log(this.offsetTop)
                $(this).addClass(‘boder‘);  //拖拽时候的样式
                startX = event.clientX;     //将开始拖拽时候的坐标赋值
                startY = event.clientY;
            }
            divDrag.ondrag = function(){   //鼠标按下了以后,只要移动一下,这个事件就一直处于触发中
                console.log(‘移动中‘)
            }
            divDrag.ondragend = function(){
                console.log(‘结束‘);
                 console.log(event)
                $(this).removeClass(‘boder‘); //移除拖拽时的样式
                var x = event.clientX - startX;   //结束时候的坐标减去开始时候的坐标,等于移动的距离
                var y = event.clientY - startY;
                this.style.position = ‘absolute‘;
                this.style.top = window.scrollY+event.clientY+"px";
                // 自适应宽度转换百分比
                var _y = divDrag.offsetLeft + x;
                this.style.left= _y/event.view.innerWidth * 100 + ‘%‘
            }
    }
    //第三部分,拖拽改变大小
         //绑定需要拖拽改变大小的元素对象
    function bindResize(el) {
      //初始化参数
      var els = el.style,
        //鼠标的 X 和 Y 轴坐标
        x = y = 0;
        $(el).children(".test").mousedown(function (e) {
        console.log(e)
        //按下元素后,计算当前鼠标与对象计算后的坐标
        x = e.clientX - el.offsetWidth, y = e.clientY - el.offsetHeight;
        //在支持 setCapture 做些处理
        el.setCapture ? (
          //捕捉焦点   与.releaseCapture成对出现
          el.setCapture(),
          //设置事件
          $(el).children(".test").onmousemove = function (ev) {
            mouseMove(ev || event)
          },
          el.onmouseup = mouseUp
        ) : (
          //绑定事件
          $(document).bind("mousemove", mouseMove).bind("mouseup", mouseUp)
        )
        //防止默认事件发生
        e.preventDefault()
      });
      //移动事件
      function mouseMove(e) {
        // 结束时坐标减去初始坐标,赋值给样式
        els.width = e.clientX - x + ‘px‘, //改变宽度
        els.height = e.clientY - y + ‘px‘ //改变高度
      }
      //停止事件
      function mouseUp() {
        //在支持 releaseCapture 做些处理
        el.releaseCapture ? (
          //释放焦点
          el.releaseCapture(),
          //移除事件
          el.onmousemove = el.onmouseup = null
        ) : (
          //卸载事件
          $(document).unbind("mousemove", mouseMove).unbind("mouseup", mouseUp)
        )
      }
        // 移除创建的元素
        $(document).on(‘click‘, ‘.link-box-area span‘, function(){
            $(this).parent().remove();
        })
    }
    })
})
</script>
    </body>
    </html>

原文地址:https://www.cnblogs.com/wxyblog/p/11977783.html

时间: 2024-08-10 23:44:46

H5拖拽事件-- 自定义创建a标签热区的相关文章

h5学习--七个h5拖拽事件

<script> // 七个h5拖拽事件 const box = document.getElementById('box') const left = document.getElementById('left') const right = document.getElementById('right') let num = 0 //ondragstart 拖拽开始的时候,进行移动 right.ondragstart= function(){ console.log("lll&q

HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态

多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption></figcaption>: 多媒体标题 方法: load() 加载.play()播放.pause()暂停 属性: currentTime 视频播放的当前进度. duration:视频的总时间. paused:视频播放的状态 事件:   oncanplay:事件在用户可以开始播放视频/音频(aud

H5拖拽 构造拖拽及缩放 pdf展示

前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思路:H5拖拽及构造函数实现拖拽及缩放 要点:1.需要设置拖拽元素属性 draggable="true" 2.可拖拽的元素设置ondragstart获取数据   3.对可放置拖拽元素的设置ondragover函数 默认地,无法将数据/元素放置到其他元素中.如果需要设置允许放置,我们必须阻止对

Duilib嵌入CEF禁止浏览器响应拖拽事件

在开发中有一个需求,拖拽外部文件到客户端,然后客户端响应WM_DROPFILES消息,在拖拽消息里处理一下业务,最后把处理结果显示到客户区html中,但实际中发现当拖拽文件到客户区,浏览器首先处理了拖拽事件,外层的Win32窗口无法捕捉到拖拽消息,因此要想实现此操作,刚开始我想了一个本办法,在客户区最外层罩了一个透明的Win32原生窗口,这样拖拽文件时,在最外层透明窗口的WM_DROPFILES消息中处理具体业务,最后用C++调用js函数,在页面显示处理结果. 方法一: 透明窗口 Layered

h5拖拽上传图片

h5实现拖拽上传图片 本文将为大家介绍如何通过js实现拖拽上传图片. 首先我们要禁用调浏览器默认的拖拽事件: 1 window.onload = function(){ 2 //拖离 3 document.addEventListener('dragleave',function(e){e.preventDefault();}); 4 //拖后放 5 document.addEventListener('drop',function(e){e.preventDefault();}); 6 //拖

拖拽事件

<h1>拖拽事件</h1><ul>    <li>onmousedown:鼠标按下</li>    <li>onmousemove:鼠标移动</li>    <li>onmouseup:鼠标放开</li></ul>    <p>拖拽的时候如果有文字选中,会出现问题!: 当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器的默认拖拽文字的效果</p>    &

Android Launcher拖拽事件详解【android4.0--Launcher系列二】

AndroidICS4.0版本的launcher拖 拽的流程,基本和2.3的相似.就是比2.3写的封装的接口多了一些,比如删除类的写法就多了个类.等等.4.0的改变有一些,但是不是特别大.这个月一 直在改动Launcher的缩略图的效果,4.0的缩略图的功能没有实现,还得从2.3的Launcher中摘出来.通过做这个缩略图对Launcher 的模块有一点点了解,拿来分享一下Launcher拖拽的工作流程.有图有真相!   (1) 先来看看类之间的继承关系      图(1)  (2)再来看看La

JS Event 鼠标拖拽事件

<!DOCTYPE html><html> <head>        <meta charset="UTF-8">        <title>JS Event鼠标拖拽事件</title>                <style>            #box{width:200px;height:200px;background:#000;position:absolute;}       

原生js实现 拖拽事件

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .box { width: 200px; height: 200px; background-color: #000000; position: absolute; left: 0; top: 0;