SVG -тени


<определения> и <фильтр>

Все фильтры SVG определяются в элементе <defs>. Элемент <defs> является сокращением от определений и содержит определения специальных элементов (таких как фильтры).

Элемент <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).