javascript - 中心 SVG 组元素

标签 javascript d3.js svg

我正在尝试使用 d3 将具有 texttspang 元素集中在 svg 元素内 使用下面的代码。

var rootSVGSize = d3.select("svg.root-svg").node().getBoundingClientRect()
var dataLabelSize = d3.select("g.data-label").node().getBoundingClientRect()

var x = rootSVGSize.width / 2;
var y = rootSVGSize.height / 2;

d3.select("g.data-label").attr("transform", "translate(" + x + "," + y + ")")
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

<svg class="root-svg" width="180" height="200" style="border: black;border-style: solid;border-width: 1px;">
   <g class="data-label">
      <text alignment-baseline="middle" style="font-family: Arial; font-size: 36px; font-style: normal; font-weight: normal; fill: rgb(242, 200, 15);" text-anchor="middle">
         <tspan x="0" dy="0">1/1/2018</tspan>
         <tspan x="0" dy="41">3:00:00</tspan>
         <tspan x="0" dy="41">AM</tspan>
      </text>
      <title>1/1/2018 3:00:00 AM</title>
   </g>
</svg>

执行上述代码后可以看到,组元素未在 x 和 y 坐标上正确居中。如何使组元素在 svg 内居中?

我使用 getBoundingClientRect 因为我想在分配 widthheight 后在初始阶段获取 svg 的大小> 这是在 svg 内渲染任何内容之前。

最佳答案

您必须考虑 SVG 容器和组的 xy 位置:

var x = (rootSVGSize.x - dataLabelSize.x) + (rootSVGSize.width - dataLabelSize.width) / 2;
var y = (rootSVGSize.y - dataLabelSize.y) + (rootSVGSize.height - dataLabelSize.height) / 2;

这样,您就可以为 alignment-baselinedominant-baselinetext-anchor 设置任何值,但事实并非如此。没关系,团队将始终处于中心位置。

这是经过更改的代码:

var rootSVGSize = d3.select("svg.root-svg").node().getBoundingClientRect()
var dataLabelSize = d3.select("g.data-label").node().getBoundingClientRect()

var x = (rootSVGSize.x - dataLabelSize.x) + (rootSVGSize.width - dataLabelSize.width) / 2;
var y = (rootSVGSize.y - dataLabelSize.y) + (rootSVGSize.height - dataLabelSize.height) / 2;

d3.select("g.data-label").attr("transform", "translate(" + x + "," + y + ")")
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

<svg class="root-svg" width="180" height="200" style="border: black;border-style: solid;border-width: 1px;">
   <g class="data-label">
      <text alignment-baseline="middle" style="font-family: Arial; font-size: 36px; font-style: normal; font-weight: normal; fill: rgb(242, 200, 15);" text-anchor="middle">
         <tspan x="0" dy="0">1/1/2018</tspan>
         <tspan x="0" dy="41">3:00:00</tspan>
         <tspan x="0" dy="41">AM</tspan>
      </text>
      <title>1/1/2018 3:00:00 AM</title>
   </g>
</svg>

关于javascript - 中心 SVG 组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084902/

相关文章:

css - 动画生长箭头链接

javascript - IE11 jQuery html() 在 SVG 元素内不起作用

javascript - 合并具有相似键的数组中的对象

javascript - d3.js 无法解析 "MNaN,NaN"

javascript - fullPage.js 和固定导航 - 想要在导航中突出显示事件页面

javascript - 无法让 D3.js 在 Svelte 组件中工作(使用汇总)

d3.js - 子弹图示例

javascript - d3.min.js :1 Uncaught TypeError: n. getFullYear 不是函数

javascript - Relay 中的嵌套片段数据始终相同

Javascript如何从日期时间字符串正确创建DateObject?