如何创建 JQuery / svg 单击拖动选择轮廓效果?

2023-12-19

不知道到底该怎么称呼它,但我正在寻找一种方法,当您单击并拖动某个区域时,通过 javascript/svg 创建点线轮廓/选择框效果,然后在 mouseUp 上消失(如果它可以添加)不是原装部件)。

如果有 jQuery 库就好了。我环顾四周,并没有找到我想要的东西。
我想理论是从第一次单击中获取坐标,跟踪鼠标坐标时刻并相应地调整框。

但不从头开始写就很好了。


这是我专门为你制作的演示:)

演示(静态):http://jsfiddle.net/HNH2f/1/ http://jsfiddle.net/HNH2f/1/

演示(动画):http://jsfiddle.net/HNH2f/2/ http://jsfiddle.net/HNH2f/2/

您可以使用 CSS 来控制选取框的视觉样式。 您可以将一两个函数传递给trackMarquee方法;两者都将使用四个参数进行调用:选取框的 x1、y1、x2、y2 边界。当选取框被释放时,将调用第一个函数。每次选取框移动时都会调用第二个函数(如果存在)(例如,这样您就可以计算该边界框中有哪些项目)。

当您开始拖动 SVG 文档(或您选择跟踪的任何元素)时,它将创建一个<rect class="marquee" />;拖动过程中,它将调整矩形的大小。使用 CSS(如演示中所示)根据需要设置此矩形的样式。我正在使用stroke-dasharray http://www.w3.org/TR/SVG/painting.html#StrokeDasharrayProperty属性使边框点缀。

对于 Stack Overflow 的后代,这里是代码(万一 JSFiddle 宕机了):

(function createMarquee(global){
  var svgNS = 'http://www.w3.org/2000/svg',
      svg   = document.createElementNS(svgNS,'svg'),
      pt    = svg.createSVGPoint();

  // Usage: trackMarquee( mySVG, function(x1,y1,x2,y2){}, function(x1,y1,x2,y2){} );
  // The first function (if present) will be called when the marquee is released
  // The second function (if present) will be called as the marquee is changed
  // Use the CSS selector `rect.marquee` to select the marquee for visual styling
  global.trackMarquee = function(forElement,onRelease,onDrag){
    forElement.addEventListener('mousedown',function(evt){
      var point0 = getLocalCoordinatesFromMouseEvent(forElement,evt);
      var marquee = document.createElementNS(svgNS,'rect');
      marquee.setAttribute('class','marquee');
      updateMarquee(marquee,point0,point0);
      forElement.appendChild(marquee);
      document.documentElement.addEventListener('mousemove',trackMouseMove,false);
      document.documentElement.addEventListener('mouseup',stopTrackingMove,false);
      function trackMouseMove(evt){
        var point1 = getLocalCoordinatesFromMouseEvent(forElement,evt);
        updateMarquee(marquee,point0,point1);
        if (onDrag) callWithBBox(onDrag,marquee);
      }
      function stopTrackingMove(){
        document.documentElement.removeEventListener('mousemove',trackMouseMove,false);
        document.documentElement.removeEventListener('mouseup',stopTrackingMove,false);
        forElement.removeChild(marquee);
        if (onRelease) callWithBBox(onRelease,marquee);
      }
    },false);
  };

  function callWithBBox(func,rect){
    var x = rect.getAttribute('x')*1,
        y = rect.getAttribute('y')*1,
        w = rect.getAttribute('width')*1,
        h = rect.getAttribute('height')*1;
    func(x,y,x+w,y+h);
  }

  function updateMarquee(rect,p0,p1){
    var xs = [p0.x,p1.x].sort(sortByNumber),
        ys = [p0.y,p1.y].sort(sortByNumber);
    rect.setAttribute('x',xs[0]);
    rect.setAttribute('y',ys[0]);
    rect.setAttribute('width', xs[1]-xs[0]);
    rect.setAttribute('height',ys[1]-ys[0]);
  }

  function getLocalCoordinatesFromMouseEvent(el,evt){
    pt.x = evt.clientX; pt.y = evt.clientY;
    return pt.matrixTransform(el.getScreenCTM().inverse());
  }

  function sortByNumber(a,b){ return a-b }
})(window);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建 JQuery / svg 单击拖动选择轮廓效果? 的相关文章

