H5系列之drag拖放

H5中, 有个属性,draggable="true", 这个属性呢(默认false),需要加在标签上,加上去该标签就可以拖动了, 看下gif图吧

默认的标签,是不能拖动的,但是有两个标签是意外,img标签,和 a标签,默认就可以拖动。

浏览器兼容问题: w3c 是说 都支持, 但是据我实测, firefox 浏览器,在我这台机子上面是支持的。 所以,使用的时候,注意一下,firefox 这个特殊的浏览器

好了,接下来,看看他还有些什么东西吧。拖拽div的时候,他身上能监听到三个事件 ↓

<script>
    var div = document.getElementsByTagName(‘div‘)[0];

    div.ondragstart = function(e){   //开始拖拽事件
        console.log(‘start‘);
    }

    div.ondrag = function(e){        //拖拽过程中的事件
        console.log(‘drag‘);
    }

    div.ondragend = function(e){     //结束拖拽事件
        console.log(‘end‘);
    }
</script>

如果有仔细看的朋友,就会观察到, dragstart事件,并不是在点击的时候触发的,是点击之后,开始移动的时候触发的,还有,drag事件呢, 只要在触发了 dragstart 事件后,移动了,那么,他就会不停的触发,即使你已经停止移动了,还是会触发,直到你放下鼠标按键,触发了 dragend事件后,才停止。

简单可以理解为,drag 事件呢, 就是在移动的过程中会一直触发。

那么。做一个简单的拖拽小demo

<!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>
        div{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            left: 0px;
            top: 0px;
        }
    </style>
</head>
<body>
    <div draggable="true"></div>
    <script>
        var div = document.getElementsByTagName(‘div‘)[0];
        var X = 0,
            Y = 0;
        div.ondragstart = function(e){
            X = e.clientX;  //记录鼠标点下的位置。(因为div的定位点,是左上角 0,0)
            Y = e.clientY;
        }
        div.ondragend = function(e){
            var X1 = e.clientX - X; //结束的位置,减去鼠标点下的位置,那么得到的位置,就是div落下的位置。
            var Y1 = e.clientY - Y;
            div.style.left = div.offsetLeft + X1 + ‘px‘; //这里还需要加上 div当前的位置, 累加。
            div.style.top = div.offsetTop + Y1 + ‘px‘;
        }
    </script>
</body>
</html>

你以为这样就结束了吗?

还有四个事件,分别是  ondragenter,  ondragover,  ondragleave,  ondrop,   这四个事件呢,是绑定到,你要把拖拽的东西,放到那里去。 举个例子,我要拿一个杯子,那么我要把这个杯子放到哪里去呢?  是不是得有个东西,给他放?   那么这四个事件,就是绑定在,给他放的标签上。  看gif 图吧

<!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>
        div:nth-of-type(1){
            width: 100px;
            height: 100px;
            background-color: red;
        }
        .box{
            position: absolute;
            left: 200px;
            top: 200px;
            width: 200px;
            height: 200px;
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <div draggable="true"></div>
    <div class="box"></div>
    <script>
        var box = document.getElementsByClassName(‘box‘)[0];
        box.ondragenter = function(){
            console.log(‘enter‘);      // 跟 dragstart 事件一样, 只不过,是进入到该标签内才会触发(不是东西进入就触发,还得是鼠标进去)。
        }
        box.ondragover = function(){   // 跟 drag 事件一样, 只不过,是进入到该标签内才会触发。
            console.log(‘over‘);
        }
        box.ondragleave = function(){  // 是进入到该标签内,在离开该标签才会触发。(鼠标抬起,物体会回到原来的位置上,此时也会触发leave事件,因为已经离开了)
            console.log(‘leave‘);
        }
        box.ondrop = function(){
            console.log(‘drop‘);    // 跟 dragend 事件一样, 只不过,是进入到该标签内,在该标签内放置标签才会触发。在该标签外面放置是不会触发的
        }
    </script>
</body>
</html>

看完上面gif图的 有没有发现, 前三个事件都触发了, 为啥第四个事件,drop 不会触发呢? 为什么在黑框里面放置红方块不会触发,在外面放置也不会触发?

这是因为,无论你在哪里放置 这个红方块。 都是不允许的,在外面放(body),里面放(box),需要添加一个阻止默认事件才可以。在ondragover 里面添加即可

box.ondragover = function(e){
      e.preventDefault();
}

接下来,做一个小demo, 拖拽,放置到框框里面,上效果图

代码如下:

<!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>
        * {
            padding: 0;
            margin: 0;
        }

        .box {
            width: 200px;
            height: 50px;
            background-color: #0ff;
            margin-top: 10px;
        }

        .wra {
            position: absolute;
            left: 300px;
            top: 0;
            width: 200px;
            height: auto;
            border: 1px solid black;
        }

        .wra:nth-of-type(1){
            left: 0;
            top: 0;
        }
    </style>
</head>

<body>
    <div class="wra" >
        <div class="box" draggable="true">1</div>
        <div class="box" draggable="true">2</div>
        <div class="box" draggable="true">3</div>
    </div>

    <div class="wra"></div>
    <script>
        var wra = document.getElementsByClassName(‘wra‘)[1];
        var box = document.getElementsByClassName(‘box‘);
        var dom = null;
        for (var i = 0; i < box.length; i++) { //给每个块 添加开始拖拽的事件。
            box[i].ondragstart = function () {
                dom = this;                    //谁触发了这个事件,就把它添加到 dom变量上。
            }
        }

        wra.ondragover = function (e) {
            e.preventDefault();
        }
        wra.ondrop = function () {
            this.appendChild(dom);            // 在触发放置事件后,把dom变量上面存dom元素,添加到 wra里面去。
        }
    </script>
</body>

</html>

本章结束,感谢你的阅读。

原文地址:https://www.cnblogs.com/yanggeng/p/11366916.html

时间: 2024-08-10 02:48:52

H5系列之drag拖放的相关文章

H5中元素的拖放

HTML5的拖放 拖放 抓取对象后放在另一个位置 属性和方法 设置元素为可拖放(让元素可以拖动) <img draggable="true"> 拖动什么 事件:ondragstart--规定当元素被拖动的时候会发生什么 方法:dataTransfer.setData(数据类型,可拖动元素的id)--设置被拖数据的数据类型和值 <!-- img可以拖动,拖动时调用函数drag(event),规定被拖动的数据--> <img id="drag1&qu

Silverlight &amp; Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)

