Я не веб / CSS-программист, но мне нужен был алгоритм box-shadow, похожий на CSS, и я решил выяснить, как он работает.
Я использовал онлайн-инструмент CSSmatic для сравнения ниже.
Кажется, что алгоритм состоит из 2 шагов.
Шаг 1: Векторизация масштаба и сдвига
As shown, a 27px
CSS spread inset means the shape is scaled to have dimensions 27*2
pixels smaller. This is inverted for outline box-shadows (e.g. 27*2
pixels larger).
The horizontal/vertical offsets are self-explanatory.
Step 2: Gaussian blur
History
Mozilla developer David Baron wrote a detailed article on CSS box-shadow implementations здесь .
Вплоть до 2011 года стандартного значения радиуса размытия CSS не было. Он может соответствовать разным алгоритмам и параметрам в разных веб-браузерах:
Различные браузеры ... исторически делали разные вещи
для того же радиуса размытия, как с точки зрения алгоритма размытия и что
радиус означает для этого алгоритма (то есть насколько размыто данный радиус
делает вещи). .... За прошедший год спецификации CSS и HTML
были изменены (для CSS), чтобы определить, что означает этот радиус размытия или (для
HTML), чтобы они согласились друг с другом в этом определении.
Эти исторические различия могут объяснить назначение префикса moz-
(который вы упомянули) и префикса webkit-
. Скорее всего, они определяют альтернативные параметры box-shadow для браузеров Mozilla и WebKit .
Я ожидаю, что эти префиксные версии устарели из-за стандартизации, но могут использоваться для совместимости со старыми браузерами.
Стандартизация
Согласно Барону, теперь существует точное , стандартное определение радиуса размытия рамки-тени:
Эффект размытия теперь определяется css3-background и HTML как
гауссово размытие со стандартным отклонением (σ), равным половина заданный радиус размытия , с учетом разумной ошибки аппроксимации.
Математик может расширить это до точной формулы.
Визуальное приближение
Используя метод проб и ошибок в GIMP , я обнаружил, что радиус размытия по Гауссу получается умножением параметра размытия CSS на 5/3 (1,6666 ...), а затем округлением до ближайшего integer, производит очень близкое визуальное приближение (к CSS в Firefox 50):
7px
CSS blur (Firefox 50) ~~ ceil(7 * 5/3.0) = 12.0
Гауссов радиус в GIMP
30px
CSS blur (Firefox 50) ~~ ceil(30 * 5/3.0) = 50.0
Gaussian radius in GIMP
75px
CSS blur (Firefox 50) ~~ ceil(75 * 5/3.0) = 125.0
Gaussian radius in GIMP
Implementation
Ivan Kuckir shares some быстрые алгоритмы размытия по Гауссу .