首页 > 其他分享 >h5中drag的使用以及相关介绍:实现点餐效果

h5中drag的使用以及相关介绍:实现点餐效果

时间:2022-11-13 17:55:44浏览次数:82  
标签:触发 target 对象 拖拉 h5 drag 事件 classList 点餐

相关的API

image
主要有7个api,分别用来描述不同的状态

前提准备

主要实现的点餐功能如下:

  • 一个盘子里装了多种菜
  • 另一个是小明的菜单
  • 小明可以拖动菜品到菜单上
  • 小明的菜单中最多可以点三份菜

思考一下我们如何实现这个功能:首先需要两个容器,一个用来装菜品,另一个当作菜单
小明的点菜操作我们可以使用drag相关的api,拖动到菜单上则给菜单添加一个子元素

相关介绍

下面我们把拖拽的物体称为源对象,放置到位置称为目标对象

dragstart

源对象 开始被拖动时触发的函数,事件对象是源对象,比如我们在这个时候可以给源对象添加一些样式,比如边框高亮,字体加粗等效果,触发一次之后就结束

drag

源对象 在被拖动的时候触发的函数,事件对象是源对象 ,相隔几十毫秒就会触发一次

dragend

源对象被拖拉结束时(释放鼠标键或按下 ESC 键)触发,事件对象是源对象。它与dragstart事件,在同一个节点上触发。不管拖拉是否跨窗口,或者中途被取消,dragend事件总是会触发的


dragenter

源对象进入目标对象时,在目标上触发一次,该事件的target属性是目标对象。通常应该在这个事件的监听函数中,指定是否允许在当前节点放下(drop)拖拉的数据。如果当前节点没有该事件的监听函数,或者监听函数不执行任何操作,就意味着不允许在当前节点放下数据。一般我们可以在源对象刚进入目标对象时监听这个事件,我们可以给目标对象添加高亮效果等

dragover

源对象拖拉到目标对象上方时,在当前节点上持续触发(大概相差几十毫秒),e.target也就是事件对象是目标对象,这个方法类似于drag,都会一直触发。

dragleave

拖拉操作离开目标对象范围时触发,该事件的target属性是目标对象。比如说在点菜时,已经拖到这个框里了,但是又不想点了,又继续滑出去,此时就应该将目标对象之前的样式去掉。

drop

源对象释放到目标对象时,在目标节点上触发。注意,如果目标对象不允许drop,即使在上方松开鼠标键,也不会触发该事件。如果用户按下 ESC 键,取消这个操作,也不会触发该事件。该事件的监听函数负责取出拖拉数据,并进行相关处理。比如我们在点菜时,拖动菜品到盘子里并松手时就说明我们确定点这个菜品,此时就应该复制该节点到盘子里。

注意事项

dragenter和dragover事件的监听函数,用来取出拖拉的数据(即允许放下被拖拉的元素)。由于网页的大部分区域不适合作为放下拖拉元素的目标节点,所以这两个事件的默认设置为当前节点不允许接受被拖拉的元素。如果想要在目标节点上放下的数据,首先必须阻止这两个事件的默认行为

<div ondragover="return false">
<div ondragover="event.preventDefault()">

参考代码

还是存在着很多小bug,不过基础功能已经可以实现了
image

点击查看代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    li {
      list-style: none;
      border: 1px solid #ccc;
    }

    .box {
      width: 800px;
      height: 680px;
      margin: 0 auto;
      background-color: rgb(235, 230, 230);
    }

    .dragBox {
      display: flex;
      width: 100%;
      height: 60%;
      flex-wrap: wrap;
      justify-content: space-around;
      align-items: space-between;

    }

    .dragDiv {
      width: 100px;
      height: 100px;
      border-radius: 100px;
      line-height: 100px;
      text-align: center;
      border: 1px solid rgb(80, 77, 77);
      background-color: #7d7a7a;
    }

    .dragCss {
      border: 1px solid blue;
      opacity: 0.5;
    }

    .dropDiv {
      display: flex;
      justify-content: space-around;
      align-items: center;
      width: 80%;
      height: 30%;
      margin: 0 auto;
      border: 1px solid #000;
      background-color: burlywood;
    }

    .dropCss {
      background-color: yellow;
    }
  </style>
</head>

<body>
  <div class="box">
    <h2 style="text-align:center">点餐系统</h2>
    <ul class="dragBox">

    </ul>
    <h2 style="text-align:center">盘子</h2>
    <div class="dropDiv"></div>
  </div>
