Je dois créer une boîte avec une ombre en ligne, tout comme CSS3 a une ombre de boîte en ligne. Ce que j'ai trouvé jusqu'à présent est un filtre avec feGaussianBlur, mais le problème est qu'il ajoute également une ombre en dehors des sentiers battus, ce que je ne veux pas. Voici le code que j'ai jusqu'à présent :
<svg> <defs> <filter id="drop-shadow"> <feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="5" /> <feGaussianBlur in="SourceAlpha" result="blur2" stdDeviation="10" /> <feGaussianBlur in="SourceAlpha" result="blur3" stdDeviation="15" /> <feMerge> <feMergeNode in="blur" mode="normal"/> <feMergeNode in="blur2" mode="normal"/> <feMergeNode in="blur3" mode="normal"/> <feMergeNode in="SourceGraphic" mode="normal"/> </feMerge> </filter> </defs> <rect x="10" y="10" width="100" height="100" stroke="black" stroke-width="4" fill="transparent" filter="url(#drop-shadow)"/> </svg>
J'ai fait une démo et comparé ce code avec le résultat de production CSS souhaité. Ce filtre fonctionne non seulement sur les rectangles, mais aussi sur les trapèzes et les polygones plus complexes.
J'ai essayé d'utiliser RadialGradient, mais ce n'est pas bon non plus car cela rend le dégradé circulaire.
Sur la base principalement des expériences que j'ai trouvées, voici ce que j'ai trouvé :
Décommentez le dernier si vous voulez voir le remplissage
。不幸的是,fill="transparent"
ne donnera pas au filtre un alpha utilisable, ni ne produira d'ombre.Si vous avez un rembourrage solide, vous pouvez ajouter
À la fin du filtre, il découpera le flou à la forme du SourceGraphic. Puisque votre forme est transparente, vous devez faire plus de travail. Je recommande d'utiliser un remplissage semi-transparent sur la forme originale afin d'obtenir la bonne sélection de composition, et d'utiliser feFuncA pour remettre à zéro le remplissage pour l'opération finale. Cela s'avère très compliqué. Mais voici une solution qui fonctionne pour n'importe quelle forme de ligne continue
Voici ma branche de violon : http://jsfiddle.net/kkPM4/