当前位置:首页 > 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 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现继承

js实现继承

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

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…