我有多个不同高度和宽度的rect,我需要在rect的左上角显示一个文本,并且不管文本的宽度是多少,都应将其调整为rect宽度的50%。
这是我尝试过的代码。
rectBbox = rectElem.getBBox();
textBbox = textElem.getBBox();
scale = rectBbox.width / textBbox.width;
X = parseFloat(rectBbox.x)
Y = parseFloat(rectBbox.y)
textElem.setAttribute("transform", "translate(" + X + "," + Y + ") scale(" + scale + ")");
我的svg看起来像
<svg>
<g id="maingroup">
<g id="firstchild">
<rect></rect>
<text></text>
</g>
<g id="nthchild">
<rect></rect>
<text></text>
</g>
<g>
</svg>
我如何缩放它,以便无论矩形或文本的大小是多少,文本都将在矩形宽度的50%内正确调整
答案 0 :(得分:2)
在此示例中,我们将<text>
元素放置在默认的0,0
处。然后我们计算rect的左上方和文本的左上方之间的差异。
比例部分相似:0.5 *文本宽度与矩形宽度之比。
function adjustText(boxElem)
{
var rectElem = boxElem.querySelector("rect");
var textElem = boxElem.querySelector("text");
var rectBbox = rectElem.getBBox();
var textBbox = textElem.getBBox();
var scale = 0.5 * rectBbox.width / textBbox.width;
var translateX = rectBbox.x - textBbox.x;
var translateY = rectBbox.y - textBbox.y;
textElem.setAttribute("transform", "translate(" + translateX + "," + translateY + ") scale(" + scale + ")");
}
adjustText(document.getElementById("firstchild"));
adjustText(document.getElementById("nthchild"));
<svg width="500" height="500">
<g id="maingroup">
<g id="firstchild">
<rect x="20" y="30" width="250" height="100" fill="lightgrey" stroke="black"/>
<text>Very Very Very Very Very Long Text</text>
</g>
<g id="nthchild">
<rect x="200" y="200" width="200" height="100" fill="lightgrey" stroke="black"/>
<text>Smaller Text</text>
</g>
</g>
</svg>
答案 1 :(得分:1)
首先,我需要计算文本的宽度(txtlength
)和框的宽度(w
)。我想缩放文本,因此我正在计算缩放let thescale = w / (2*txtlength);
。 //这会将文字缩放为矩形宽度的50%。接下来,使用setAttributeNS设置transform属性的值。请注意,文本没有以SVG画布的原点为中心的x和y属性。
let txtlength = txt.getComputedTextLength()
let w = theRect.getBBox().width;
let c = {x:50,y:25}// the center of the rect
let thescale = w / (2 * txtlength);// 50% of rect's width
//scale the text and translate in the center
txt.setAttributeNS(null, "transform", `scale(${thescale},${thescale}) translate(${c.x/thescale},${c.y/thescale})`)
svg{border:1px solid; width:120vh}
text{font-size:10;
dominant-baseline: middle;
text-anchor: middle}
<svg viewBox="0 0 100 50">
<rect id="theRect" x="10" y="10" width="80" height ="30" stroke="black" fill="none" />
<text id="txt" dominant-baseline="middle" text-anchor="middle">A very long text, sooo long </text>
</svg>