当前位置:首页 > JavaScript

js实现窗口抖动

2026-02-03 03:36:55JavaScript

js实现窗口抖动

实现窗口抖动效果

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

js实现窗口抖动

使用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实现图片上传

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

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现视口

js实现视口

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

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…