【发布时间】:2020-04-20 20:46:50
【问题描述】:
我在一个网站上使用Daniel Eden's animate.css。它工作得很好,但我遇到了已经应用transform:translate() 的元素的问题。
我遇到的问题:
我有一个div,它固定在页面底部,在 x 方向上变换了 -50%,在 y 方向上变换了一点多于 -100% 以使其居中:
#resend_activation_div {
position:fixed;
top:100%;
left:50%;
transform:translate(-50%, calc(-100% - 10px));
}
单击 X 时,我将 animated fadeOutDown 添加到 div 的 classList。我希望元素从页面上的位置直接向下淡出。问题是,动画的工作方式如下......
@-webkit-keyframes fadeOutDown {
from {
opacity: 1;
}
to {
opacity: 0;
-webkit-transform: translate3d(0, 100%, 0);
transform: translate3d(0, 100%, 0);
}
}
...所以我原来的变换规则被覆盖,元素在上图中蓝色箭头的方向淡出。
我的解决方法:
到目前为止,我发现克服这个问题的唯一方法是定义一个新类,其中包含我想要的翻译,并在 classList 中使用它...
@-webkit-keyframes fadeOutDownWithCentering {
from {
opacity:1
}
to {
opacity:0;
-webkit-transform:translate3d(-50%, 100%, 0);
transform:translate3d(-50%, 100%, 0)
}
}
...这行得通,但这意味着为我在元素上的每个不同转换为每个动画编写一个新规则!
所以我的问题是:有没有更聪明的方法来做到这一点?在动画规则中执行转换时,我可以让 css 尊重我的原始转换吗?
【问题讨论】:
-
对于特定的
div,您可以使用left: 0; right: 0; width: 50%; bottom: 10px; margin: 0 auto;来避免使用转换。但是,您也可以将元素包装在一个新的div中,该div将接收animate.css 转换。 -
感谢@chriskirknielsen 的建议。但是,这仅在您在元素上指定宽度时才有效吗? div 根据上下文包含不同的文本,因此如果它的文本很少,我希望它足够大以包含内容,即不要在元素上设置
width。跨度> -
您使用两个包装器制作元素,一个将获取您的动画,另一个将获取 animate.css
-
您可以使用
!important为您的css 属性赋予优先级,这样它就不会被以下属性覆盖。或者在您使用fixed位置的情况下,只需使用margin而不是transform:translate -
我的answer below 有帮助吗?
标签: css css-animations animate.css