Raphael 路径调整大小并相对于容器移动

2023-12-07

我正在尝试缩放/移动使用 Raphael api 创建的 SVG 路径。我希望路径能够整齐地适合容器,无论容器有多大。我已经搜索了参考资料、网络,但我仍然在努力让它发挥作用。

如果有人能告诉我为什么这不起作用,我会很高兴。

这个小提琴向你展示了我在做什么:http://jsfiddle.net/tolund/3XPxL/5/

JavaScript:

var draw = function(size) {
    var $container = $("#container").empty();
    $container.css("height",size+"px").css("width",size+"px");

    var paper = Raphael("container");

    var pathStr = "M11.166,23.963L22.359,17.5c1.43-0.824,1.43-2.175,"+
        "0-3L11.166,8.037c-1.429-0.826-2.598-0.15-2.598,"+
        "1.5v12.926C8.568,24.113,9.737,24.789,11.166,23.963z";

    // set the viewbox to same size as container
    paper.setViewBox(0, 0, $container.width(), $container.height(), true);

    // create the path
    var path = paper.path(pathStr)
        .attr({ fill: "#000", "stroke-width": 0, "stroke-linejoin": "round", opacity: 1 });

    // get the path outline box (may be different size than view box.
    var box = path.getBBox();

    // move the path as much to the top/left as possible within container
    path.transform("t" + 0 + "," + 0);

    // get the width/height based on path box relative to paper (same size as container)
    var w = (paper.width) / box.width;
    var h = (paper.height) / box.height;

    // scale the path to the container (use "..." to compound transforms)
    path.transform('...S' + w + ',' + h + ',0,0');
}

$(function() {
    var currentSize = 30;
    draw(currentSize);

    $("#smaller").click(function(){ 
        currentSize = currentSize < 10 ? currentSize : currentSize * 0.5;
        draw(currentSize);
    });
    $("#bigger").click(function(){ 
        currentSize = 300 < currentSize ? currentSize : currentSize * 2; 
        draw(currentSize);
    });
});

HTML:

<button id="smaller">-</button>
<button id="bigger">+</button>

<div id="container" style="border: 1px #ddd solid; margin: 30px">

</div>

谢谢, 托盖尔。


我认为您的问题是对视图框用途的根本误解。在代码中,您尝试设置 svg 元素的视图框,使其与屏幕的坐标空间匹配,然后转换路径以匹配该坐标空间。没有任何技术原因你不能这样做,但它确实有效地将“可扩展”从“可扩展矢量图形”中剔除出来。视图盒的全部目的是使矢量坐标空间和屏幕之间相对平移。

那么,解决问题的最佳方法不是转换路径以匹配 SVG 元素,而是使用视图框让 SVG 固有的可扩展性为您完成此操作。

首先要做的事情是:创建您的路径,以便我们有一个可以使用的对象。此时我们并不关心视图框是什么。

var pathStr = "...";  // The content of the path and its coordinates are completely immaterial

var path = paper.path(pathStr)
    .attr({ fill: "#000", "stroke-width": 0, "stroke-linejoin": "round", opacity: 1 });

现在我们需要做的就是使用视图框将 SVG“聚焦”在我们感兴趣的坐标空间上。

var box = path.getBBox();    
var margin = Math.max( box.width, box.height ) * 0.1;  //  because white space always looks nice ;-)
paper.setViewBox(box.x - margin, box.y - margin, box.width + margin * 2, box.height + margin * 2);   

就是这样。 SVG(无论其大小)将从视图框中指定的内部坐标转换为屏幕上的物理坐标。

这是你的小提琴叉子概念验证.

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

Raphael 路径调整大小并相对于容器移动 的相关文章

