实现思路
- Svelte 生命周期:在 Svelte 组件中,使用
on:mouseenter
和 on:mouseleave
事件来触发动画。on:mouseenter
对应鼠标悬停,on:mouseleave
对应鼠标移开。
- 动画设计哲学:Svelte 提供了内置的动画函数,如
fade
和 scale
。利用这些函数,我们可以实现淡入和放大的动画效果。并且可以通过控制动画的 delay
来实现先后顺序。
关键代码片段
<script>
import { fade, scale } from'svelte/animate';
let isHovered = false;
</script>
<style>
.product-card {
position: relative;
overflow: hidden;
}
.product-image {
width: 100%;
height: auto;
transition: transform 0.3s ease;
}
.product-description {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
background-color: rgba(0, 0, 0, 0.7);
color: white;
padding: 10px;
opacity: 0;
transition: opacity 0.3s ease;
}
</style>
<div class="product-card" on:mouseenter={() => isHovered = true} on:mouseleave={() => isHovered = false}>
{#if isHovered}
{#key 'image'}
{#await scale(1.2, { duration: 300, delay: 0 })}
<img class="product-image" src="product.jpg" alt="Product">
{/await}
{/key}
{#key 'description'}
{#await fade({ duration: 300, delay: 150 })}
<div class="product-description">This is a product description.</div>
{/await}
{/key}
{:else}
<img class="product-image" src="product.jpg" alt="Product">
<div class="product-description">This is a product description.</div>
{/if}
</div>
性能和用户体验影响
- 性能:
- 优点:Svelte 的动画是基于浏览器的原生 CSS 动画,性能较好。并且通过
delay
控制动画顺序,避免了同时触发过多动画带来的性能开销。
- 缺点:如果页面上存在大量的产品卡片,每个卡片都有动画,可能会导致性能下降。可以通过优化,如使用
will-change
提前告知浏览器动画即将发生,提升性能。
- 用户体验:
- 优点:平滑的动画效果提升了用户与页面的交互性,使产品展示更加生动有趣。先后顺序的动画避免了信息过于突兀的展示,给用户一种流畅的体验。
- 缺点:如果动画的
duration
或 delay
设置不合理,可能会导致用户等待时间过长或动画过渡不自然,影响用户体验。需要根据实际情况进行调优。