Как бы я переместить шаблон SVG с элементом

Я создал шаблон svg, увиденный здесь:

<pattern id="t" height="20" width="20" patternUnits="userSpaceOnUse" overflow="visible">
    <ellipse cx="0" cy="0" rx="20" ry="20" fill="white"/>
    <ellipse cx="5" cy="5" rx="15" ry="15" fill="yellow"/>
    <ellipse cx="10" cy="10" rx="10" ry="10" fill="blue"/>
    <ellipse cx="15" cy="15" rx="5" ry="5" fill="red"/>
</pattern>

Затем в своем сценарии я создал эллипс, который использует шаблон. Проблема в том, что когда я двигаю эллипс, рисунок остается за ним, а не движется с эллипсом.

Как мне настроить шаблон, чтобы остаться с элементом?

2 ответа

Решение

Я считаю, что вам нужно изменить patternUnits на "objectBoundingBox" против userSpaceOnUse. Это должно исправить вещи для вас.

Обновить:

Этот ответ был неправильным - patternUnits не должен влиять на структуру шаблона, а только на его размеры (единицы пользовательского пространства или единицы ограничивающего прямоугольника). patternContentUnits - это атрибут, который вы хотите установить в "objectBoundingBox" - обратите внимание, что тогда он будет масштабировать ваш шаблон, если вы измените размер ограничительной рамки. Если вы не хотите, чтобы это происходило, тогда вам нужно использовать атрибут viewbox в вашем шаблоне - что, вероятно, является правильным способом получить результат, который вы, вероятно, ищете (шаблон фиксированного размера, расположенный относительно его ограничительной рамки)

(Также обратите внимание, что установка переполнения на видимые результаты приводит к "неопределенному" рендерингу в соответствии со спецификацией, а не чем-то, что вы хотите сделать)

Вам нужно использовать patternContentUnits="objectBoundingBox", нажмите на прямоугольник в этом примере, чтобы увидеть: http://jsfiddle.net/longsonr/x8nkz/

Дубликат Как сделать так, чтобы заливка рисунка SVG перемещалась вместе с объектом?

решается с помощью вложенного документа SVG

// svg.js + svg.draggable.js

// create canvas
var draw = SVG().size(200, 200).addTo('#canvas')

// pattern of checkerboard
var patt = draw.pattern(20, 20)
patt.rect(20, 20).fill({color: '#fff'})
patt.rect(10, 10)
patt.rect(10, 10).move(10, 10)

// nested svg document
var nested = draw.nested()

// rect + pattern
nested.rect(80, 80).attr({
    fill: patt
})

// drag on
nested.draggable()
Другие вопросы по тегам