【问题标题】:CSS animation-fill-mode and z-index issueCSS动画填充模式和z-index问题
【发布时间】:2014-11-23 19:37:35
【问题描述】:

我正在一个项目中使用 CSS 动画(来自 animate.css)。 我发现当在一个包含绝对定位和 z-indexed 子元素的容器中淡入淡出时,子元素的 z-index 无法正常工作。

我在这个小提琴中重新创建了这个问题: http://jsfiddle.net/Lxsf9ako/

这个问题似乎是由

引起的
animation-fill-mode: both;

这个样式是由 animate.css 放置在容器上的,因此我无法控制它。我可以使用animation-fill-mode: none 覆盖它,但我宁愿不要对每个动画都这样做。

对此有什么想法吗?

更新: 我刚刚发现这是 webkit 相关的,IE11 可以正确呈现。

更新 2: 我无法在悬停时编辑 .container 类。

更新 3: Fiddle 中的“悬停”只是一个演示。事实上,.over 对象是 angular-ui-bootstrap datepicker 指令的弹出窗口,.container 元素是整个应用程序中使用的通用元素。给它们一个额外的 id/class 以将它们标识为 datepicker 容器对我来说不是一个干净的解决方案。

【问题讨论】:

  • 悬停时需要更改 z-index
  • 您可以像这样在您的情况下将 z-index:-1 添加到第二个 .container > jsfiddle.net/Lxsf9ako/6 ||但正如我所见,你的例子不是你的实际场景,所以很难说..试试看。

标签: css google-chrome webkit z-index css-animations


【解决方案1】:

您可以在hover 上更改容器的z-index。试试这个:

.container:hover {
    z-index:100;
}

查看http://jsfiddle.net/Lxsf9ako/2/

【讨论】:

  • 嘿,这确实有效,但在这种特定情况下我不能这样做,容器是整个应用程序中使用的通用类,我无法控制它。该问题需要在叠加层本身上解决。
  • 所以你不能创建自己的css? @GerritBertier
  • 可以,但是悬停其实只是一个演示案例。实际上,“覆盖”是 angular-ui-bootstrap datepicker 指令的弹出窗口,容器是一个通用类。单击日期选择器按钮时应显示弹出窗口,除非确实需要,否则我不想添加额外的 javascript。
【解决方案2】:

只需添加

#hoverme{
   z-index: 1;
}

DEMO

为什么你必须这样做

没有任何 z-index 值,元素按照它们的顺序堆叠 出现在 DOM 中(同层级的最下层) 出现在顶部)。具有非静态定位的元素将始终 出现在具有默认静态定位的元素之上。

还要注意嵌套起着重要作用。如果元素 B 位于顶部 元素A,元素A的子元素永远不能高于 元素 B。

From css-tricks.com

