- 效果展示

- 组件代码
<template>
<div class="snow-container">
<div
v-for="(snowflake, index) in snowflakes"
:key="snowflake.id"
:style="snowflake.style"
class="snowflake"
>
❄
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const snowflakes = ref([]);
let interval;
const generateId = () => {
return Date.now() + Math.random();
};
function createSnowflake() {
const id = generateId();
const horizontalMove = (Math.random() - 0.5) * 100;
const animationName = Math.random() > 0.5 ? 'fall linear infinite' : `fall linear infinite, sway ${Math.random() * 4 + 2}s ease-in-out infinite alternate`;
const snowflake = {
id,
style: {
left: `${Math.random() * 100}%`,
fontSize: `${Math.random() * 20 + 10}px`,
animationDuration: `${Math.random() * 5 + 5}s`,
animationDelay: `${Math.random() * 5}s`,
animation: animationName
},
};
snowflakes.value.push(snowflake);
setTimeout(() => {
snowflakes.value = snowflakes.value.filter(item => item.id !== id);
}, parseFloat(snowflake.style.animationDuration) * 1000);
}
onMounted(() => {
interval = setInterval(() => {
if (snowflakes.value.length < 200) {
createSnowflake();
}
}, 100);
});
onUnmounted(() => {
if (interval) {
clearInterval(interval);
}
snowflakes.value = [];
});
</script>
<style scoped>
.snow-container {
position: relative;
width: 100%;
height: 100vh;
overflow: hidden;
background: url(http://mms0.baidu.com/it/u=4004612276,3764837023&fm=253&app=138&f=JPEG?w=889&h=500) no-repeat;
background-size: 100% 100%;
}
.snowflake {
position: absolute;
top: -5%;
color: #fff;
user-select: none;
text-shadow: 0 0 8px rgba(255, 255, 255, 0.7);
will-change: transform;
opacity: 0.8;
}
@keyframes fall {
0% {
transform: translateY(0) rotate(0deg);
opacity: 0.8;
}
100% {
transform: translateY(100vh) rotate(360deg);
opacity: 0.2;
}
}
@keyframes sway {
0% {
transform: translateX(0) translateY(0) rotate(0deg);
}
100% {
transform: translateX(50px) translateY(100vh) rotate(360deg);
}
}
</style>
<div class="login-container">
<SnowModule />
</div>
import SnowModule from './component/snow.vue'