动态调整 SVG 多边形的大小和拖动

2024-02-13

我正在努力寻找一种用鼠标动态调整 svg 多边形大小和拖动多边形的方法。不幸的是 jQueryUi 不适用于 svg 元素。我还检查了拉斐尔库,但找不到任何有关如何实现这一点的文档/片段。

除了使用 SVG 之外,还有其他方法可以动态调整多边形图形的大小和拖动吗?


您可以自己使用 SVG 元素。特别是,您可以找到多边形的点并添加可使用 jQuery 拖动的 HTML 元素句柄。 (我假设您遇到的问题是 jQuery UI 不适用于 SVG 定位模型。)这是我刚刚编写的完整示例(在 Safari 5 和 Firefox 9 中测试)。

(免责声明:我不是 jQuery 的普通用户;除了不使用 jQuery 做所有事情之外,这段代码可能在某些方面不符合习惯。)

<!DOCTYPE html>
<html><head>
  <title>untitled</title>

  <style type="text/css" media="screen">
    .handle {
      position: absolute;
      border: 0.1em solid black;
      width: 1em;
      height: 1em;
    }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>

  <script type="text/javascript">
  function draggablePolygon(polygon) {
    var points = polygon.points;
    var svgRoot = $(polygon).closest("svg");
    
    for (var i = 0; i < points.numberOfItems; i++) {
      (function (i) { // close over variables for drag call back
        var point = points.getItem(i);

        var handle = document.createElement("div");
        handle.className = "handle";
        document.body.appendChild(handle);

        var base = svgRoot.position();
        // center handles over polygon
        var cs = window.getComputedStyle(handle, null);
        base.left -= (parseInt(cs.width) + parseInt(cs.borderLeftWidth) + parseInt(cs.borderRightWidth))/2; 
        base.top -= (parseInt(cs.height) + parseInt(cs.borderTopWidth) + parseInt(cs.borderBottomWidth))/2; 

        handle.style.left = base.left + point.x + "px";
        handle.style.top = base.top + point.y + "px";

        $(handle).draggable({
          drag: function (event) {
            setTimeout(function () { // jQuery apparently calls this *before* setting position, so defer
              point.x = parseInt(handle.style.left) - base.left;
              point.y = parseInt(handle.style.top) - base.top;
            },0);
          }
        });
      }(i));
    }
  }
  </script>
</head><body>
  <p>
    (Offset to test)
    <svg id="theSVG" width="500" height="500" style="border: 2px inset #CCC;">
      <polygon id="x" points="200,200 100,100 100,1" fill="green" />
      <polygon id="y" points="200,200 100,100 1,100" fill="red" />
    </svg>
  </p>
  <script type="text/javascript">
    draggablePolygon(document.getElementById("x"));
    draggablePolygon(document.getElementById("y"));
  </script>

</body></html>

您还可以将事件处理程序附加到 SVG 多边形并实现拖动(我测试过,这可以工作),但是您必须在多边形的当前边界内单击,这是一个非典型的 UI,可能很棘手,并实现您的自己的命中测试。

为此,您需要添加一个onmousedown多边形元素的处理程序。然后检索它的点,找到点击位置范围内的点,存储鼠标初始位置,然后得到一个onmousemove处理程序修改x and y当鼠标位置改变时,该点的位置。

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

