【问题标题】:SVG Path 0 - 1 Range Conversion in JavascriptJavascript 中的 SVG 路径 0 - 1 范围转换
【发布时间】:2017-12-19 17:09:46
【问题描述】:

我发现这个有用的 PHP 脚本可以使我的 SVG 路径相对于容器,因此在前端实现时可以响应。

$absolute_path = "M0,67.9586133 M0,67.9586133.....Z";
function regex_callback($matches) {
    static $count = -1;
    $count++;
    $width = 1072.01;
    $height = 399.23;
    if($count % 2) {
        return $matches[0] / $height;
    } else {
        return $matches[0] / $width;
    }
}

$relative_path = preg_replace_callback('(\d+(\.\d+)?)', 'regex_callback', $absolute_path);

来源:Convert SVG path data to 0-1 range

由于目前我正在使用 JavaScript 和 Node,因此我正在尝试使用 JavaScript 重新创建此函数。到目前为止,这是我得到的,但我被卡住了,因为返回的数据与输入的数据完全相同。

function replacer(match, svgWidth, svgHeight) {
  let count = -1;
  count++;
  if (count % 2) {
    return match[0] / svgHeight;
  } else {
    return match[0] / svgWidth;
  }
}

let svgPath = "M0,67.9586133 M0,67.9586133.....Z"
let nuPath = svgPath.replace('(\d+(\.\d+)?)', replacer);
console.log(nuPath);

任何帮助 - 方向和/或更正表示赞赏。

谢谢!

【问题讨论】:

  • 为什么不直接使用<g> 元素来保持响应?
  • 我将我的 SVG 用作带有 clipPathUnits="objectBoundingBox" 的剪辑路径,据我了解,为了使其成为响应单元,需要为 0 - 1。如果我不正确,请告诉我!
  • 什么样的 SVG 在坐标中需要这么多有效数字? XD 无论如何,在某些情况下你可以设置viewBox 属性,你试过吗?
  • PHP 代码具有 $height$width 硬编码值,分别为 1072.01399.23。 JavaScript 代码尝试从字符串本身获取svgHeightsvgWidth 值,因此它们的值将是(如果正确编写)"67.9586133""67.9586133"。您不能将不同的值放入一个函数并期望得到相同的结果。
  • 感谢@JordanRunning——我实际上在我的 JS 函数中传递了与 svgHeight 和 svgWidth 相同的值——避免在问题中包含不必要的代码,但我意识到它并不清楚!跨度>

标签: javascript php regex replace preg-replace-callback


【解决方案1】:

使用带有全局标志的regular expression

let nuPath = svgPath.replace(/(\d+(\.\d+)?)/g, replacer);

另外,您必须在函数外部定义宽度和高度:

let svgHeight = 399.23;
let svgWidth = 1072.01;

最后你必须删除未使用的函数参数:

let count = -1;
function replacer(match) {
  count++;
  if (count % 2) {
    return match / svgHeight;
  } else {
    return match / svgWidth;
  }
}

【讨论】:

  • 感谢您的回复——非常清楚,但输出与原始 PHP 脚本给我的不同。例如:传递"M0,67.9586133 L53.72258,297.209905...作为路径,PHP会输出:"M0,0.170224214864 L0.0501138795347...,而JS会输出:"M0,0.005596962714900048 L0.004664135595750039..。看起来像是人为的错误,但我仔细检查并找不到原因。
  • 我已经从函数中取出了count 变量。顺便说一句,这段直接从 PHP 转换过来的代码很脏。
  • 谢谢你!非常感谢您的帮助——仍然有同样的问题,输出不正确,但我现在可以看到进展,因为至少我得到了与原始输入不同的输出。
  • 现在输出什么?
  • PHP:M0,0.170224214864 L0.0501138795347,0.744457843849.... 和 JS:M0,0.015028930691581293 L0.004664135595750039,0.005009643563860431 这是一个 CodePen 示例:codepen.io/mmarquez/pen/RgdLWR。请记住,我使用的是 Vue.js,所以最初 makeResponsive 是一种方法,等等......但你明白了。如果您检查控制台,您将看到 PHP 代码的输出差异。
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 2018-07-01
  • 2017-08-23
相关资源
最近更新 更多