面试题答案
一键面试优化策略
- 节流(Throttle)与防抖(Debounce):
- 节流:在一定时间间隔内,无论触发多少次事件,只执行一次。例如,当屏幕尺寸频繁变化时,限制事件处理函数的执行频率,防止短时间内多次触发导致性能问题。
- 防抖:在事件触发后,等待一定时间,如果在这段时间内事件再次触发,则重新计时,直到等待时间结束才执行事件处理函数。这可以避免在用户快速调整窗口大小时,频繁执行不必要的操作。
- 硬件加速:利用CSS的
transform
和opacity
属性,因为现代浏览器可以将这些属性的动画处理交给GPU,从而提高性能。尽量避免使用top
、left
、width
、height
等会触发重排(reflow)和重绘(repaint)的属性来实现动画。 - 事件委托:如果有多个图片需要监听屏幕尺寸变化,可以使用事件委托,将事件监听器绑定到它们的共同父元素上,这样可以减少事件监听器的数量,提高性能。
实现代码
- HTML部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
<title>Responsive Image Animation</title>
</head>
<body>
<div class="image-container">
<img src="example.jpg" alt="Responsive Image" class="responsive-image">
</div>
<script src="script.js"></script>
</body>
</html>
- CSS部分(styles.css):
.responsive-image {
width: 100%;
height: auto;
opacity: 0;
transition: opacity 0.5s ease;
}
.show {
opacity: 1;
}
/* 特定尺寸下的动画 */
@media (min - width: 768px) {
.responsive-image {
transform: scale(1.1);
animation: detail - show 1s ease - in - out forwards;
}
@keyframes detail - show {
from {
transform: scale(1);
}
to {
transform: scale(1.1);
}
}
}
- JavaScript部分(script.js):
// 防抖函数
function debounce(func, delay) {
let timer;
return function() {
const context = this;
const args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
}
// 获取图片元素
const image = document.querySelector('.responsive - image');
// 处理屏幕尺寸变化的函数
function handleResize() {
if (window.innerWidth >= 768) {
image.classList.add('show');
} else {
image.classList.remove('show');
}
}
// 防抖处理
const debouncedResize = debounce(handleResize, 200);
// 监听窗口尺寸变化
window.addEventListener('resize', debouncedResize);
上述代码中,通过防抖函数debounce
限制了handleResize
函数的执行频率,避免了频繁的响应式变化导致的卡顿。CSS部分利用opacity
实现淡入淡出效果,利用transform
实现特定尺寸下的动画,并通过媒体查询来控制不同尺寸下的样式。