【问题标题】:CSS3 - fixed transparent navigation: Is there a way to color an element depending on the actually visible background of the element?CSS3 - 固定透明导航:有没有办法根据元素的实际可见背景为元素着色?
【发布时间】:2017-06-18 16:27:43
【问题描述】:

对于某些项目,我希望有一个透明的固定导航,其包含的元素的颜色取决于当前的底层背景颜色。

这意味着在最简单的情况下:取决于滚动 - 对于导航中的每个元素或文本 - 如果当前可见背景大部分是黑暗的,则将其着色为白色 - 否则将其着色为黑色。

有一个库完全符合我对图像的描述 - 看看下面的例子http://www.kennethcachia.com/background-check/fixed-nav.html

图书馆托管在这里:https://github.com/kennethcachia/background-check

然而,对于一个悬停多于图像的导航来说,这看起来相当复杂,因为要找到导航元素当前悬停的父元素并不容易。

在 CSS 和/或 Javascript/JQuery 中是否有办法根据元素的实际可见背景为元素着色?

再举一个例子来说明我的意思:

由于用户滚动菜单按钮当前处于深色背景上 - 所以将其涂成白色:

由于用户滚动菜单按钮当前处于白色背景 - 所以将其涂成金色:

以下 sn-p 显示了我想要实现的目标 - 如果我的固定导航悬停白色元素使其变为黑色 - 如果悬停黑色元素使其变为白色 - 如果悬停图像使其取决于图像像素(这是我可以通过图书馆实现的)。

body {
  background-color:blue;
}

/* If I am on a white or light background, make my color black */
#menu {
  color:white;
  position:fixed;
}

#first {
  height:100px;
  background-color:black;
}

#bar {
  height:100px;
  background-color:white;
}
<div id="menu">
I AM THE MENU - make me black if I am on a white background or on a light image
</div>

<div id="first"></div>

<div id="second">
  <div id="foo">
    <div id="bar"></div>
  </div>
</div>

<div id="third">
  <img src="https://i.stack.imgur.com/mx2yL.jpg" />
</div>

【问题讨论】:

  • 如果你使用elementFromPoint,你应该能够抓住底层元素,然后使用getComputedStyle。您可能需要将上面的元素设置为pointer-events: none,或者隐藏它,同时获取颜色。
  • 另外,如果它包含一个图像,动态创建一个 canvas 元素,绘制图像,然后从 canvas 中获取颜色。
  • @LGSon :你的意思是我可以在元素位置和大小上生成一个元素大小的画布,元素本身是不可见的,并计算这个画布的平均颜色?会很好,但我怎么能做到这一点?
  • 如果您显示重现问题的最小代码 sn-p,它们可能是其他解决方案。
  • 由于您可以在鼠标点击时抓取 x/y 位置,因此您也可以从画布中抓取正确的 x/y 值

标签: jquery html css colors


【解决方案1】:

使用脚本执行此操作会非常消耗性能,所以我会使用 mix-blend-mode,然后对不支持的浏览器使用后备,即设置半透明背景。

body {
  background-color:blue;
}

/* If I am on a white or light background, make my color black */
#menu {
  mix-blend-mode: exclusion;             /*  added  */
  color:white;
  position:fixed;
}

#first {
  height:100px;
  background-color:black;
}

#bar {
  height:100px;
  background-color:white;
}
<div id="menu">
I AM THE MENU
</div>

<div id="first"></div>

<div id="second">
  <div id="foo">
    <div id="bar"></div>
  </div>
</div>

<div id="third">
  <img src="https://i.stack.imgur.com/mx2yL.jpg" />
</div>

【讨论】:

  • 这很不错。此外,如果尚未完全支持浏览器的回退,也不是问题。但是,如果我可以 a) 使用整个元素的边框来获得效果(而不是每个像素)并且 b) 根据“排除”的结果定义某种颜色,那就太好了。有什么办法,或者这还不可能吗?
  • @Blackbam 如果您从 CSS Tricks codepen.io/team/css-tricks/pen/ZYdjmZ 检查此代码笔,您将可以详细说明这些值。如果只使用边框,请创建一个伪元素并将混合更多设置为它,但白色文本将在白色背景上变为白色,除非您将其与半透明背景混合。选项很多,只有您可以选择正确的一个:) ...我希望这会帮助您做到这一点
  • 非常感谢我会检查这个;-)
  • @Blackbam 不客气,顺便说一句,这里是 CSS Tricks 上的完整文章(它有更多可能有价值的信息)css-tricks.com/almanac/properties/m/mix-blend-mode
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多