【问题标题】:CSS Filter cancels element position [duplicate]CSS过滤器取消元素位置[重复]
【发布时间】:2016-06-21 16:32:49
【问题描述】:

Demo page

body {
  -webkit-filter: blur(2px);
  filter: blur(2px);
}

div {
  background: blue;
  margin: auto;
  position: absolute;
  right: 0;
  top: 50%;  /*  <---- ignored */
  left: 0;
  height: 200px;
  width: 200px;
  transform: translateY(-50%);
}
&lt;div&gt;&lt;/div&gt;

filter:blur(1px)(或任何其他filter)提供给定位元素(Firefox)的父元素会使浏览器忽略子元素的位置。

有没有人遇到过这种情况并知道解决这种烦恼的方法?


在 FF48 beta / win7 上测试

【问题讨论】:

  • 如果我们可以给父元素高度 "height: 500px;".child 位置会起作用。
  • 我有same issue。我向 Firefox 提交了bug,我还要求 W3C 向change the spec 提供与大小/位置无关的过滤器。

标签: css firefox position


【解决方案1】:

这是因为绝对定位的元素是相对于它们的containing block 定位的,这是由它们最近的定位祖先或初始包含块(如果没有这样的祖先)建立的。

那么,如果您不使用filter,则包含块将是初始块,其尺寸与视口相同。

然而,如果你在body 上使用filter,这将建立一个包含块,即使对于绝对定位的后代也是如此。就像你使用position: relative一样。

body {
  position: relative;
}
div {
  background: blue;
  margin: auto;
  position: absolute;
  right: 0;
  top: 50%;
  left: 0;
  height: 200px;
  width: 200px;
  transform: translateY(-50%);
}
&lt;div&gt;&lt;/div&gt;

相反,我建议在html 上设置filter,并使用height: 100% 使其与视口一样高。

html {
  height: 100%;
  -webkit-filter: blur(2px);
  filter: blur(2px);
}
div {
  background: blue;
  margin: auto;
  position: absolute;
  right: 0;
  top: 50%;
  left: 0;
  height: 200px;
  width: 200px;
  transform: translateY(-50%);
}
&lt;div&gt;&lt;/div&gt;

【讨论】:

  • @vsync 这不是我回答的重点。当我说“绝对定位”时,我包括了固定。
  • 但是定位的fixed元素不关心相对的父母。它们仅与窗口本身相关,所以这实际上看起来像是一个浏览器错误,不是吗?
  • @vsync 否。相对定位的元素为绝对定位的后代建立一个包含块,但不为固定的后代建立一个包含块。 filter 也为固定的创建了一个包含块。所以这种行为有点类似于相对定位的容器和绝对定位的后代。
  • 我想知道这是为什么?这似乎是一个规范决定,可能会搞砸这么多,而且没有办法解决这个问题
  • 因为它更快。对于浏览器,让过滤器影响其包含块由过滤元素的祖先建立的后代会更昂贵
【解决方案2】:

body{ 
  -webkit-filter:blur(2px); 
  filter:blur(2px); 
  /* setting the viewport height on body */
  min-height: 100vh;
}

div{
  background: blue;
  margin: auto;
  position: absolute;
  right: 0;
  top: 50%;
  left: 0;
  height:200px;
  width: 200px;
  transform: translateY(-50%);
}
&lt;div&gt;&lt;/div&gt;

将主体设置为视口的最小高度似乎可行。

【讨论】:

  • 我的演示是最简单的代码,不能掉以轻心,因为实际代码要复杂得多。没有身体。没有可以给出的最小高度。
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
相关资源
最近更新 更多