当前位置:首页 > 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);

增强版抖动效果

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

js实现窗口抖动

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实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…