dart - 在 Dart 中通过拖动来移动元素

标签 dart dart-html

我正在尝试使用拖放来移动元素。我希望能够将元素拖动到不同的位置,当我放下它时,元素会移动到放下的位置。 super 基本,没什么花哨的。这是我到目前为止所拥有的:

html:

<input type='button' id='drag' class='draggable' value='drag me' draggable='true'>

Dart 代码:

Element drag = querySelector('.draggable');
drag.onDragEnd.listen((MouseEvent e) {
  drag.style.left = '${e.client.x}px';
  drag.style.top = '${e.client.y}px';
});

这并没有完全达到我想要的效果。该元素与我放置它的位置略有偏离。我在 javascript 中看到了带有appendChild、clone()、parentNode 的示例,但是我所看到的示例都不能在 Dart 中重现。实现这一目标的最佳方法是什么?我不想使用 DND 包,因为我真的想亲自更好地理解这些概念。

最佳答案

index.html

<!doctype html>
<html>
  <head>
    <style>
      #dropzone {
        position: absolute;
        top: 50px;
        left: 50px;
        width: 300px;
        height: 150px;
        border: solid 1px lightgreen;
      }
      #dropzone.droptarget {
        background-color: lime;
      }
    </style>
  </head>
  <body>
    <input type='button' id='drag' class='draggable' value='drag me'
           draggable='true'>

    <div id="dropzone"></div>
    <script type="application/dart" src="index.dart"></script>
    <script src="packages/browser/dart.js"></script>
  </body>
</html>

index.dart

library _template.web;

import 'dart:html' as dom;
import 'dart:convert' show JSON;

main() async {
  dom.Element drag = dom.querySelector('.draggable');
  drag.onDragStart.listen((event) {
    final startPos = (event.target as dom.Element).getBoundingClientRect();
    final data = JSON.encode({
      'id': (event.target as dom.Element).id,
      'x': event.client.x - startPos.left,
      'y': event.client.y - startPos.top
    });
    event.dataTransfer.setData('text', data);
  });

  dom.Element dropTarget = dom.querySelector('#dropzone');
  dropTarget.onDragOver.listen((event) {
    event.preventDefault();
    dropTarget.classes.add('droptarget');
  });

  dropTarget.onDragLeave.listen((event) {
    event.preventDefault();
    dropTarget.classes.remove('droptarget');
  });

  dropTarget.onDrop.listen((event) {
    event.preventDefault();
    final data = JSON.decode(event.dataTransfer.getData('text'));
    final drag = dom.document.getElementById(data['id']);
    event.target.append(drag);
    drag.style
      ..position = 'absolute'
      ..left = '${event.offset.x - data['x']}px'
      ..top = '${event.offset.y - data['y']}px';
    dropTarget.classes.remove('droptarget');
  });
}

关于dart - 在 Dart 中通过拖动来移动元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33360151/

相关文章:

RangeSlider 上的 Flutter RangeLabels 不起作用

inheritance - 如何正确代理 "inherited"静态方法?

radio-button - Dartlang:使用不同数量的单选按钮创建表行

dart - 在 Dart 中必须 element.html ("") 出现在 body 标签的上下文中吗?

file-upload - dart上传文件输入类型文件

css - 如何在 flutter/dart 中使用设定大小的自定义字体?

flutter - 为什么该列占用其父级(容器)的全宽

flutter - 如何在左上方对齐 ListView 项?

dart:如何在 iframe 中获取对文档对象的正确(类型化)引用

dart - 字符串比较不适用于从网络抓取中收到的文本