смещение (с помощью преобразования) элемента svg относительно его собственного размера

#javascript #css #reactjs #svg

Вопрос:

Я хочу смещать элемент SVG относительно его собственного размера, используя перевод в процентах, очень похоже на то, как transform: translate(100%,0) будет работать использование смещения div:

этот код:

   <div style={{ overflow: 'visible', position: 'relative' }}>
    {/* rect */}
    <div style={{ height: 20, width: 20, background: 'black', position: 'absolute' }} />
    {/* circle */}
    <div
      style={{
        height: 20,
        width: 20,
        background: 'purple',
        borderRadius: '50%',
        position: 'absolute',
        transform: 'translate(100%,0)',
      }}
    />
  </div>
 

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

в то время как этот случай:

 <svg overflow={'visible'}>
  <rect width={20} height={20} />
  <circle cx={10} cy={10} r="10" fill="purple" style={{ transform: 'translate(100%,0px)' }} />
</svg>
 

приведет к тому, что это будет отображаться: введите описание изображения здесь

Это в основном смещение относительно размера холста svg(который я никогда явно не устанавливал): введите описание изображения здесь

почему transform: 'translate(100%,0)' работает относительно себя в html-элементах div, но относительно родительских элементов SVG?

уже пробовал:

  • элементы упаковки g или элементы, svg аналогичные другим ответам на этом сайте.

хотите избежать:

  • Я мог бы потенциально решить эту проблему с помощью функции .getBBox (), вычислить размеры вручную и сохранить их в состояние, а затем компенсировать пикселями, но я действительно хочу избежать этого и ищу более простое решение.

ДЕМОНСТРАЦИЯ

https://codesandbox.io/s/svg-vs-div-transform-translate-o2ii7

Ответ №1:

Вы должны установить поле преобразования в поле заполнения. Для React вы используете верблюжий чехол, поэтому он выглядит так:

 style={{ transform: "translate(100%,0px)", transformBox: "fill-box" }}
 

Комментарии:

1. Я знал, что это должен быть более простой подход вместо оборачивания компонента react, который вычисляет размеры вручную и создает дополнительные рендеры! Спасибо!

2. эй, @Роберт Лонгсон, похоже, что ваше решение не всегда работает, я отредактировал вопрос, можете ли вы помочь в этих случаях?

3. Вам не следует этого делать, вместо этого задайте другой вопрос.