</body>
<script>
  const foodList = ['火锅', '北京烤鸭', '兰州拉面', '成都冷串串', '重庆酸辣粉', '武汉热干面', '西安肉夹馍', '长沙口味虾', '广东肠粉', '小笼包', '桂林米粉', '柳州螺蛳粉', '天津煎饼果子', '山东煎饼', '东北锅包肉', '福建佛跳墙', '河南烩面', '山西刀削面', '南昌瓦罐汤', '河北驴肉火烧', '手抓饼']
  const dropNode = document.querySelector('.dropDiv')
  const ul = document.querySelector('.dragBox')
  let fragment = document.createDocumentFragment()
  foodList.forEach(item => {
    let li = document.createElement('li')
    li.innerText = item
    li.classList.add('dragDiv')
    li.draggable = 'true'
    fragment.appendChild(li)
  })
  ul.appendChild(fragment)
  // 1.准备工作,先将foodList渲染到ul中
  const dragNodes = document.querySelectorAll('.dragDiv')
  let dragNode = null
  dragNodes.forEach(node => {
    node.addEventListener('dragstart', function (e) {
      console.log('开始拖拉')
      dragNode = e.target
      e.target.classList.add('dragCss')
    })
    node.addEventListener('dragend', function (e) {
      e.target.classList.remove('dragCss')
    })
  })



  dropNode.addEventListener('dragenter', function (e) {
    dragNode.classList.remove('dragCss')
    e.target.classList.add('dropCss')
  })

  dropNode.addEventListener('dragover', function (e) {
    e.preventDefault()
  })
  dropNode.addEventListener('dragleave', function (e) {
    e.target.classList.remove('dropCss')
  })

  dropNode.addEventListener('drop', function (e) {

    if (e.target.children.length > 3) {
      e.target.classList.remove('dropCss')
      alert('最多只能点四个菜哦~')
      return
    }
    let newNode = dragNode.cloneNode(true)
    e.target.classList.remove('dropCss')
    e.target.appendChild(newNode)

  })
</script>

</html>
// 本人才疏学浅 如有错误 请指出 谢谢!

参考

dragable

标签:触发,target,对象,拖拉,h5,drag,事件,classList,点餐
From: https://www.cnblogs.com/zx529/p/16885479.html

相关文章

  • 不一样的纯H5C3动画爱心
    最近抖音很火的让你会计算机的朋友给你做个爱心突然火了,我也不出意外的收到了朋友的邀请,自己做肯定太麻烦了于是乎百度第一步,惊呆了!网上全都是一个爱心,变着法的火焰爱......
  • 前端 Notes | H5 打开 App 并跳转指定页(Android/iOS)最 low 实现
    还是技术的世界简单,除了0就是1。前言之前接到一个任务,大概细分如下:H5调起App(Android/iOS)并打开对应页面;如果应用未安装,则提示用户进行下载;微信打开该链接分享好友展示......
  • CH58X/CH57X/V208 Observer(观察者)例程讨论讲解
    使用的是沁恒的CH582M的Observer例程与官方的demo板。本例程的功能是主机扫描到从机的MAC地址并打印出来。先对宏定义进行理解讨论。 最大响应扫描数为8,在串口调试助......
  • 大型CRM客户管理系统带小程序、H5 java源码(spring boot 后台 前端vue)
    CRM功能介绍1、系统管理:员工管理、角色管理、菜单管理、部门管理、岗位管理、字典管理、参数设置、日志管理2、系统监控:在线用户、定时任务、数据监控、服务监控3、系统工......
  • Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)
    一般在外卖的选单中常常会用到ListView的多选,大家可以改进后加入自己的项目中。下面看一下代码:一、代码1.main.xml:(由一个ListView和一个Button组成)<?xmlversion="1.0"enc......
  • MSE 结合 Dragonwell,让 Java Agent 更好用
    作者:卜比背景随着越来越多的云原生微服务应用的大规模部署,大家对微服务治理的能力需求越来越长。JavaAgent技术能够让业务专注于业务逻辑,与此同时,中间件通过JavaAge......
  • H5解决iOS下刘海屏的问题
    全面屏手机把整个webview(包括状态栏)给H5的话,头部的返回按钮会置于页面的安全区外,会盖住header区域,导致无法后退等其他操作。先说下constant函数iOS11新增特性,Webkit的......
  • cafffe 利用h5py生成多标签h5文件并训练
    h5py生成多标签h5文件importh5pyimportnumpyasnpdefmain():f=h5py.File('train00.h5','w')f.create_dataset('data',(1200,128),dtype='f8')f.create_data......
  • H5游戏开发-面向对象编程
    七、面向对象编程1.认识类与对象类是一种复杂的数据结构,他是将不同类型的数据与这些数据相关的操作封装在一起的集合体。对象是类的实例,是类描述的具体事物。(类是对象的......
  • H5游戏开发-TypeScript语言基础
    五、TypeScript语言基础1.认识TypeScriptTypeScript是一种由微软开发的开源的编程语言,它是js的一个超集,向js添加了静态类型和基于类的面向对象。2012年10月,微软发布了首......