在 bg 重叠处将文本颜色从黑色更改为白色
Change text color black to white on overlap of bg
我有一个 div 绝对定位,背景颜色渐变。我上面有这段文字,我想在向上滚动文字时将其更改为白色。
我目前正在使用 'mix-blend-mode' 属性 来实现这一点,但我找不到任何可以将文本从黑色变为白色的设置。有没有人以前做过这个或者能想到我可以做的技巧?
.bg-container {
position: fixed;
top: -30px;
left: 0;
width: 100px;
height: 100px;
}
.gradient-background {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 200px;
background-image: linear-gradient(to bottom, rgb(100, 182, 240) 15%, rgb(81, 155, 244));
transform: skewY(-15deg);
}
.scroll-content {
position: absolute;
top: 50px;
}
.scroll-content p {
color: #000;
mix-blend-mode: overlay;
}
/*hack for iOS*/
.scroll-content p:after{
content: '0c'
}
<div class="bg-container">
<div class="gradient-background">
</div>
</div>
<div class="scroll-content">
<p> abc 1 </p>
<p> abc 2 </p>
<p> abc 3 </p>
<p> abc 4 </p>
<p> abc 5 </p>
<p> abc 6 </p>
<p> abc 7 </p>
<p> abc 8 </p>
<p> abc 9 </p>
<p> abc 10 </p>
<p> abc 11 </p>
<p> abc 12 </p>
<p> abc 13 </p>
<p> abc 14 </p>
<p> abc 15 </p>
<p> abc 16 </p>
<p> abc 17 </p>
<p> abc 18 </p>
<p> abc 19 </p>
</div>
*edit 1:更改了我的示例代码片段。背景渐变不仅仅是一个矩形 div。它有点倾斜,这就是让它变得如此困难的原因。所以文本在边界处变成双色调。
*为清楚起见编辑 2:我希望文本在白色背景上时为黑色(#000 实心),在 gradient/image 上时为白色(#FFF 实心)。我的内容是代码示例中的可滚动文本。
*编辑 3:iOS Safari 不兼容,除非您进行以下修改。将零宽度 space ​ ;
添加到每个文本元素以使其工作。这可以通过 CSS 属性 轻松完成,正如我在 CSS 标记中添加的那样。
您可以使用 JavaScript 进行测量并将样式应用于您想要的范围内的标签,但您也可以做一些非常简单的事情来使文本可读(这属于“我可以使用的其他技巧”做”):
.scroll-content {
text-shadow: 0 0 3px white;
}
这个只会在蓝底上出现,在白底上消失。不过,这 确实 取决于您想要达到的效果。
即使使用 JavaScript 实现,您也可以考虑 渐进式增强 (对于无 JS 用户)。
你可以用一些 javascript 来做到这一点:
$(document).ready(function() {
$(window).scroll(function() {
var bgHeight = $('.bg-container').height();
var scroll = $(window).scrollTop();
$('.scroll-content p').each((i, el) => {
var pPos = $(el).offset().top;
var pHeight = $(el).height();
if (pPos < (scroll - pHeight + bgHeight)) {
$(el).removeClass('black');
$(el).addClass('white');
} else {
$(el).addClass('black');
$(el).removeClass('white');
}
});
})
})
.bg-container {
position: fixed;
top: 0;
left: 0;
width: 100px;
height: 100px;
}
.gradient-background {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
background-image: linear-gradient(to bottom, rgb(1, 55, 124) 15%, rgb(81, 155, 244));
}
.scroll-content {
position: relative;
z-index: 99999;
font-family: neuzeit-grotesk, sans-serif;
font-weight: 700;
}
.white {
color: #fff;
}
.black {
color: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="bg-container">
<div class="gradient-background">
</div>
</div>
<br/><br/><br/><br/><br/><br/>
<div class="scroll-content menu_black">
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
</div>
您可以使用渐变来为文本着色。诀窍是使此渐变与您的形状相似(形状边缘的度数和颜色变化相同)。由于您的倾斜元素是固定的,因此您需要使渐变也固定以创建文本滚动的 magic 效果:
.gradient-background {
position: fixed;
top: 0;
left: 0;
width: 100px;
height: 200px;
background-image: linear-gradient(to bottom, rgb(100, 182, 240) 15%, rgb(81, 155, 244));
transform: skewY(-15deg);
transform-origin:left;
}
.scroll-content {
position: absolute;
top: 50px;
/* 165deg = 180deg - 15deg */
background: linear-gradient(165deg, #fff 195px,#000 195px) fixed;
background-clip: text;
-webkit-background-clip: text;
color: transparent;
-webkit-text-fill-color: transparent;
}
<div class="gradient-background">
</div>
<div class="scroll-content">
<p> abc 1 </p>
<p> abc 2 </p>
<p> abc 3 </p>
<p> abc 4 </p>
<p> abc 5 </p>
<p> abc 6 </p>
<p> abc 7 </p>
<p> abc 8 </p>
<p> abc 9 </p>
<p> abc 10 </p>
<p> abc 11 </p>
<p> abc 12 </p>
<p> abc 13 </p>
<p> abc 14 </p>
<p> abc 15 </p>
<p> abc 16 </p>
<p> abc 17 </p>
<p> abc 18 </p>
<p> abc 19 </p>
</div>
我有一个 div 绝对定位,背景颜色渐变。我上面有这段文字,我想在向上滚动文字时将其更改为白色。
我目前正在使用 'mix-blend-mode' 属性 来实现这一点,但我找不到任何可以将文本从黑色变为白色的设置。有没有人以前做过这个或者能想到我可以做的技巧?
.bg-container {
position: fixed;
top: -30px;
left: 0;
width: 100px;
height: 100px;
}
.gradient-background {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 200px;
background-image: linear-gradient(to bottom, rgb(100, 182, 240) 15%, rgb(81, 155, 244));
transform: skewY(-15deg);
}
.scroll-content {
position: absolute;
top: 50px;
}
.scroll-content p {
color: #000;
mix-blend-mode: overlay;
}
/*hack for iOS*/
.scroll-content p:after{
content: '0c'
}
<div class="bg-container">
<div class="gradient-background">
</div>
</div>
<div class="scroll-content">
<p> abc 1 </p>
<p> abc 2 </p>
<p> abc 3 </p>
<p> abc 4 </p>
<p> abc 5 </p>
<p> abc 6 </p>
<p> abc 7 </p>
<p> abc 8 </p>
<p> abc 9 </p>
<p> abc 10 </p>
<p> abc 11 </p>
<p> abc 12 </p>
<p> abc 13 </p>
<p> abc 14 </p>
<p> abc 15 </p>
<p> abc 16 </p>
<p> abc 17 </p>
<p> abc 18 </p>
<p> abc 19 </p>
</div>
*edit 1:更改了我的示例代码片段。背景渐变不仅仅是一个矩形 div。它有点倾斜,这就是让它变得如此困难的原因。所以文本在边界处变成双色调。
*为清楚起见编辑 2:我希望文本在白色背景上时为黑色(#000 实心),在 gradient/image 上时为白色(#FFF 实心)。我的内容是代码示例中的可滚动文本。
*编辑 3:iOS Safari 不兼容,除非您进行以下修改。将零宽度 space ​ ;
添加到每个文本元素以使其工作。这可以通过 CSS 属性 轻松完成,正如我在 CSS 标记中添加的那样。
您可以使用 JavaScript 进行测量并将样式应用于您想要的范围内的标签,但您也可以做一些非常简单的事情来使文本可读(这属于“我可以使用的其他技巧”做”):
.scroll-content {
text-shadow: 0 0 3px white;
}
这个只会在蓝底上出现,在白底上消失。不过,这 确实 取决于您想要达到的效果。
即使使用 JavaScript 实现,您也可以考虑 渐进式增强 (对于无 JS 用户)。
你可以用一些 javascript 来做到这一点:
$(document).ready(function() {
$(window).scroll(function() {
var bgHeight = $('.bg-container').height();
var scroll = $(window).scrollTop();
$('.scroll-content p').each((i, el) => {
var pPos = $(el).offset().top;
var pHeight = $(el).height();
if (pPos < (scroll - pHeight + bgHeight)) {
$(el).removeClass('black');
$(el).addClass('white');
} else {
$(el).addClass('black');
$(el).removeClass('white');
}
});
})
})
.bg-container {
position: fixed;
top: 0;
left: 0;
width: 100px;
height: 100px;
}
.gradient-background {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
background-image: linear-gradient(to bottom, rgb(1, 55, 124) 15%, rgb(81, 155, 244));
}
.scroll-content {
position: relative;
z-index: 99999;
font-family: neuzeit-grotesk, sans-serif;
font-weight: 700;
}
.white {
color: #fff;
}
.black {
color: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="bg-container">
<div class="gradient-background">
</div>
</div>
<br/><br/><br/><br/><br/><br/>
<div class="scroll-content menu_black">
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
<p>asdf</p>
</div>
您可以使用渐变来为文本着色。诀窍是使此渐变与您的形状相似(形状边缘的度数和颜色变化相同)。由于您的倾斜元素是固定的,因此您需要使渐变也固定以创建文本滚动的 magic 效果:
.gradient-background {
position: fixed;
top: 0;
left: 0;
width: 100px;
height: 200px;
background-image: linear-gradient(to bottom, rgb(100, 182, 240) 15%, rgb(81, 155, 244));
transform: skewY(-15deg);
transform-origin:left;
}
.scroll-content {
position: absolute;
top: 50px;
/* 165deg = 180deg - 15deg */
background: linear-gradient(165deg, #fff 195px,#000 195px) fixed;
background-clip: text;
-webkit-background-clip: text;
color: transparent;
-webkit-text-fill-color: transparent;
}
<div class="gradient-background">
</div>
<div class="scroll-content">
<p> abc 1 </p>
<p> abc 2 </p>
<p> abc 3 </p>
<p> abc 4 </p>
<p> abc 5 </p>
<p> abc 6 </p>
<p> abc 7 </p>
<p> abc 8 </p>
<p> abc 9 </p>
<p> abc 10 </p>
<p> abc 11 </p>
<p> abc 12 </p>
<p> abc 13 </p>
<p> abc 14 </p>
<p> abc 15 </p>
<p> abc 16 </p>
<p> abc 17 </p>
<p> abc 18 </p>
<p> abc 19 </p>
</div>