随机推荐

  • 如何在多个GWT eclipse项目之间共享代码?

    我希望有多个共享通用代码的 GWT 项目 这可能吗 AFAICT 我的 GWT 项目需要每个都有自己的目录 源代码直接在下面 这似乎排除了代码共享 我尝试使用链接文件夹 但 GWT 似乎不喜欢那样 描述here https stackove
  • 计算 Windows 中字形的位置

    是否有任何简单且兼容的 GDI 或 NET 可访问的 Windows 子系统可以提供字形位置字符 这里的任务是组合符号 例如阿拉伯语中的符号 有时有多个组合符号链堆叠在一起 例如阿拉伯语 Fatha 阿拉伯字母上标 Alef 阿拉伯语 Ma
  • 划分数据框列然后四舍五入

    我一直在操作一些数据框 但不幸的是我有两个百分比列 一个的格式为 61 72 另一个的格式为 0 62 我只想将 61 72 格式的百分比列除以 100 然后将其舍入为 2 dp 以便与数据框一致 有一个简单的方法可以做到这一点吗 我的数据
  • RxJS的combineLatest函数可以从rxjs和rxjs/operators导入,两者有什么区别?

    The 结合最新函数可以从以下位置导入rxjs和来自rxjs 运算符 当我导入它时rxjs 运算符 就像我导入合并所有我收到以下错误 TS2339 Property subscribe does not exist on type Oper
  • 如何解除特定事件处理程序的绑定

    Code Inputfield keyup function e if e which 13 functionXyz else functionZyx document keyup function exit if exit keyCode
  • 连接两个 mysql 表

    我有两个数据库 一个用于文章 另一个用于文章的元信息 如作者 日期 类别和 atc 我在元表中有以下列 ID 文章 ID 元类型和元值 我想知道如何连接这两个表以通过一个 mysql 查询同时获取文章和元信息 文章 ID 在元表中不是唯一的
  • 是什么“魔力”导致在 IE11 中输入“cnn.com”自动启动 Edge (Chromium)?

    I just noticed that when I typed in cnn com into the IE11 address bar Windows 10 that it automatically launched the webs
  • Angular 2:检查反应形式的输入是否为空,如果没有给出输入则输入默认值

    Edit 2 对部分解决方案进行了改进 现在它是一个完整的解决方案 耶 Edit 找到了一个几乎完整的解决方案 它有效 但不完全是我想要的方式 它从加载表单的那一刻起就设置默认值 不理想 如果输入为空 已删除 它不再返回 null 而是返回
  • Chrome 中的 GIF 图像加载缓慢和/或其他问题 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在使用 Chrome 和动画 Gif 时遇到问题 它们冻结 加载缓慢 显示屏幕撕裂动画等 1 Type chrome plugins进入
  • 使用 python 按 +- 边距分组

    使用 python 按 边距分组 我想根据边距 1 1 和 10 2 对由 2 列 1 2 组成的数据框进行分组 例如 273 10 274 14 275 15 我希望它的结果是 273 10 274 14 274 14 275 15 但我
  • chrome ARC-Welder javascript 控制台插件未定义

    我安装了 ARC Welder 来测试运行我的 Android 应用程序 应用程序运行 但我试图获取日志 我读过这篇文章 https developer chrome com apps getstarted arc https develo
  • 加密性能

    我正在加密一些数据 并在系统之间的脚本运行时间中获得截然不同的结果 在 win7 机器上运行我的算法 加密在 3 8 千秒内完成 在 Linux ubuntu 11 和 debian 6 机器 上执行相同的代码需要 7 到 35 秒 这对于
  • 如何设置AWS SNS和SQS以实现高可用性?

    SNS 问题 我目前正在使用 pythonboto3 http boto3 readthedocs io en latest index htmlSNS 库 例如创建主题 订阅主题 将 SNS 发送到主题 当我使用Resource http
  • 使用 192.168.0.0/16 或其他 iprange 作为 kubernetes + flannel 的 pod cidr

    在教程中https kubernetes io docs setup independent create cluster kubeadm https kubernetes io docs setup independent create
  • 使用 VBA 刷新 Excel 中对 VBProject.VBComponents 所做的更改

    我在以编程方式删除模块然后从文件中重新导入它们时 在 Excel 中遇到了一些奇怪的问题 基本上 我有一个名为 VersionControl 的模块 该模块应该将我的文件导出到预定义的文件夹 并根据需要重新导入它们 这是重新导入的代码 其问
  • Spring 表达式语言 美元 vs 哈希($ vs #)

    我对何时使用有点困惑 相比 Spring文档仅使用 我需要知道何时使用 什么时候 我可以用吗 在 MVC JSP 页面中 根据这个答案 https stackoverflow com a 5322737 814702 is the 属性占位
  • 在哪里选择线性搜索而不是二分搜索

    在搜索互联网后 我无法让自己满意 因为我发现了一系列全面的情况 在这些情况下线性搜索比二分搜索更可取 我本质上想知道是否有可能编制一份相对明确的建议列表 从行业中可能发现的通用编程的角度来看 或者 如果可以证实我确实已经看到了有关该主题的所
  • ASP.NET 错误的事件日志源属性的自定义值

    默认情况下 ASP NET 将所有未捕获的异常记录到系统事件日志中 我知道应该有一个适当的日志记录设施 但这总比没有好 而且它可以作为一种临时解决方案 我希望能够有效地过滤日志中的事件 我了解到 以编程方式记录时 您可以通过以下方式为事件日
  • 有没有一种有效的方法来获取 NumPy 矩阵中除特定列之外的最大元素的位置?

    例如 有一个 2d Numpy 矩阵M 1 10 3 4 15 6 除以下元素外的最大元素M 1 is 6 其位置为 1 2 所以答案是 1 2 非常感谢您的帮助 One way col 1 skip col np delete x col
  • 如何创建 JQuery / svg 单击拖动选择轮廓效果?

    不知道到底该怎么称呼它 但我正在寻找一种方法 当您单击并拖动某个区域时 通过 javascript svg 创建点线轮廓 选择框效果 然后在 mouseUp 上消失 如果它可以添加 不是原装部件 如果有 jQuery 库就好了 我环顾四周