当前位置:首页 > JavaScript

js实现窗口抖动

2026-02-03 03:36:55JavaScript

实现窗口抖动效果

窗口抖动是一种常见的视觉反馈效果,可以通过CSS和JavaScript结合实现。以下是两种实现方式:

使用CSS动画和JavaScript触发

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

@keyframes shake {
  10%, 90% { transform: translateX(-5px); }
  20%, 80% { transform: translateX(10px); }
  30%, 50%, 70% { transform: translateX(-15px); }
  40%, 60% { transform: translateX(15px); }
}
function shakeElement(element) {
  element.classList.add('shake');
  element.addEventListener('animationend', () => {
    element.classList.remove('shake');
  }, {once: true});
}

// 使用示例
const windowElement = document.querySelector('.window');
shakeElement(windowElement);

纯JavaScript实现

function shakeWindow(element, duration = 500, distance = 10) {
  const startTime = Date.now();
  const originalPosition = element.getBoundingClientRect().left;

  function update() {
    const elapsed = Date.now() - startTime;
    const progress = elapsed / duration;

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

    // 使用正弦函数创建抖动效果
    const shake = Math.sin(progress * Math.PI * 10) * 
                 (1 - progress) * distance;
    element.style.transform = `translateX(${shake}px)`;

    requestAnimationFrame(update);
  }

  update();
}

// 使用示例
const windowElement = document.querySelector('.window');
shakeWindow(windowElement);

增强版抖动效果

以下代码实现了更自然的多方向抖动效果:

function advancedShake(element, {
  duration = 700,
  intensity = 15,
  shakeCount = 5
} = {}) {
  const startTime = Date.now();
  const originalTransform = element.style.transform;

  function update() {
    const elapsed = Date.now() - startTime;
    const progress = elapsed / duration;

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

    // 计算当前阶段的衰减系数
    const decay = 1 - progress;

    // 随机生成X和Y方向的偏移
    const x = (Math.random() * 2 - 1) * intensity * decay;
    const y = (Math.random() * 2 - 1) * intensity * decay;

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

  update();
}

注意事项

  • 抖动效果会改变元素的transform属性,确保不影响元素原有的transform样式
  • 对于频繁触发的抖动效果,建议添加防抖机制
  • 在移动设备上使用时,注意性能影响
  • 可以通过调整duration和intensity参数控制抖动强度和持续时间

这些方法可以应用于任何DOM元素,只需将querySelector的参数改为目标元素的选择器即可。

js实现窗口抖动

标签: 窗口js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…