在Silverlight中自身并没有提供拖放功能的相关实现,要实现拖放功能得借助其事件支持(MouseLeftButtonDown.MouseLeftButtonUp和MouseMove)来完成,实际应用中我们可以通过行为(Behavior)特性将拖放操作封装为行为,这样可达到代码复用的效果.而在Blend中则直接提供了拖放操作行为,它位于Microsoft.Expression.Interactions.dll的Microsoft.Expression.Interactivity.Layout

H5系列之canvas

原文地址:https://www.cnblogs.com/yanggeng/p/11379940.html

H5系列一、静态页面总结

1.img父标签设置高度,如果容器没有设置高度的话,图片会默认把容器底部撑大几像素 -- 大概3px,给容器设置高度. 2.input标记换行后默认有一个间隙,设置float属性.input标记默认还有边框(2px),清除边框border:none/0. 3.搜索栏 <form> <input placeholder="SEARCH..." type="text" class="txt"/> <input type=

H5的拖放

先来个代码—————— 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 </head> 6 <body onloat="init()";> 7 <div id="word" draggable="true" style="width:100px; height: 30px; borde

html5实现拖放

在html5中,支持拖放API接口,通过该功能,数据可以在浏览器与其他应用程序之间互相拖放,想要实现该操作,必须经过一下两个步骤 (1)将想要拖放的对象标签的draggable属性设为true.这样才能将该标签进行拖放,令外,img标签与a标签必  须指定为true,默认允许拖放. (2)编写与有拖放有关的事件处理代码,常用的播放事件如下: dragstart  开始拖放操作 drag       拖放过程中 dragenter  被拖放的标签开始进入本标签的范围内 dragover   被拖放

基于html5实现的简单拖放

h5新增了关于拖放的API,通过拖放API可以让html页面的任何元素都变成可以拖动的.这是一个小例子,帮助理解. <html> <head> <meta charset="utf-8"> <meta name="author" content="dongfeng"> <title>html5拖拽</title> <style> #sourse{ width: 2

javascript实现拖曳与拖放图片

其实对于drag和drop拖曳与拖放事件IE很早以前就支持这个操作了,我们先来看看HTML5中新增的拖放API. 在HTML5中想要实现拖放操作,至少要做以下操作: 1. 将要拖放的对象元素的draggable属性设置为true,即(draggable="true"),这样才能拖放该元素,且img元素与a元素(必须指定href)默认允许拖放操作.如代码: <li draggable="true">Item 1</li> 2. 编写与拖放有关的

javascript 拖放效果

最近一直在看javascript的书籍,有些东西在书上看着貌似理解了,但是在真正动手实践时,其实有些细节你根本不了解.所以看起来就算是一个简单的效果,写起来也未必简单,就算写起来简单,写的代码也未必规范.可维护性等等.无奈,一直学习编程以来都是眼高手低,导致什么都写不出来.在自己没有足够的功底写出好的代码出来,学习大牛的代码也是一直高效的方式.以下是一个拖放的效果,参考的代码,重构以下,加以理解学习. 首先来看效果: 拖动div 拖放状态:未开始 [程序说明] 拖动原理:其实就是在拖动块上监听m