我想在我的产品页面上做一个动画。当用户点击"添加到购物车"的产品图像将是动画移动和缩小到导航栏中的购物车图标。这里是一个示例html
$('div.test').on('animationend', (e) => {
$(e.target).remove();
})
//user click
$('div.test').addClass('animateTest');
.test {
position : fixed;
top : 200px;
left : 600px;
background : red;
width : 200px;
height : 300px;
}
@keyframes toCart {
25% {
top : 850px;
left : 550px;
width : 200px;
height : 300px;
}
100% {
top : 100px;
left : 1100px;
width : 0;
height : 0
}
}
.animateTest {
animation : toCart 2s;
/* animation-fill-mode: forwards; */
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="test">
</div>
困难的部分是,由于用户的视区不同,我可能需要使用javascript来获得购物车图标的位置(除非我可以从CSS中获得它,我认为这是不可能的):
whereIsCart = $('#cartIcon').offset()
我需要做一些事情
100% {
top : whereIsCart.top;
left : whereIsCart.left;
width : 0;
height : 0
}
但是我该怎么做呢?或者,有没有更好的实践来达到同样的目标?
3条答案
按热度按时间r6vfmomb1#
使用css过渡而不是关键帧动画可能更容易:
km0tfn4u2#
在JavaScript中使用CSS时,您可能希望使用CSSOM API;更具体地说,它是用于单位值的factory functions,例如
CSS.px()
、CSS.percent()
。不管动画本身使用CSS还是JS:要获取元素在视口中的当前位置,可以使用
Element.getBoundingClientRect()
,或者更一般地使用Element.getClientRects()
来获取所有相关框。CSS自定义属性
可以使用custom properties作为初始位置,也可以通过JavaScript进行设置,甚至可以在CSS中提供一个回退值。
如果您将它们用于动画(而不是作为动画)属性,则它应该可以正常工作:
@property
rule中定义,否则CSS无法使它具有动画效果,因为它的类型可以是任何类型(例如从长度到颜色的动画效果是不可能的)。Web动画API
在JavaScript中,您可以使用Web Animations API,它本质上是CSS动画,但在JS中。
你可以定义关键帧,持续时间,填充模式等等。因为
Animation.finished
是一个承诺,你可以简单地通过await
或Promise.then()
对动画的结束做出React。示例:
一个一个三个一个一个一个一个一个四个一个一个一个一个一个五个一个
使用Web动画也可以轻松完成多步动画,因为您可以在解决第一个动画的承诺后启动另一个动画。
mec1mxoz3#
CSS变量示例代码...