动态调整 SVG 多边形的大小和拖动 的相关文章

  • SVG 文本无法在 Chrome 或 Safari 中呈现

    我有一些 SVG 文本在 Firefox 上运行良好 但在 Chrome 和 Safari 中却没有出现 我努力了 向 svg 容器添加填充 以防文本被隔断 从文本中删除 xml space preserve 添加内联填充颜色
  • Chrome 扩展程序可以相互通信吗?

    我正在编写一个Chrome扩展程序 并且想要实现一个接口或api 以便我将来制作的其他扩展程序可以使用它 最终的效果可能如下 分机 B 呼叫extensionA someMethod someParameters 并向分机A发送一些数据 分
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • Dialogflow Fulfillment Webhook 调用失败

    I am new to dialogflow fulfillment and I am trying to retrieve news from news API based on user questions I followed doc
  • 需要参数的addEventListener(和removeEventListener)函数

    我需要向 8 个对象 手掌 添加一些侦听器 这些对象是相同的 但行为必须根据它们的位置而改变 我有以下 丑陋的 代码 root palmsStatus B B B B B B B B if root palmsStatus 0 N root
  • 如何将类型添加到 Vite 库构建中?

    我按照vite文档使用图书馆模式 https vitejs dev guide build html library mode我能够生成一个工作组件库 我创建了该项目vue ts预设 在我的组件中 我定义了道具及其类型 并使用了一些接口 但
  • Pjax动画

    我终于让 pjax 工作了 但我还有另一个问题 如何添加一些 jquery 动画 如淡出 幻灯片旧内容和淡入 幻灯片新内容 默认情况下 pjax 只是更改内容 没有任何好看的效果 任何帮助将非常感激 此致 基本上 你有一堆事件 https
  • Node.js Express 4.0 中的 res.render 回调参数的用途是什么?

    目的是什么res render回调参数 在什么情况下 由于模板已被指定为第一个参数 因此人们会想要使用这样的回调参数 这是文档中的代码 send the rendered view to the client res render inde
  • fadeOut() 和slideUp() 同时进行?

    我已经发现jQuery 淡出然后滑动 https stackoverflow com questions 734554 jquery fadeout then slideup这很好 但不是那个 我怎么能够fadeOut and slideU
  • Next.js:错误:React.Children.only 期望接收单个 React 元素子元素

    我有一个名为Nav inside components目录及其代码如下所示 import Link from next link const Nav gt return div a Home a a About a div export d
  • JSONP 使用 JQuery 从 HTTPS 协议获取 JSON

    我正在尝试获取从 https 安全站点发送的 JSON 客户端希望不要使用任何服务器端语言 全部都是 Javascript 我读到 当使用 Jquery 中的 ajax 函数时 我必须使用 JSONP 才能从安全站点加载 JSON 我的第一
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • Vue-Router 抽象父路由

    我正在尝试将当前网站迁移到 vuejs 站点地图必须是 login signup password reset browse search dozens of other routes 由于其中一些路线共享大量 fx 因此我将它们设为父路线
  • 使用ExternalInterface和IE从JavaScript获取Flash中的当前URL

    我正在尝试获取 Flash 播放器当前所在的 URL 不是 swf 文件的 URL 而是浏览器指向的 URL 到目前为止我已经使用过 var st String ExternalInterface call window location
  • 使用 File API polyfill 读取数据 URL

    我正在尝试使用文件 API 库 https github com mailru FileAPI https github com mailru FileAPI 作为不支持文件 API 的浏览器的后备 以便将文件作为数据 URL 读取并将其传
  • 将 JSON 属性绑定到表单

    我有一个 JSON 对象和一个
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti
  • Chrome 调试器注入 javascript

    我有这样的好奇心 是否可以以某种方式在我的页面中注入 javascript 并执行它并调试它 正如您在控制台中所做的那样 但在控制台中您无法暂停并观察变量 是否可以调试我通过控制台输入的代码 为什么无法调试通过 XHR 接收的代码 Than
  • 为什么 try catch 块没有捕获 Promise 异常?

    我对承诺的错误处理感到困惑 答案可能很明显 但我不明白 我有以下示例代码 var test async function throw new Error Just another error try test then catch err

