Вместо этого я использую трюк «сместить все на полпикселя», описанный в второй ответ на этот вопрос, чтобы получить четкую обводку в 1 пиксель на фигуре.
(Здесь задействованы закругленные края, поэтому решение shape-rendering: crispEdges
здесь нецелесообразно — из-за него изогнутые части штрихов выглядят ужасно.)
Как получается, что добавление фильтра (я использую фильтр размытия по Гауссу + фильтр смещения для реализации тени) ломает хак со смещением в полпикселя?
Вы можете поиграть с jsfiddle.
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<filter id="f1" x="-20%" y="-20%" width="160%" height="160%">
<feOffset result="offOut" in="SourceAlpha" dx="10" dy="10" />
<feGaussianBlur result="blurOut" in="offOut" stdDeviation="2" />
<feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
</filter>
</defs>
<g transform="translate(5.5,5.5)">
<!-- This one has a blurry stroke -->
<rect width="50" height="50" rx="5" ry="5" stroke="black" stroke-width="1" fill="steelblue" filter="url(#f1)" />
<!-- This one has a crisp stroke -->
<rect x="150" width="50" height="50" rx="5" ry="5" stroke="black" stroke-width="1" fill="steelblue" />
</g>
</svg>
Очевидно, я не могу публиковать встроенные изображения как новый пользователь, но вы можете это изображение того, как svg ищет меня.
filterRes
достаточно высоким (2 * общая высота изображения + тень). Посмотрите эту скрипту. Хотя я не совсем понимаю, зачем это нужно. - person Caleb Spare   schedule 25.06.2012