У меня есть довольно сложное, динамически созданное svg изображение, которое было реализовано с помощью плагина - jQuery SVG.
Я хотел бы создать область popup, которая будет отображаться поверх всех элементов svg на холсте.
Для реализации современного полупрозрачного эффекта похожего на look в iOS7, я бы хотел применить фильтр размытия (blur) ко всем изображениям под всплывающей областью.
Я хочу иметь возможность динамически устанавливать атрибуты x, y, а также изменять ширину и высоту этой всплывающей области.
Взгляните на этот пример: jsfiddle
<svg width="500" height="500">
<rect x="10" y="10" height="235" width="235" fill="red" />
<rect x="255" y="10" height="235" width="235" fill="green" />
<rect x="10" y="255" height="235" width="235" fill="blue" />
<rect x="255" y="255" height="235" width="235" fill="yellow" />
<rect x="50" y="50" height="400" width="400" fill="rgba(255,255,255,0.8)" />
В этом случае всё, что покрыто белой областью, должно быть размытым. Это выглядит следующим образом:
Я нашел пример, но там используется статическое фоновое изображение, которого у меня нет.
Есть ли какие-либо способы для достижения этого эффекта с помощью svg, css и jQuery?
Перевод вопроса: Apply blur filter to certain area of svg image
так кошернее
<svg width="500" height="500">
<rect x="10" y="10" height="235" width="235" fill="red" />
<rect x="255" y="10" height="235" width="235" fill="green" />
<rect x="10" y="255" height="235" width="235" fill="blue" />
<rect x="255" y="255" height="235" width="235" fill="yellow" />
<defs>
<filter id="f1" x="0" y="0">
<feGaussianBlur in="SourceGraphic" stdDeviation="20" />
</filter>
</defs>
<rect id="blur" x="50" y="50" height="400" width="400" fill="rgba(255,255,255,0.8)" filter="url(#f1)" />
</svg>
Как насчет такого подхода? Это немного сложнее в использовании, но, похоже, это работает во всех браузерах.
jsfiddle
<svg x="0px" y="0px" width="500px" height="500px" viewbox="0 0 500 500">
<defs>
<filter id="blurry" x="0%" y="0%" height="100%" width="100%" primitiveUnits="userSpaceOnUse">
<feGaussianBlur x="50" y="50" width="400" height="400" stdDeviation="40" in="SourceGraphic" result="blurSquares"/>
<feComponentTransfer in="blurSquares" result="opaqueBlur">
<feFuncA type="linear" intercept="1"/>
</feComponentTransfer>
<feBlend mode="normal" in="opaqueBlur" in2="SourceGraphic"/>
</filter>
</defs>
<g id="squares" filter="url(#blurry)">
<rect x="10" y="10" height="235" width="235" fill="red" />
<rect x="255" y="10" height="235" width="235" fill="green" />
<rect x="10" y="255" height="235" width="235" fill="blue" />
<rect x="255" y="255" height="235" width="235" fill="yellow" />
</g>
<rect x="50" y="50" height="400" width="400" fill="rgb(255,255,255)" fill-opacity="0.8" />
</svg>
Это сложнее, потому что фильтр применяется к фону, а не к <rect>. Чтобы он работал, вам нужно скопировать x, y, width и height из <rect> в примитив feGaussianBlur.
Перевод ответа: @Paul LeBeau
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости