当前位置:首页 > JavaScript

js实现晃动

2026-02-01 13:10:28JavaScript

实现元素晃动效果的方法

使用CSS动画结合JavaScript触发晃动效果是一种常见方式。以下是一个简单的实现方案:

CSS部分

.shake {
  animation: shake 0.5s cubic-bezier(.36,.07,.19,.97) both;
}

@keyframes shake {
  10%, 90% { transform: translate3d(-1px, 0, 0); }
  20%, 80% { transform: translate3d(2px, 0, 0); }
  30%, 50%, 70% { transform: translate3d(-4px, 0, 0); }
  40%, 60% { transform: translate3d(4px, 0, 0); }
}

JavaScript部分

function shakeElement(element) {
  element.classList.add('shake');
  element.addEventListener('animationend', () => {
    element.classList.remove('shake');
  }, {once: true});
}

// 使用示例
const button = document.querySelector('#myButton');
button.addEventListener('click', () => shakeElement(button));

物理模拟晃动效果

使用requestAnimationFrame实现更自然的物理晃动:

function physicsShake(element, intensity = 10, decay = 0.8) {
  let x = 0;
  let velocity = intensity;
  const originalX = element.offsetLeft;

  function animate() {
    x += velocity;
    velocity *= -decay;
    element.style.transform = `translateX(${x}px)`;

    if (Math.abs(velocity) > 0.1) {
      requestAnimationFrame(animate);
    } else {
      element.style.transform = '';
    }
  }

  animate();
}

使用GSAP库实现高级晃动

GSAP提供更强大的动画控制:

// 引入GSAP后使用
gsap.to(element, {
  x: "+=10",
  repeat: 5,
  yoyo: true,
  duration: 0.1,
  ease: "power1.inOut"
});

响应式晃动组件实现

创建一个可复用的晃动组件类:

js实现晃动

class Shaker {
  constructor(element) {
    this.element = element;
  }

  shake(options = {}) {
    const {
      intensity = 10,
      duration = 500,
      decay = 0.85
    } = options;

    const startTime = performance.now();

    const animate = (time) => {
      const elapsed = time - startTime;
      const progress = elapsed / duration;

      if (progress >= 1) {
        this.element.style.transform = '';
        return;
      }

      const shakeValue = intensity * Math.sin(progress * 20) * (1 - progress);
      this.element.style.transform = `translateX(${shakeValue}px)`;

      requestAnimationFrame(animate);
    };

    requestAnimationFrame(animate);
  }
}

// 使用示例
const shaker = new Shaker(document.getElementById('element'));
shaker.shake({ intensity: 15, duration: 1000 });

注意事项

  • 晃动动画应考虑性能影响,避免在低端设备上过度使用
  • 晃动幅度应根据元素大小和使用场景适当调整
  • 确保晃动结束后元素恢复原始位置
  • 移动端设备可能需要调整晃动参数以获得更好的触觉反馈效果

标签: js
分享给朋友:

相关文章

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现按钮点击

js 实现按钮点击

实现按钮点击的 JavaScript 方法 HTML 按钮元素 在 HTML 中创建一个按钮,可以通过 <button> 或 <input> 标签实现: <button…

实现图片旋转js

实现图片旋转js

使用CSS transform属性旋转图片 通过CSS的transform属性可以轻松实现图片旋转。以下是一个简单的示例代码: const image = document.getElement…

js实现筛选

js实现筛选

JavaScript 实现数据筛选的方法 使用 Array.filter() 方法 Array.filter() 是 JavaScript 中最常用的筛选方法,它会创建一个新数组,包含通过回调函数测试…