Это происходит потому, что область эффектов фильтра по умолчанию , как определено параметрами x
, y
, width
и height
элемента <filter>
, составляет 120% от ограничивающая рамка фильтруемого элемента, не 100%.
В спецификации уточняется:
Часто необходимо предусмотреть пространство для заполнения, поскольку эффект фильтра может слегка воздействовать на биты за пределами плотно прилегающей ограничительной рамки на данном объекте. Для этих целей можно предоставить отрицательные процентные значения для «x» и «y», а процентные значения больше 100% для «width» и «height». Именно поэтому, например, по умолчанию для области эффектов фильтра используются x = "- 10%" y = "- 10%" width = "120%" height = "120%".
Изменение этого значения до 100% все равно повлияет на всю ограничивающую рамку, включая области вне закругленных углов <rect>
. Если вы хотите ограничить его только прямоугольником, вы можете использовать feComposite
. Э.Г.
<filter id="I">
<feSpecularLighting specularExponent="2" lighting-color="#F3F4F3" result="light">
<fePointLight x="300" y="100" z="100"/>
</feSpecularLighting>
<feComposite in="light" in2="SourceAlpha" operator="in" result="lit"/>
</filter>
Кроме того, вы вложили фильтр #I
в фильтр #dropshadow
. Это не то, что вы можете сделать. Вы пытаетесь совместить освещение и тень? Если это так, вы можете сделать это так:
<filter id="dropshadow">
<feSpecularLighting specularExponent="2" lighting-color="#F3F4F3" result="light">
<fePointLight x="300" y="100" z="100"/>
</feSpecularLighting>
<!-- Apply lighting inside rectangle -->
<feComposite in="light" in2="SourceAlpha" operator="in" result="lit"/>
<feGaussianBlur in="SourceAlpha" stdDeviation="10"/>
<feOffset dx="5" dy="5" result="blur"/>
<!-- Apply blur outside rectangle -->
<feComposite in="blur" in2="SourceAlpha" operator="out" result="shadow"/>
<!-- Combine lighting and shadow -->
<feComposite in="shadow" in2="lit" operator="xor" />
</filter>
Это, похоже, не работает для Firefox, но тогда ваш оригинальный пример не работает и для Firefox для меня.