#hoverme {
  z-index: 1;
}
.container {
  background: rgb(255, 255, 255);
  /* Old browsers */
  background: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#efefef));
  background: -webkit-linear-gradient(#fff 0%, #efefef 100%);
  background: -moz-linear-gradient(#fff 0%, #efefef 100%);
  background: -o-linear-gradient(#fff 0%, #efefef 100%);
  background: linear-gradient(#fff 0%, #efefef 100%);
  filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#efefef', GradientType=0);
  /* IE6-9 */
  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
  display: block;
  width: 100%;
  border: 1px solid #c7c7c7;
  margin-bottom: 10px;
  position: relative;
  padding: 20px;
  box-sizing: border-box;
  -webkit-animation-name: fadeIn;
  /* Safari, Chrome and Opera > 12.1 */
  -moz-animation-name: fadeIn;
  /* Firefox < 16 */
  -ms-animation-name: fadeIn;
  /* Internet Explorer */
  -o-animation-name: fadeIn;
  /* Opera < 12.1 */
  animation-name: fadeIn;
  -webkit-animation-duration: 1s;
  -moz-animation-duration: 1s;
  -ms-animation-duration: 1s;
  -o-animation-duration: 1s;
  animation-duration: 1s;
  -webkit-animation-fill-mode: both;
  -moz-animation-fill-mode: both;
  -ms-animation-fill-mode: both;
  -o-animation-fill-mode: both;
  animation-fill-mode: both;
}
#hoverme .over {
  display: none;
  padding: 20px;
  position: absolute;
  top: 20px;
  left: 20px;
  width: 200px;
  background: #efefef;
  z-index: 10;
  box-sizing: border-box;
  -webkit-box-shadow: 2px 2px 4px 0px rgba(0, 0, 0, 0.75);
  -moz-box-shadow: 2px 2px 4px 0px rgba(0, 0, 0, 0.75);
  box-shadow: 2px 2px 4px 0px rgba(0, 0, 0, 0.75);
}
#hoverme:hover .over {
  display: block;
}
@keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
/* Firefox < 16 */

@-moz-keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
/* Safari, Chrome and Opera > 12.1 */

@-webkit-keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
/* Internet Explorer */

@-ms-keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
/* Opera < 12.1 */

@-o-keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
<div id="hoverme" class="container">
  <div class="over">I should be over the next container</div>
</div>
<div class="container">I should be under the .over</div>

更新

您还可以在.over 上使用带有opacityvisibility 的转换。

#hoverme .over {
    opacity: 0; 
    visibility:hidden;
    transition:visibility 0.4s, opacity 0.4s; 
    ...
}

#hoverme:hover .over {
    visibility:visible;
    opacity:1;
}

DEMO

.container {
  background: rgb(255, 255, 255);
  /* Old browsers */
  background: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#efefef));
  background: -webkit-linear-gradient(#fff 0%, #efefef 100%);
  background: -moz-linear-gradient(#fff 0%, #efefef 100%);
  background: -o-linear-gradient(#fff 0%, #efefef 100%);
  background: linear-gradient(#fff 0%, #efefef 100%);
  filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#efefef', GradientType=0);
  /* IE6-9 */
  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
  display: block;
  width: 100%;
  border: 1px solid #c7c7c7;
  margin-bottom: 10px;
  position: relative;
  padding: 20px;
  box-sizing: border-box;
}
#hoverme .over {
  opacity: 0;
  visibility: hidden;
  transition: visibility 0.4s, opacity 0.4s;
  padding: 20px;
  position: absolute;
  top: 20px;
  left: 20px;
  width: 200px;
  background: #efefef;
  z-index: 10;
  box-sizing: border-box;
  -webkit-box-shadow: 2px 2px 4px 0px rgba(0, 0, 0, 0.75);
  -moz-box-shadow: 2px 2px 4px 0px rgba(0, 0, 0, 0.75);
  box-shadow: 2px 2px 4px 0px rgba(0, 0, 0, 0.75);
}
#hoverme:hover .over {
  visibility: visible;
  opacity: 1;
}
<div id="hoverme" class="container">
  <div class="over">I should be over the next container</div>
</div>
<div class="container">I should be under the .over</div>

【讨论】:

  • 好吧,如果您使用的是框架(角度),这应该可以使用 ootb。您的代码中的某些内容似乎在这里干扰。
  • 问题是 animate.css (daneden.github.io/animate.css) 动画与 angular-ui-bootstrap datepicker 指令的组合。这是 Chrome 中的 -webkit-animation-fill-mode css 属性的问题,IE11 可以正确呈现。
  • 真的。好吧,this workaround 可以帮助你。但是这里的消息只是被opacity 隐藏了。您可以添加一些 JS 以获得更好的结果。
  • 这会移除 .container 元素上的动画并将其放置在 .over 元素上。我可能会尝试使用 opacity 属性找到修复程序,以尝试将元素恢复为堆叠顺序,但会及时通知您。
猜你喜欢
  • 2015-10-31
  • 1970-01-01
  • 2011-11-24
  • 2011-03-13
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多