如何模拟元素的不透明效果而不使其透明?

cod*_*ker 5 css css-filters

我希望 div 具有filter:opacity(0.5)白色背景上的“灰色”外观,但我不想真正使其透明。我该怎么做呢?我知道一个解决方案就是在其后面放置另一个带有白色背景的元素,但我正在寻找一种仅具有 CSS 滤镜效果的更简单的解决方案。

Tem*_*fif 5

我将解释@codebreaker答案背后的数学原理,并尝试提供一个通用公式。我将依赖之前的答案,其中我定义了一些过滤函数的公式。

我们有f(x) = p*(x - 255/2) + 255/2为了contrast(p)f(x) = x*p为了brightness(p)

为了获得contrast(p1) brightness(p2)我们混合这两个函数

f(x) = p2*(p1*(x - 255/2) + 255/2)
Run Code Online (Sandbox Code Playgroud)

我们简化为

f(x) = p1*p2(*x - 127.5) + p2*127.5
Run Code Online (Sandbox Code Playgroud)

现在opacity(p)我们有参考

f(x) =  x*p + C*(1 - p)
Run Code Online (Sandbox Code Playgroud)

C图像的背景颜色在哪里,在您的情况下您认为是白色,所以我们可以将其替换255

f(x) =  x*p + 255*(1 - p) = p*(x - 255) + 255
Run Code Online (Sandbox Code Playgroud)

现在我们只是希望两个函数(不透明度函数和对比度亮度函数)相同,因此我们可以写

p1*p2*(x - 127.5) + p2*127.5 = p*(x - 255) + 255
Run Code Online (Sandbox Code Playgroud)

对于p=0.5, p1=1/3,p2=1.5=3/2我们将有

1/2*(x - 127.5) + 3/2*127.5 = 1/2*(x - 255) + 255
1/2*x - 127.5/2 + 3/2*127.5 = 1/2*x + 127.5
...
0 = 0
Run Code Online (Sandbox Code Playgroud)

这解释了您正在使用的值之间的关系。您还可以找到所需的任何其他值组合。

对于一般情况,我们可以考虑:

p1*p2*(x - 127.5) + p2*127.5 = p*(x - 255) + 255
x*(p1*p2 - p) + p2*127.5*(1 - p1) + p*255 - 255 = 0
Run Code Online (Sandbox Code Playgroud)

我们应该有(p1*p2 - p) = 0p2*127.5*(1 - p1) + p*255 - 255 = 0所以我们得到

p1*p2 = p
p2*(1 - p1) = (1 - p)*2
Run Code Online (Sandbox Code Playgroud)

最后

p2 = 2 - p
p1 = p/(2 - p)
Run Code Online (Sandbox Code Playgroud)

如果我们考虑不透明度,0.25我们将得到:

p2 = 1.75
p1 = 1/7
Run Code Online (Sandbox Code Playgroud)

f(x) = p2*(p1*(x - 255/2) + 255/2)
Run Code Online (Sandbox Code Playgroud)
f(x) = p1*p2(*x - 127.5) + p2*127.5
Run Code Online (Sandbox Code Playgroud)