Example text: text Text Example text: text TEXT Example image: yellow leaf on green needles

SVG-фильтры

Бухвалова Юлия, LiveJournal

Бухвалова Юлия, LiveJournal

Статьи

SVG-фильтры

Немного истории

Internet Explorer

.img {
  filter:
    progid:DXImageTransform.Microsoft.dropshadow(OffX=5, OffY=5,
           Color="gray", Positive="true");
}

SVG-фильтры

CSS-фильтры

1999
2009
2013
SVG-фильтры
CSS-фильтры

Общие принципы работы

CSS

.img {

}

CSS

.img {
  filter: blur(5px);
}

CSS

.img {
  filter: blur(5px) grayscale(.5);
}

SVG

<svg>
  <filter id="my-fancy-filter">

  </filter>
</svg>

SVG

<svg>
  <filter id="my-fancy-filter">
    <feGaussianBlur
      stdDeviation="5"/>
  </filter>
</svg>

SVG

<svg>
  <filter id="my-fancy-filter">
    <feGaussianBlur
      stdDeviation="5"/>
    <feColorMatrix
      type="saturate" values=".5"/>
  </filter>
</svg>

SVG

.img {

}

SVG

.img {
  filter: url("#my-fancy-filter");
}
<svg>
  <circle
    filter="url(#my-fancy-filter)"/>
</svg>
CSS
SVG

Что умеют SVG-фильтры?

Демо без фильтров

Добавление картинки или цвета

Заливка цветом: feFlood
Добавление картинки: feImage
Повторение: feTile
Облака: feTurbulence
Облака: feTurbulence
Облака: feTurbulence
Облака: feTurbulence

Размытие и искажение

Размытие: feGaussianBlur
Размытие: feGaussianBlur
Сужение: feMorphology erode
Расширение: feMorphology dilate
Смещение: feOffset
Волны и искажения: feDisplacementMap
Тень: feDropShadow

Управление цветом

Режимы наложения: feBlend multiply
Режимы наложения: feBlend screen
Управление цветом: feColorMatrix hueRotate
Управление цветом: feColorMatrix matrix
Управление цветом: feColorMatrix luminanceToAlpha
Управление каналами: feComponentTransfer
Резкость: feConvolveMatrix

Источники света

Источники света: feSpecularLighting
Источники света: feDiffuseLighting

Объединение слоёв

Склейка слоёв: feMerge
Обрезка слоёв: feComposite

Управление
источниками

Атрибут in

<svg>
  <filter id="my-fancy-filter">
    <feGaussianBlur
      stdDeviation="5"/>
  </filter>
</svg>
<svg>
  <filter id="my-fancy-filter">
    <feGaussianBlur
      stdDeviation="5"/>
    <feColorMatrix
      type="saturate" values=".5"/>
  </filter>
</svg>
<svg>
  <filter id="my-fancy-filter">
    <feGaussianBlur
      stdDeviation="5"/>
    <feColorMatrix in="SourceGraphic"
      type="saturate" values=".5"/>
  </filter>
</svg>

Атрибут result

<filter id="wind">
  <feGaussianBlur stdDeviation="30"/>
  <feOffset dx="-30"/>
</filter>
Wind
<filter id="wind">
  <feGaussianBlur stdDeviation="30"/>
  <feOffset dx="-30" result="offset"/>
</filter>
Wind
<filter id="wind">
  <feGaussianBlur stdDeviation="30"/>
  <feOffset dx="-30" result="offset"/>
  <feMerge>


  </feMerge>
</filter>
Wind
<filter id="wind">
  <feGaussianBlur stdDeviation="30"/>
  <feOffset dx="-30" result="offset"/>
  <feMerge>
    <feMergeNode in="offset"/>

  </feMerge>
</filter>
Wind
<filter id="wind">
  <feGaussianBlur stdDeviation="30"/>
  <feOffset dx="-30" result="offset"/>
  <feMerge>
    <feMergeNode in="offset"/>
    <feMergeNode in="SourceGraphic"/>
  </feMerge>
</filter>
Wind

Сочетание примитивов

TEXT

Анимация

const primitive = document.querySelector('#turbulence');
function changeProp() {
  primitive.setAttribute('seed', primitive.seed.baseVal + 1);

  setTimeout(() => {
    requestAnimationFrame(changeProp);
  }, 75);
}
requestAnimationFrame(changeProp);

Практическое применение

Источник идеи: variable pixelation — Eric Portis
Источник идеи: Sara Soueidan — The Crash Course
Фото: Simon Matzinger on Unsplash
Бульк!
Firefox, Chrome 73
Идея фильтра: Distorted Button Effects
Источник видео: pixabay.com
Firefox, Chrome 73

Плюсы, минусы, подводные камни

Минусы

Nx (x,y) = - surfaceScale * FACTORx *
  (Kx(0,0)*I(x-dx,y-dy) + Kx(1,0)*I(x,y-dy) + Kx(2,0)*I(x+dx,y-dy) +
  Kx(0,1)*I(x-dx,y)    + Kx(1,1)*I(x,y)    + Kx(2,1)*I(x+dx,y)    +
  Kx(0,2)*I(x-dx,y+dy) + Kx(1,2)*I(x,y+dy) + Kx(2,2)*I(x+dx,y+dy))
Ny (x,y) = - surfaceScale * FACTORy *
  (Ky(0,0)*I(x-dx,y-dy) + Ky(1,0)*I(x,y-dy) + Ky(2,0)*I(x+dx,y-dy) +
  Ky(0,1)*I(x-dx,y)    + Ky(1,1)*I(x,y)    + Ky(2,1)*I(x+dx,y)    +
  Ky(0,2)*I(x-dx,y+dy) + Ky(1,2)*I(x,y+dy) + Ky(2,2)*I(x+dx,y+dy))
Nz (x,y) = 1.0

N = (Nx, Ny, Nz) / Norm((Nx,Ny,Nz))
<feFuncR type="table"
  tableValues="1 0"/>
<feFuncR type="linear"
  slope="1"
  intercept="0"/>
<feFuncR type="gamma"
  amplitude="1"
  exponent="1"
  offset="0"/>

Плюсы

Инструменты

SVG Filters — редактор с готовыми фильтрами и документацией
filtered — десктопное приложение для редактирования фильтров
SVG Color Filter Playground — эксперименты с feColorMatrix
RGBA to feColorMatrix — создание фильтра на основе оттенка
SVG Gradient Map Filter — конструктор Gradient Map фильтров

Ссылки

Вопросы?