SVG: несколько эффектов в одном фильтре

151
14 апреля 2022, 04:10

Я пытаюсь реализовать несколько теней в одном фильтре SVG, но я считаю, что мой вопрос более общий, чем этот, а именно, - как добавить несколько эффектов в один фильтр SVG? В моем случае это именно то, что я пытаюсь сделать.

У меня есть документ SVG, который в настоящее время содержит единственный элемент пути, и я применил единственный эффект тени к этому элементу пути.

<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1440" height="1750">
  <defs>
    <filter id="dropshadow">
      <feGaussianBlur in="SourceAlpha" stdDeviation="2.2"></feGaussianBlur>
      <feOffset dx="12" dy="12" result="offsetblur"></feOffset>
      <feFlood flood-color="rgba(0,0,0,0.5)"></feFlood>
      <feComposite in2="offsetblur" operator="in"></feComposite>
      <feMerge>
        <feMergeNode></feMergeNode>
        <feMergeNode in="SourceGraphic"></feMergeNode>
      </feMerge>
    </filter>
  </defs>
  <path xmlns:xlink="http://www.w3.org/1999/xlink" d="M 100 100 L 300 100 L 200 300 z z" fill="#2DA9D6" filter="url(#dropshadow)"></path>
</svg>

Это дает мне SVG, который выглядит так:

Теперь я хочу добавить вторую (совершенно другую) тень к этому же элементу пути. Например, скажем, тень, которая идет вверх и слева от элемента. В CSS вся моя тень может выглядеть так:

box-shadow: 5px 5px 5px rgba(0,0,0,0.5), -5px -5px 5px rgba(0,0,0,0.5);

Как я могу сделать эти множественные тени с помощью фильтров SVG? Я рассмотрел этот вопрос, в котором предлагается поместить несколько эффектов в один фильтр, но я не уверен, как объединить несколько эффектов в один фильтр.

Свободный перевод вопроса SVG: Multiple Effects in One Filter от участника @Nick Budden.

Answer 1

Вы можете использовать атрибуты result, чтобы дать имя выходным данным примитивного элемента фильтра, считая его своего рода атрибутом локального идентификатора фильтра. Затем вы можете использовать это имя в качестве входных данных фильтра с атрибутами in или in2.

<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1440" height="1750">
  <defs>
    <filter id="dropshadow">
     <feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blur"/> 
      <feOffset dx="12" dy="12" result="offsetblur"/>
      <feOffset dx="-20" dy="-12" result="offsetblur2" in="blur"/>
      <feComponentTransfer result="shadow1" in="offsetblur">
        <feFuncA type="linear" slope="0.5"/>
      </feComponentTransfer>
      <feComponentTransfer result="shadow2" in="offsetblur2">
        <feFuncA type="linear" slope="0.2"/>
      </feComponentTransfer>
      <feMerge> 
        <feMergeNode in="shadow1"/>
        <feMergeNode in="shadow2"/>
        <feMergeNode in="SourceGraphic"/> 
      </feMerge>
    </filter>
  </defs>
  <path xmlns:xlink="http://www.w3.org/1999/xlink" d="M 100 100 L 300 100 L 200 300 z z" fill="#2DA9D6" filter="url(#dropshadow)"></path>
</svg>

Смотрите fiddle

Свободный перевод ответа от участника @Erik Dahlström.

READ ALSO
Совместимость transform: skew с border и border-radius

Совместимость transform: skew с border и border-radius

У меня есть 3 блока со значением transform: skew(0deg, 10deg)При попытке прописать border (см 1 фото) или border-radius (см 2 фото) верхняя (косая) граница становится...

107
Динамически посчитать высоту div React

Динамически посчитать высоту div React

Установил свойство css, чтобы блок растягивался на всю оставшуюся высоту экрана

226
Слетает вёрстка при подключении jsapi

Слетает вёрстка при подключении jsapi

При подключении <script src="https://api-mapsyandex

229
Вставка одного css файла внутри другого

Вставка одного css файла внутри другого

Каким образом можно вставить один css-файл внутри другого css-файла?

111