为什么在父母中应用CSS滤波器打破孩子的定位?
因此,我有这个标题屏幕“动画”,标题以全屏页面为中心,当您向下滚动时,它会变小并保持在页面顶部。这是一个具有预期行为的工作示例,我从中剥离了所有不必要的代码,以使其最少:
$(window).scroll( () => {
"use strict";
let windowH = $(window).height();
let windowS = $(window).scrollTop();
let header = $("#header").height();
if (windowS < windowH-header) {
$("#title").css("transform", "scale("+(2-(windowS/($(document).outerHeight()-windowH))*2.7)+")");
$("#header").css("transform", "translateY(0)");
$("#inside, #content").css({
"position": "static",
"margin-top": 0
});
} else {
$("#inside").css({
"position": "fixed",
"margin-top": -windowH+header
});
$("#content").css("margin-top", windowH);
}
$("#header").css("position", windowS > (windowH-header)/2 ? "fixed" :"static");
});
.fixed {
position: fixed!important;
}
.wrapper {
width: 100%;
text-align: center;
}
.wrapper:before {
display: table;
content: " ";
}
.wrapper:after {
clear: both;
}
#inside {
width: 100%;
height: 100vh;
background-color: lightcoral;
display: flex;
align-items: center;
justify-content: center;
}
#header {
height: 90px;
top: 0;
position: sticky;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.5s;
}
#title {
width: 100%;
color: #fff;
transform: scale(2);
}
#content {
height: 1000px;
background-color: lightblue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="wrapper">
<div id="inside">
<div id="header">
<h1 id="title">Title</h1>
</div>
</div>
<div id="content"></div>
</body>
接下来是完全相同的片段,但有一个添加:我应用了一个过滤器,就我而言,它纯粹是化妆品:滤镜:亮度:亮度(1.3);
。
如下所示,当您滚动到“动画”中途滚动时,标题就消失了。当您检查元素时,它仍然具有其所有属性,但它以某种方式消失了。在Firefox和Chrome中也是如此,我不知道为什么。如果有人可以发布使用过滤器的工作片段,并解释为什么它以前不起作用,我将非常感谢它。
$(window).scroll( () => {
"use strict";
let windowH = $(window).height();
let windowS = $(window).scrollTop();
let header = $("#header").height();
if (windowS < windowH-header) {
$("#title").css("transform", "scale("+(2-(windowS/($(document).outerHeight()-windowH))*2.7)+")");
$("#header").css("transform", "translateY(0)");
$("#inside, #content").css({
"position": "static",
"margin-top": 0
});
} else {
$("#inside").css({
"position": "fixed",
"margin-top": -windowH+header
});
$("#content").css("margin-top", windowH);
}
$("#header").css("position", windowS > (windowH-header)/2 ? "fixed" :"static");
});
.fixed {
position: fixed!important;
}
.wrapper {
width: 100%;
text-align: center;
}
.wrapper:before {
display: table;
content: " ";
}
.wrapper:after {
clear: both;
}
#inside {
width: 100%;
height: 100vh;
background-color: lightcoral;
filter: brightness(1.3); /*<<<<<<<<<<<<<<<<*/
display: flex;
align-items: center;
justify-content: center;
}
#header {
height: 90px;
top: 0;
position: sticky;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.5s;
}
#title {
width: 100%;
color: #fff;
transform: scale(2);
}
#content {
height: 1000px;
background-color: lightblue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="wrapper">
<div id="inside">
<div id="header">
<h1 id="title">Title</h1>
</div>
</div>
<div id="content"></div>
</body>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果我们参考规范我们可以阅读:
这意味着您的
位置:固定
元素将相对放置在过滤后的容器上,而不再是视口。换句话说,它仍然是固定的,但在其 new 内部包含块(过滤后的容器)中,这是一个简化的版本,可以说明问题:
要解决该问题,请尝试将过滤器移至固定元件而不是其容器:
这是一个非偏心 1 导致创建绝对和固定位置后代的包含块的属性列表
filter
filter变换
背景 - 文件
refperspective
ref包含
ref (与布局
值一起使用)容器
reftransform-style
refcontent-visibily
refwill-change
与上述值之一一起使用1 :我将尝试将此列表保持最新。
If we refer to the specification we can read:
This means that your
position:fixed
element will be positioned relatively to the filtered container and no more the viewport. In other words, it's still fixed but inside its new containing block (the filtered container)Here is a simplified version to illustrate the issue:
To fix the issue try to move the filter to the fixed element instead of its container:
Here is a non-exhaustive1 list of the properties that results in the creation of a containing block for absolute and fixed positioned descendants
filter
transform
refbackdrop-filter
refperspective
refcontain
ref (when used with thelayout
value)(It's no more the case)container
reftransform-style
refcontent-visibility
refwill-change
when used with one of the above values1: I will try to keep this list up to date.
您可以在之前使用
实现它。而不是将
之前,将颜色和过滤器分配给过滤器分配给亮度(1.3);
直接直接为子元素。在此子元素的。因此,您的代码应该是这样的:
这将解决问题。
您还应该编辑一些代码以使其完全工作:
使父位置相对确保包装在其父母内部。
该解决方案还可以与其他过滤器(例如Backdrop-Filter )一起使用。
You can make it happen by using
before
. instead of assigning thefilter: brightness(1.3);
to the child element directly. assign color and filter to thebefore
of this child element. so your code should be like this:This will fix the problem.
You should also edit some of your code to make this fully work:
Make the parent position to be relative to make sure the
before
wrap inside its parent.This solution also works with other filters like
backdrop-filter
.为了避免对每个浏览器进行硬维护和不同的实现,您可以使用递归树遍历功能,该功能标记“固定”节点的位置,然后正确应用所需的过滤器而不会破坏位置。
我使用 this 代码以便在全球范围内应用'filter' - 将其编码为特定的父元素。
In order to avoid hard maintenance and different implementation for each browser, you can use a recursive tree traversal function which marks the position 'fixed' nodes and then apply the needed filter properly without destroying the positions.
I used this code in order to apply the 'filter invert' property globally, without hard-coding it to specific parent elements.
如果要模糊或灰度整个页面,除一个元素外,只需使用
Backdrop-Filter
而不是filter> filter
。在写作时,Firefox只需要 ship 默认情况下。
不工作:
在职的:
If you want to blur or grayscale the entire page except one element, just use
backdrop-filter
instead offilter
.At the time of writing Firefox just needs to ship it by default.
Not working:
Working: