Мне нужно применить маску к другим объектам.
Маска должна покрывать весь объект (видимую его часть). Я поместил маску в одно конкретное место, вверху страницы, изменил maskContentUnits
на objectBoundingBox
, так что она работала отлично.
Но тут возникла проблема.
Я сделал скрипку, чтобы проиллюстрировать проблему: http://jsfiddle.net/8qdt7vjr/1/
<body>
<svg width="0" height="0">
<defs>
<mask id="mask1" maskContentUnits="objectBoundingBox">
<ellipse cx=".5" cy=".5" rx=".5" ry=".5" fill="white" />
</mask>
</defs>
</svg>
<svg class="svg" width="200" height="150" overflow="visible">
<rect x="-50" y="-50" width="350" height="250" fill="none" stroke="green" stroke-width="2" />
<svg id="zzz" x="0" y="0" width="100%" height="100%" overflow="visible" mask="url(#mask1)">
<rect x="-50" y="-50" width="350" height="250" fill="blue" fill-opacity=".3" />
</svg>
<rect width="100%" height="100%" fill="red" fill-opacity=".1" stroke="red" stroke-width="1" />
</svg>
</body>
В этой скрипке я хочу применить маску к элементу svg с id="zzz"
. Но внутри этого элемента есть элемент rect
, увеличивающий ограничивающую рамку zzz. В скрипте это rect
, но в моем проекте это тег image
. zzz имеет значение скрытого переполнения (в скрипте я изменил его на видимый, чтобы было легче увидеть проблему), поэтому у меня есть определенная часть изображения, видимая внутри zzz strong >.
Настоящая проблема заключается в том, что внутреннее содержимое zzz увеличивает ограничивающую рамку zzz.
В скрипте я хочу, чтобы маска эллипса находилась внутри красного прямоугольника (visible zzz), но вместо этого он находится внутри зеленого прямоугольника (ограничивающая рамка zzz).
Итак, главный вопрос: есть ли способ достичь этой цели? Маска будет использоваться многими элементами с разными размерами и содержимым, и я не хочу ее клонировать.
Есть ли способ сделать это без клонирования маски внутри каждого элемента?
Есть ли способ уменьшить ограничивающую рамку до видимой области?
Есть ли способ показать часть изображения, не расширяя ограничивающую рамку родителя? < br> Есть ли другой способ сделать это?