Rect эквивалентно тексту якорного атрибута представления текста?

Есть ли прямоугольник, эквивалентный атрибуту привязки текста?

Я хочу иметь возможность позиционировать прямоугольник с левой / правой стороны или в зависимости от ситуации. Я знаю, что это можно сделать с помощью простых вычислений, но мне просто интересно, существует ли что-то уже встроенное.

Ссылка на атрибут представления привязки текста... https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/text-anchor

2 ответа

Я искал тот же вопрос и нашел этот пост без ответа. Вопрос довольно старый, но я поставил здесь решение, для которого кто-то может искать его, как и я.

Когда указывается (x, y) прямоугольника svg, он обрабатывается следующим образом: "Поместите левый верхний угол прямоугольника в точку (x, y)". Но можно хотеть, чтобы (x, y) обрабатывалось как: "Эй, поместите центр моего прямоугольника в (x, y)" или "Эй, поместите верхний правый угол моего прямоугольника в (x, y)". Для этого используется механика якоря, но в svg такого нет.

Вы все еще можете достичь механики привязки с помощью transform (используя css или атрибут). Это возможно, поскольку процентные значения в transform.translate рассчитываются относительно применяемой формы, но не ее родителя.

РЕШЕНИЕ РАБОТАЕТ ТОЛЬКО В ХРОМЕ НА СЕЙЧАС

Таким образом, чтобы достичь "Эй, поместите центр моего прямоугольника в (x, y)", вам нужно установить привязку в (0.5, 0.5). Вот как это делается с помощью transform:

.rect-anchor-50-50 {
  /* 
    Precents in translate are calculated relative to
    the applied rectangle, but not its parent.
    Set anchor to (0.5, 0.5) or (center, center).
    */
  transform: translate(-50%, -50%);
}

Фрагмент кода на jsfiddle

.rect-anchor-0-0 {
  fill: #afafaf;
}
.rect-anchor-50-50 {
  /* 
    precents in translate are calculated relative to
    the applied rectangle, but not its parent
    */
  transform: translate(-50%, -50%);
  fill: #afcfae;
  opacity: 0.75;
}
.group {
  fill: red;
}
svg {
  fill: lightblue;
}
<!-- One can use translate with percents to achieve anchor like mechanics -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300">
  <rect fill="lightblue" x="0" y="0" width="100%" height="100%"></rect>

  <!-- Use translate to achieve anchor mechanics -->
  <rect class="rect-anchor-0-0" x="150" y="150" width="200" height="35" />
  <rect class="rect-anchor-50-50" x="150" y="150" width="200" height="35" />

  <!-- Rect x,y position mark for convenience -->
  <circle cx="150" cy="150" r="2" fill="red"></circle>
</svg>

Там нет ничего подобного для других элементов SVG (в том числе rect), см. спецификацию Вам придется рассчитать позицию самостоятельно.

Если вы хотите сделать это сразу после добавления:

    .append('rect')
      .attr('width', 10)
      .attr('height', 5)
      // Center rectangle
      .attr('transform', function() {
        return `translate(-${this.getAttribute('width') / 2}` +
          `, -${this.getAttribute('height') / 2})`;
      });
Другие вопросы по тегам