页面向下滚动时元素平滑上升
vue 指令
VSlideIn.js
const DISTANCE = 150;
const map = new WeakMap();
const ob = new IntersectionObserver((entries) => {
for (const entry of entries) {
if (entry.isIntersecting) {
// 元素与视口相交
const animation = map.get(entry.target);
if (animation) {
animation.play();
ob.unobserve(entry.target);
}
}
}
})
/**
* 判断元素是否在视口下方
* @param el
* @returns {boolean}
*/
const isBelowViewPort = (el) => {
return el.getBoundingClientRect().top - DISTANCE > window.innerHeight;
}
export default {
mounted(el, binding) {
// 在视口上方的元素不执行动画
if (!isBelowViewPort(el)) {
return;
}
const animation = el.animation([
{
transform: `translateY(${binding.value}px)`,
opacity: 0.5
},
{
transform: 'translateY(0)',
opacity: 1
}
], {
duration: 500,
easing: 'ease-in-out',
fill: 'forwards'
});
animation.pause();
ob.observe(el);
map.set(el, animation);
},
unmounted(el) {
ob.unobserve(el);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论