当前位置: 首页 > 面试题库 >

堆叠的半透明盒子的颜色取决于订单?

晁璞
2023-03-14
问题内容

为什么两个堆叠的半透明盒子的最终颜色取决于顺序?

如何使两种情况下的颜色相同?

.a {

  background-color: rgba(255, 0, 0, 0.5)

}



.b {

  background-color: rgba(0, 0, 255, 0.5)

}


<span class="a"><span class="b">          Color 1</span></span>

<span class="b"><span class="a">Different Color 2</span></span>

问题答案:

仅仅是因为在两种情况下,由于 顶层的 不透明度如何影响 底层 的颜色,颜色的组合并不相同。

对于第一种情况,您会在顶层看到 50%的蓝色 和50%的透明。通过透明部分,您可以在底层看到50%的红色(因此,我们总共只能看到
25%的红色 )。第二种情况的逻辑相同( 红色的50%蓝色的25%
);因此您会看到不同的颜色,因为在两种情况下我们的比例都不相同。

为避免这种情况,两种颜色的比例必须相同。

这是一个示例,可以更好地说明和展示如何获得相同的颜色:

在顶层(内部跨度)中,我们具有0.25不透明性(因此,我们具有第一种颜色的25%和透明性的75%),然后对于底层(外部跨度)中,我们具有0.333不透明性(因此,我们具有1/3的75%=颜色的25%,其余为透明)。我们在两个图层中所占的比例相同(25%),因此即使颠倒图层的顺序,我们也会看到
相同的颜色

.a {

  background-color: rgba(255, 0, 0, 0.333)

}



.b {

  background-color: rgba(0, 0, 255, 0.333)

}



.a > .b {

  background-color: rgba(0, 0, 255, 0.25)

}

.b > .a {

  background-color: rgba(255, 0, 0, 0.25)

}


<span class="a"><span class="b">          Color 1</span></span>

<span class="b"><span class="a">Different Color 2</span></span>

附带说明,白色背景也影响颜色的呈现。它的比例是50%,这将得出100%的逻辑结果(25%+ 25%+ 50%)。

您可能还会注意到,如果顶层的不透明度大于,0.5因为 第一 层的不透明度大于50%,第二层的不透明度 小于50%
,那么两种颜色的比例就不可能相同一:

.a {

  background-color: rgba(255, 0, 0, 1) /*taking 40% even with opacity:1*/

}



.b {

  background-color: rgba(0, 0, 255, 1) /*taking 40% even with opacity:1*/

}



.a > .b {

  background-color: rgba(0, 0, 255, 0.6) /* taking 60%*/

}

.b > .a {

  background-color: rgba(255, 0, 0, 0.6) /* taking 60%*/

}


<span class="a"><span class="b">          Color 1</span></span>

<span class="b"><span class="a">Different Color 2</span></span>

常见的琐碎情况是顶层具有opacity:1使顶层颜色比例为100%的图层;因此它是 不透明的 颜色。

为了更准确,更准确地进行说明,以下是用于计算颜色的公式,我们将两层结合起来后会看到ref:

ColorF = (ColorT*opacityT + ColorB*OpacityB*(1 - OpacityT)) / factor

ColorF 是我们的最终颜色。 ColorT / ColorB 分别是顶部和底部的颜色。 opacityT /
opacityB 分别是为每种颜色定义的顶部和底部不透明度:

factor由如下公式定义OpacityT + OpacityB*(1 - OpacityT)

显然,如果我们切换两个图层,factor则不会改变(它将保持不变),但是我们可以清楚地看到每种颜色的比例都会改变,因为我们没有相同的乘数。

对于我们最初的情况,两种情况都是0.5这样,所以我们将有:

ColorF = (ColorT*0.5 + ColorB*0.5*(1 - 0.5)) / factor

如上面所解释的,顶部颜色的比例为50%(0.5),底部颜色的比例为25%(0.5*(1-0.5)),因此切换图层也将切换这些比例。因此,我们看到了不同的
最终 颜色。

现在,如果我们考虑第二个html" target="_blank">示例,我们将有:

ColorF = (ColorT*0.25 + ColorB*0.333*(1 - 0.25)) / factor

在这种情况下,我们必须0.25 = 0.333*(1 - 0.25)切换两层无效。因此颜色将保持不变。

我们还可以清楚地识别出一些琐碎的案例:

  • 当顶层opacity:0的公式等于ColorF = ColorB
  • 当顶层opacity:1的公式等于ColorF = ColorT


 类似资料:
  • 问题内容: 我有一个DIV,我想放置一个图案作为背景。此图案是灰色的。为了使它更好一点,我想在上面放一个透明的颜色“层”。以下是我尝试过的方法,但是没有用。有没有办法将彩色图层放在背景图像上? 这是我的CSS: 问题答案: 这里是: 对此的HTML: 当然,如果其中没有其他元素,则需要为该类定义宽度和高度

  • 问题内容: 是否有一种简单的方法可以通过将两个现有的颜色图堆叠在一起来形成新的颜色图? 我要实现的目标是制作另一个颜色编码的散点图,其中颜色映射的变量从大的负值到大的正值不等,我想将值调低到零左右- 基本上,我希望能够从股票颜色图(例如,)中选择颜色映射变量的负值,并从另一个颜色(例如,)中选择该变量的正值。 问题答案: 这未经测试,但作为第一步,我将尝试制作一个简单的子类。 类定义。 您还将需要

  • 我有一个SVG元素,它包含两个尺寸和位置完全相同的子元素。两者唯一的区别是它们的颜色:第一个是红色,第二个是绿色。我注意到,即使绿色的圆圈在红色的上面,你仍然可以看到在圆圈的边缘有一点颜色偏移。我有什么办法可以避免这种颜色的变化吗? 下面是一张屏幕截图,显示了有红圈和没有红圈的情况: 这里还有我用来复制这个的小提琴。 null 欢迎任何不同的想法。

  • 我在一个在线编码挑战中遇到了这个问题。 给定一个长度和宽度为(l,h)的盒子列表,输出包含所有盒子所需的最少堆叠数量,如果一个盒子的长度和宽度小于另一个盒子的长度和宽度,则可以将一个盒子堆叠在另一个盒子的顶部。 我不知道如何想出一个多项式时间解决方案。我已经构建了一个蛮力解决方案,它递归地创建所有可能的堆栈排列(从N个堆栈开始。然后对于每个堆栈,尝试将其放在其他堆栈的顶部。然后递归地生成给定新堆栈

  • 我不知道如何更好地描述它,但我试图重新创建的是一个类似于这样的边框,所以所有元素周围和之间都有边框,外角是方形的,内角是圆角的(这使它们看起来有点像两个盒子连接的连接处)。我得到的最接近的是您可以在下面的代码片段中看到的内容。 可能根本就没有边框,但怎么做呢?它也不是链接上面的png图像或类似的东西,因为它是响应性的。我是CSS的初学者,所以这是我自己能想到的所有选项。 null null

  • 在Canvas绘图时,可以通过绘制上下文的strokeStyle属性和fillStyle属性来设置图形的描边颜色和填充颜色。默认颜色为不透明的黑色。 strokeStyle属性和fillStyle属性可以被设置为任意有效的CSS颜色字符串,可以使用颜色名称、十六进制RGB颜色、RGB、RGBA、HSL、HSLA颜色中的任意一种。 在使用RGBA或HSLA颜色时,可以通过设置其透明度(alpha)来