gpt4 book ai didi

javascript - 如何在 svg 中设置文本的绝对 x 坐标?

转载 作者:行者123 更新时间:2023-11-30 15:11:19 24 4
gpt4 key购买 nike

我想对齐多个 <text><svg> 中的相同 x 坐标中和包围 <text><rect> .

我指定了 x <text> 的属性对齐多个 <text> , 和我得到了 <text> 的坐标与 getBBox()确定 <rect> 的 x 位置. getBBox().x ,但是,不同于指定的 x在一些<text> , 尽管 <g>包括 <text><rect>还没有转化。

为什么不同?如何设置 <text> 的绝对 x 坐标(例如,在以下代码中归零),以及如何获得 <text> 的绝对 x 坐标?

我在 Windows 10(64 位)的 Chrome 59(64 位)上执行了以下代码。

更新:

当我在 Firefox 上运行代码时,我使用 getBBox().x 得到了相同的(预期的)x 坐标作为 x <text> 的属性.

在 Chrome 上需要额外的努力吗?

const PADDING = 5
const BOX_X = 10

const data = [
{text: "My"},
{text: "x"},
{text: "coordinate"},
{text: "is"},
{text: "zero?"}
]

const box = d3.select("svg#svg")
.selectAll(".text-rect")
.data(data)
.enter()
.append("g")
.classed("text-rect", true)

// draw text
const text = box
.append("text")
.attr("text-anchor", "start")
.attr("font-family", "Arial")
.attr("x", 0) // <- I set `x` to zero here
.attr("y", 0)
.text((d) => d.text)
.each(function(d){ d.textBBox = this.getBBox() })

// surround text using coorrdinates from `getBBox()` of `<text>`
box
.append("rect")
.attr("x", (d) => d.textBBox.x - PADDING)
.attr("y", (d) => d.textBBox.y - PADDING)
.attr("width", (d) => d.textBBox.width + 2 * PADDING)
.attr("height", (d) => d.textBBox.height + 2 * PADDING)
.attr("fill", "none")
.attr("stroke", "black")
.attr("stroke-width", 1)

// avoid overlap
box
.each(function(d){ d.bbox = this.getBBox() })
.attr("transform", function(d, i) {
let oldY = d.bbox.y
d.bbox.y = (i==0)? 0 : box.data()[i-1].bbox.y + box.data()[i-1].bbox.height
return `translate(${BOX_X},${d.bbox.y - oldY})`
});

// show coordinates
const div = d3.select("div#coordinates")
.selectAll("p")
.data(text.data())
.enter()
.append("p")
.text((d) => `"${d.text}": (${d.textBBox.x}, ${d.textBBox.y})`)
// I set `x` attribute of `<text>` to zero,
// but `getBBox()` returned a different x coordinate.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<h3>SVG is drawn here</h3>
<svg id="svg" width="150" height="150"></svg>
<hr>
<h3>XY coordinates are shown here</h3>
<div id="coordinates"></div>
<script src="https://d3js.org/d3.v4.min.js"></script>
</body>
</html>

  1. Results of Chrome and Firefox
  2. Results of Different font-size

最佳答案

这叫“侧承”。它是字符 X 位置与字形左侧(或右侧)之间的差异。例如,当与上方或下方的其他文本左对齐时,像“O”这样的圆 Angular 字符可能需要稍微向左突出,以便在视觉上看起来正确。

下图并没有说明这一点,但它确实显示了侧轴承是什么。

enter image description here

来源:https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/TypoFeatures/TextSystemFeatures.html

关于javascript - 如何在 svg 中设置文本的绝对 x 坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com