随机推荐

  • 如何使用 angular-cli (6.x) 创建 mono-repo 项目结构

    我想使用 angular cli 生成一个新的工作区 目前执行此操作的唯一方法是运行 ng new asdf cd asdf ng g application whatever 但随后所有的src 文件仍然存在 以及现在存储不一致的项目的原
  • JPA @Entity继承

    我一直在研究 JPA Hibernate Entity继承有一段时间了 似乎找不到任何可以解决我想要实现的目标的东西 基本上我希望能够定义一个 Entity根据需要包含所有列和表映射 然后我希望能够延长 Entity在许多不同的地点 有不同
  • 通过 WinAPI 确定 Intel HD 显卡版本

    因此 我尝试通过 WinAPI 函数获取有关显卡的信息 但有一个关于如何获取确切的卡信息的问题 我已经编写了调用 EnumDisplayDevices 的代码 并通过我的调用收到了 DeviceString Intel R HD Graph
  • C 宏,求两个数中的最小值

    我想用 define 创建一个简单的宏来返回两个数字中较小的一个 我怎样才能在 C 中做到这一点 提出一些想法 看看是否可以让它变得更加混乱 通常 define min a b a lt b a b 请注意 这会评估最小值两次 这是灾难的原
  • Python 或 C/C++ 中的 RTSP 库?

    我正在尝试寻找任何适用于 Python 或 C C 的 RTSP 流媒体库 如果没有 还有其他实时流解决方案吗 在 Python 或 C C 中实现 RTSP 有多容易或困难以及从哪里开始 try live555 http www live
  • 具有多重索引的 Pandas 划分 (.div)

    我有类似的东西 df pd DataFrame np random randint 2 10 size 5 2 df index pd MultiIndex from tuples 1 A 2 A 4 B 5 B 8 B df index
  • TransformerFactory - 避免网络查找来验证 DTD

    我需要为 XML 文档的离线转换进行编程 当使用以下命令加载原始 XML 文件时 我已经能够停止 DTD 网络查找 DocumentBuilderFactory factory factory DocumentBuilderFactory
  • 使用 libcurl 而不使用 dll

    我正在使用 Microsoft Visual C 2010 我需要制作一个不需要 libcurl dll 的应用程序 我在预处理器指令中定义 CURL STATICLIB 并链接到 libcurl lib libcurl static li
  • Nivo 滑块 + php

    我为网站创建了一个自定义 cms 并尝试使 nivo 滑块与我的数据库配合使用 但我的 while 循环出现问题 我只将图像的名称存储在数据库中 而图像本身存储在文件夹中 图像可以正常工作 但它们显示在实际幻灯片的上方 而实际的幻灯片已损坏
  • 如何使用 php 覆盖 Apache keep-alive 标头?

    在我的 httpd conf 中有 KeepAliveTimeout 1 我正在尝试覆盖 Apache KeepAliveTimeout 设置singlephp 脚本 不在整个服务器中 所以我有一个 php 脚本 header Keep A
  • 为什么使用“youtube.com/v”的 YouTube 视频无法加载

    请查阅这一页 http www islandcricket lk videos sri lanka cricket it feels great mathews talks about test series victory against
  • PHP shell_exec - 如果连接关闭如何终止进程?

    我有一个可用的 php 脚本 使用 shell exec 来执行一个外部程序 大约需要 30 秒才能完成 问题是 如果用户关闭浏览器或由于某种原因关闭连接 则使用 shell exec 执行的程序将继续运行 因为它的输出无法再发送给用户 有
  • 将 Qt 与 Visual Studio Code 结合使用 (Windows)

    安装了以下内容 Visual Studio 代码 1 45 1 Visual Studio 2019 Community 为了使用 MSVCcl exe编译器 Qt 5 15 0 安装到 C Qt Visual Studio Code运行后
  • Ping 与“连接”到远程服务器[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 什么情况下会无法使用以下命令 ping 通远程服务器ping命令 但仍然能够通过其他方式连接到它 只要它仍然是 TCP IP ping
  • 相当于“pip”的“package.json”和“package-lock.json”

    包管理器JavaScript like npm and yarn use a package json指定 顶级 依赖项 并创建一个锁定文件 https docs npmjs com files package locks跟踪特定版本all
  • 使用 dplyr::filter() 删除 NA 观测值

    我的数据如下所示 library tidyverse df lt tribble a b c 1 2 3 1 NA 3 NA 2 3 我可以删除所有NA观察与drop na df gt drop na 或者全部删除NA单列中的观察值 a例如
  • 调用 Isolate::New() 后执行位置 0x0000000000000000 时发生访问冲突

    我似乎无法弄清楚如何启动 V8 我有这个代码 if V8Initialized v8 V8 InitializeICU v8 V8 InitializeExternalStartupData x86 this loads ok I chec
  • HTML5可以指定滚动条图像吗?

    我需要显示自定义滚动条 如果可能的话 我想避免使用 jQuery 插件 那么我可以用 HTML5 和 CSS3 来做这样的事情吗 myScrollableBox width 200px height 500px Display scroll
  • 如何根据草图值计算 TextView 的 letterSpacing?

    在设计中 我有一个文本字段 文本大小为 16 字符间距为 0 6 但是 如果我设置这个值android letterSpacing的属性TextView间距将比设计时大得多 那么 将sketch值转换为android值的方法是什么呢 根据
  • 动态调整 SVG 多边形的大小和拖动

    我正在努力寻找一种用鼠标动态调整 svg 多边形大小和拖动多边形的方法 不幸的是 jQueryUi 不适用于 svg 元素 我还检查了拉斐尔库 但找不到任何有关如何实现这一点的文档 片段 除了使用 SVG 之外 还有其他方法可以动态调整多边