Как задать фиксированную высоту и ширину текстового элемента SVG с помощью JavaScript? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть несколько прямоугольников разной высоты и ширины, мне нужно показать текст в верхнем левом углу прямоугольника, и независимо от ширины текста, он должен быть отрегулирован в 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 + ")");

enter image description here

мой svg выглядит как

<svg>
<g id="maingroup">
<g id="firstchild">
<rect></rect>
<text></text>
</g>
<g id="nthchild">
<rect></rect>
<text></text>
</g>
<g>
</svg>

Как я могу масштабировать его так, чтобы независимо от размера прямоугольника или текста, текст был правильно отрегулирован в пределах 50% ширины прямоугольника

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

В этом примере мы позиционируем элементы <text> по умолчанию 0,0.Затем мы вычисляем разницу между верхним левым краем прямоугольника и верхним левым краем текста.

Масштабная часть аналогична: 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>
0 голосов
/ 19 февраля 2019

Сначала мне нужно вычислить ширину текста (txtlength) и ширину поля (w).Я хочу масштабировать текст, поэтому я вычисляю масштаб let thescale = w / (2*txtlength);.// это масштабирует текст на 50% ширины прямоугольника.Затем, используя setAttributeNS, я устанавливаю значение для атрибута transform.Обратите внимание, что в тексте нет атрибутов x и y, центрированных вокруг источника SVG-холста.

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...