面试题答案
一键面试关键技术点
- 动画控制:使用CSS的
@keyframes
规则来定义动画序列,通过animation
属性应用动画。利用requestAnimationFrame
来确保动画流畅执行,避免卡顿。 - 状态管理:使用React的
useState
钩子(假设使用React框架)来管理组件的点击状态,从而触发动画。
主要实现代码(以React为例)
import React, { useState } from 'react';
import './styles.css';
const CustomAnimationComponent = () => {
const [isClicked, setIsClicked] = useState(false);
const handleClick = () => {
setIsClicked(!isClicked);
};
return (
<div className={`animation-container ${isClicked ? 'clicked' : ''}`} onClick={handleClick}>
</div>
);
};
export default CustomAnimationComponent;
CSS代码(styles.css)
.animation-container {
width: 100px;
height: 100px;
border-radius: 50%;
background-color: red;
animation: none;
transition: all 0.5s ease;
}
.clicked {
border-radius: 0;
background-color: green;
width: 200px;
height: 150px;
}
代码解释
- JavaScript部分:
useState
钩子初始化一个状态isClicked
,用于记录组件是否被点击。handleClick
函数在点击时切换isClicked
的状态。- 返回的
div
元素根据isClicked
的状态添加不同的类名。
- CSS部分:
.animation-container
定义了组件的初始样式,圆形且红色背景。.clicked
类定义了点击后的样式,矩形且绿色背景,并通过transition
属性实现平滑过渡。
若使用其他框架,如Vue,思路类似,但具体语法会有所不同。例如Vue的实现:
Vue实现代码(假设使用Vue 3 + Composition API)
<template>
<div :class="['animation-container', isClicked ? 'clicked' : '']" @click="handleClick">
</div>
</template>
<script setup>
import { ref } from 'vue';
const isClicked = ref(false);
const handleClick = () => {
isClicked.value =!isClicked.value;
};
</script>
<style scoped>
.animation-container {
width: 100px;
height: 100px;
border-radius: 50%;
background-color: red;
transition: all 0.5s ease;
}
.clicked {
border-radius: 0;
background-color: green;
width: 200px;
height: 150px;
}
</style>
在Vue中,使用ref
来创建响应式状态isClicked
,在模板中通过绑定类名和点击事件来实现同样的功能。