我不是网络/CSS 程序员,但我需要一个看起来像 CSS 的 box-shadow 算法,并决定了解它是如何工作的。
我使用 CSSmatic 的 online box-shadow tool 进行下面的比较。
该算法似乎有 2 个步骤。
第 1 步:矢量化缩放和移位
如图所示,27px CSS 展开 inset 表示将形状缩放为尺寸为27*2 像素更小。这与轮廓框阴影相反(例如27*2 像素更大)。
水平/垂直偏移是不言自明的。
第 2 步:高斯模糊
历史
Mozilla 开发人员 David Baron 写了一篇关于 CSS box-shadow 实现的详细文章here。
直到 2011 年,CSS 模糊半径还没有标准含义。可以对应不同浏览器的不同算法和参数:
不同的浏览器...历史上做过不同的事情
对于相同的模糊半径,无论是在模糊算法方面还是在什么方面
该算法的半径意味着(即,给定半径的模糊程度
做东西)。 .... 在过去的一年中,CSS 和 HTML 规范
已更改(对于 CSS)以定义此模糊半径的含义或(对于
HTML) 以便他们在此定义上达成一致。
这些历史差异可以解释 moz- 前缀(您提到的)和 webkit- 前缀的用途。这些可能会为 Mozilla 和基于 WebKit 的浏览器指定要使用的替代 box-shadow 参数。
由于标准化,我希望这些前缀版本现在已弃用,但可能用于与旧浏览器的兼容性。
标准化
根据 Baron 的说法,现在有一个 精确、标准的定义盒阴影模糊半径:
模糊效果现在由 css3-background 和 HTML 定义为
高斯模糊,标准偏差 (σ) 等于 一半 给定模糊半径,允许合理的近似误差。
数学家可以将其扩展为精确的公式。
视觉近似
在GIMP 中反复试验后,我发现通过将 CSS 模糊参数乘以 5/3(1.6666...),然后四舍五入到最接近的整数获得的高斯模糊半径会产生一个非常接近视觉近似(在 Firefox 50 中的 CSS):
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 GIMP 中的高斯半径
75px CSS blur (Firefox 50) ~~ ceil(75 * 5/3.0) = 125.0 GIMP 中的高斯半径
实施
Ivan Kuckir 分享了一些 fast Gaussian blur algorithms.