НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Графіка. Уроки W3Schools українською для початківців

En

SVG Тіні


<defs> та <filter>

Усі фільтри SVG визначені в елементі <defs>. Елемент <defs> є скороченням від definition (визначення) і містить визначення спеціальних елементів (таких як фільтри).

Елемент <filter> використовується для визначення фільтра SVG. Елемент <filter> має обов’язковий атрибут id, який ідентифікує фільтр. Потім малюнок вказує на фільтр, який потрібно використовувати.


SVG <feOffset>

Приклад 1

Елемент <feOffset> використовується для створення ефектів тіні. Ідея полягає в тому, щоб взяти графіку SVG (зображення або елемент) і трохи перемістити її в площині xy.

Перший приклад зміщує прямокутник (за допомогою <feOffset>), а потім змішує оригінал поверх зміщеного зображення (за допомогою <feBlend>):

feoffset

Ось код SVG:

Приклад

<svg height="120" width="120">
  <defs>
    <filter id="f1" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="20" dy="20" />
      <feBlend in="SourceGraphic" in2="offOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f1)" />
</svg>
Спробуйте самі »

Пояснення коду:

  • Атрибут id елемента <filter> визначає унікальну назву для фільтра
  • Атрибут filter елемента <rect> зв’язує елемент із фільтром "f1"

Приклад 2

Тепер офсетне зображення можна розмити (за допомогою <feGaussianBlur>):

feoffset2

Ось код SVG:

Приклад

<svg height="140" width="140">
  <defs>
    <filter id="f2" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="20" dy="20" />
      <feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f2)" />
</svg>
Спробуйте самі »

Пояснення прикладу:

  • Атрибут stdDeviation елемента <feGaussianBlur> визначає ступінь розмиття

Приклад 3

Тепер зробіть тінь чорною:

feoffset3

Ось код SVG:

Приклад

<svg height="140" width="140">
  <defs>
    <filter id="f3" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceAlpha" dx="20" dy="20" />
      <feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f3)" />
</svg>
Спробуйте самі »

Пояснення прикладу:

  • Атрибут in елемента <feOffset> змінено на "SourceAlpha", який використовує альфа-канал для розмиття замість усього пікселя RGBA

Приклад 4

Тепер розглядайте тінь як колір:

feoffset4

Ось код SVG:

Приклад

<svg height="140" width="140">
  <defs>
    <filter id="f4" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="20" dy="20" />
      <feColorMatrix result="matrixOut" in="offOut" type="matrix"
      values="0.2 0 0 0 0 0 0.2 0 0 0 0 0 0.2 0 0 0 0 0 1 0" />
      <feGaussianBlur result="blurOut" in="matrixOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <rect width="90" height="90" stroke="green" stroke-width="3"
  fill="yellow" filter="url(#f4)" />
</svg>
Спробуйте самі »

Пояснення прикладу:

  • Фільтр <feColorMatrix> використовується для наближення кольорів на офсетному зображенні до чорного. Усі три значення ’0.2’ у матриці множаться на червоний, зелений і синій канали. Зменшення їх значень наближає кольори до чорного (чорний дорівнює 0)