随机推荐

  • 页面加载超时 - 使用 C# 的 Selenium Webdriver

    我正在使用 Selenium 2 25 WebDriver 我在查找页面上的元素时遇到问题 有时我的测试用例能够找到元素 有时页面未加载 这是由于页面加载所致 如果我在下面添加此行 它似乎可以工作 driver Manage Timeout
  • 无法加载库 plpython3.dll

    我在 Postgresql 版本 10 中创建扩展时遇到错误 无法加载库 C Program Files PostgreSQL 10 lib plpython3 dll 找不到指定的模块 CREATE EXTENSION plpython3
  • 我如何/我可以通过 JavaScript 访问 sessionid cookie?

    我已经安装了 jquery 的 cookie 扩展 并且正在尝试访问会话 id cookie 我的会话当前有两个 cookie 请参阅下面的屏幕截图 然而 cookie 只列出了一个 gt cookie Object csrftoken f
  • Rcpp:处理 NumericMatrix 时,* 的语法糖会产生意想不到的结果

    最近被问到的一个问题让我相信语法糖 by Rcpp不按预期工作 在链接的问题中 用户试图将矩阵乘以标量 R code 这就是我们想要实现的目标Rcpp 但现在简单地说R gt m lt matrix 0 3 2 2 gt m 3 1 2 1
  • 旋转轴刻度标签

    我不知道如何在 X 轴上旋转文本 它是一个时间戳 因此随着样本数量的增加 它们会越来越近 直到重叠 我想将文本旋转 90 度 这样当样本靠得更近时 它们就不会重叠 下面是我所拥有的 它工作正常 但我不知道如何旋转 X 轴文本 import
  • 计算每年两个日期之间的天数

    我有一个数据框 每行都有开始日期和结束日期 我想计算两个日期之间的天数并按年份分割 所以从这里开始 id lt c 1 2 3 start lt as Date c 01 01 2015 01 01 2016 07 01 2015 form
  • JWT 的安全性如何

    我知道这个问题不是什么新鲜事 可能已经在互联网上讨论过 我是新手 但经过一些研究 我同意它是安全的 因为匿名可以嗅探令牌但无法在其上附加任何内容 我计划将 JWT 存储在 HTML5Storage 中 并解码有效负载以获取一些不敏感信息 D
  • WCF IErrorHandler 扩展未返回指定的故障

    希望有一些 WCF 向导能够发现我的错误 我正在尝试通过 RESTful JSON WCF 服务上基于 IErrorHandler 的行为扩展来设置全局错误处理程序 该方法被修饰如下 OperationContract WebGet Uri
  • 用户脚本隐藏跨域 iframe 的子节点

    我想通过 Tampermonkey 用户脚本隐藏其中包含一些单词的注释 作为一个例子 我尝试应用一个脚本 UserScript name Hide CNN match http www cnn com require http ajax g
  • 我可以将 varbinary 的最大大小设置为 2 MB 吗?

    据我所知 您可以 手动 定义的最大值是8000 gt varbinary 8000 据我所知 这意味着8000 bytes gt 7 8125 KByte 是否可以将 max 设置为2 MB 类似的东西varbinary 2097152 或
  • 通过其内部字段获取枚举

    有带有内部字段的枚举 类似地图 现在我需要通过其内部字段获取枚举 写了这个 package test Test enum to test enum public enum TestEnum ONE 1 TWO 2 THREE 3 priva
  • node.js 相当于 python 的 if __name__ == '__main__' [重复]

    这个问题在这里已经有答案了 我想检查我的模块是否被包含或直接运行 我怎样才能在node js中做到这一点 Node js 文档描述另一种方法来做到这一点 这可能是首选方法 当文件直接从 Node 运行时 require main 将设置为其
  • 配置:错误:C编译器无法创建可执行文件-Buildozer kivy到android调试

    输入我的问题 他们可以跳过它 您好 我正在尝试编译 apk 应用程序 但由于缺少我的系统未带来的库和应用程序以及 buildozer 和 kivy 要求中未提及的库和应用程序 我总是遇到很多问题 在安装了很多库来解决以前的问题后 我陷入了这
  • 如何使用 WordPress 链接多个 CSS 文件

    我知道要链接您的 WordPress 主目录style css您使用的文件 然而 我有相当多的 CSS 文件需要链接到主 PHP 文件 例如滑块 图片框等 我不太确定我会怎么做 因为仅适用于名为的样式表styles css我的其他样式表都有
  • Java方法声明中参数的最大数量

    Java 中的方法可以拥有的最大参数数量是多少 为什么 我在 64 位 Windows 系统上使用 Java 1 8 StackOverflow 上所有关于此问题的答案都说技术限制是 255 个参数 但没有具体说明原因 准确地说 静态为 2
  • 使用字典将 alamofire 中的 JSON 数据解析为数组

    我正在尝试解析来自 alamorefire 的 JSON 数据 如下所示 import UIKit import Alamofire import SwiftyJSON class ViewController UIViewControll
  • Ruby 中的字符串和符号有什么区别?

    Ruby 中的字符串和符号有什么区别 什么时候应该使用其中一种 主要区别在于表示单个值的多个符号是相同的 而字符串则不然 例如 irb main 007 0 gt test object id gt 83618 irb main 008 0
  • @property 与 ARC 的定义:强还是保留?

    使用 Xcode 4 2 和 ARC 我注意到自动生成的代码NSManagedObject属性仍然是这样的 property nonatomic retain NSString someString 1 不应该retain现在被替换为str
  • Spring值注入无法从属性中获取值

    我有一堂这样的课 Component public class FaultsConfiguration private int interval Autowired public FaultsConfiguration Value faul
  • Raphael 路径调整大小并相对于容器移动

    我正在尝试缩放 移动使用 Raphael api 创建的 SVG 路径 我希望路径能够整齐地适合容器 无论容器有多大 我已经搜索了参考资料 网络 但我仍然在努力让它发挥作用 如果有人能告诉我为什么这不起作用 我会很高兴 这个小提琴向你展示了