当前位置:首页 > JavaScript

js实现图片抖动效果

2026-01-30 17:38:01JavaScript

实现图片抖动效果的几种方法

使用CSS动画和JavaScript触发

CSS中定义关键帧动画实现抖动效果,通过JavaScript动态添加或移除类名控制动画播放。

@keyframes shake {
  0%, 100% { transform: translateX(0); }
  10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
  20%, 40%, 60%, 80% { transform: translateX(5px); }
}

.shake-effect {
  animation: shake 0.5s cubic-bezier(.36,.07,.19,.97) both;
}
const img = document.querySelector('img');
img.addEventListener('click', () => {
  img.classList.add('shake-effect');
  setTimeout(() => img.classList.remove('shake-effect'), 500);
});

纯JavaScript实现随机位移

通过定时器快速修改图片位置实现抖动,适合需要精细控制抖动的场景。

function shakeImage(element, duration = 500, intensity = 5) {
  let startTime = null;
  const originalPosition = element.getBoundingClientRect();

  function animate(timestamp) {
    if (!startTime) startTime = timestamp;
    const progress = timestamp - startTime;
    const percent = Math.min(progress / duration, 1);

    const x = (Math.random() * 2 - 1) * intensity * (1 - percent);
    const y = (Math.random() * 2 - 1) * intensity * (1 - percent);

    element.style.transform = `translate(${x}px, ${y}px)`;

    if (progress < duration) {
      requestAnimationFrame(animate);
    } else {
      element.style.transform = '';
    }
  }

  requestAnimationFrame(animate);
}

// 使用示例
const img = document.getElementById('target-image');
img.addEventListener('mouseover', () => shakeImage(img));

使用GSAP动画库

GSAP提供更强大的动画控制能力,适合复杂抖动效果。

import { gsap } from "gsap";

function shakeWithGSAP(element) {
  gsap.to(element, {
    x: () => Math.random() * 10 - 5,
    y: () => Math.random() * 10 - 5,
    duration: 0.1,
    repeat: 5,
    onComplete: () => gsap.set(element, { x: 0, y: 0 })
  });
}

物理模拟抖动效果

模拟弹簧物理效果实现更自然的抖动,需要引入简单物理计算。

function physicsShake(element, power = 10) {
  let velocity = { x: power, y: -power };
  const damping = 0.8;
  const position = { x: 0, y: 0 };

  function update() {
    velocity.x *= damping;
    velocity.y *= damping;
    position.x += velocity.x;
    position.y += velocity.y;

    element.style.transform = `translate(${position.x}px, ${position.y}px)`;

    if (Math.abs(velocity.x) > 0.1 || Math.abs(velocity.y) > 0.1) {
      requestAnimationFrame(update);
    } else {
      element.style.transform = '';
    }
  }

  update();
}

注意事项

  • 性能优化:对于频繁触发的抖动效果,建议使用CSS动画或硬件加速属性如transform
  • 可访问性:避免对光敏感用户造成不适,可提供关闭选项
  • 移动端适配:可能需要调整抖动幅度以适应不同屏幕尺寸
  • 动画中止:实现清除抖动状态的方法,防止动画累积

以上方法可根据具体需求选择,CSS方案适合简单场景,JavaScript方案提供更多控制,GSAP适合复杂动画需求。

js实现图片抖动效果

标签: 效果图片
分享给朋友:

相关文章

vue实现图片循环

vue实现图片循环

实现图片循环的基本方法 在Vue中实现图片循环通常使用v-for指令结合数组数据。以下是基础实现方式: <template> <div> <img v-f…

css3制作立体效果

css3制作立体效果

使用 transform 属性实现立体旋转 通过 transform-style: preserve-3d 和 rotateX/Y/Z 实现 3D 空间变换: .container { tr…

css3手工制作图片

css3手工制作图片

使用CSS3手工制作图片 CSS3可以通过各种属性如box-shadow、border-radius、gradient等来手工绘制简单的图形或图片效果。以下是几种常见的方法: 绘制圆形 通过bord…

vue实现对话框效果

vue实现对话框效果

Vue 对话框实现方法 使用组件化方式封装对话框 创建一个独立的对话框组件(如Dialog.vue),通过v-model控制显示隐藏: <template> <div cla…

vue2实现图片懒加载

vue2实现图片懒加载

实现图片懒加载的方法 在Vue2中实现图片懒加载可以通过以下方法完成,核心原理是监听图片是否进入可视区域,再动态加载图片资源。 使用IntersectionObserver API Interse…

h5实现全景图片

h5实现全景图片

H5 实现全景图片的方法 使用 Three.js 库 Three.js 是一个强大的 3D 库,可以用于创建全景图片效果。以下是一个简单的实现步骤: 引入 Three.js 库 <scri…