当前位置:首页 > JavaScript

js 实现抽屉

2026-03-02 07:34:33JavaScript

实现抽屉效果的 JavaScript 方法

使用 CSS 和 JavaScript 切换类

通过添加或移除 CSS 类来控制抽屉的显示与隐藏。CSS 定义抽屉的初始状态(如 transform: translateX(-100%)),JavaScript 切换类来改变状态。

.drawer {
  position: fixed;
  top: 0;
  left: 0;
  width: 300px;
  height: 100%;
  background: #fff;
  transform: translateX(-100%);
  transition: transform 0.3s ease;
}
.drawer.open {
  transform: translateX(0);
}
const drawer = document.querySelector('.drawer');
const toggleButton = document.querySelector('.toggle-button');

toggleButton.addEventListener('click', () => {
  drawer.classList.toggle('open');
});

动态修改内联样式

直接通过 JavaScript 修改元素的 style 属性,适用于需要动态计算位置的场景。

js 实现抽屉

const drawer = document.querySelector('.drawer');
const toggleButton = document.querySelector('.toggle-button');

toggleButton.addEventListener('click', () => {
  const isOpen = drawer.style.transform === 'translateX(0px)';
  drawer.style.transform = isOpen ? 'translateX(-100%)' : 'translateX(0)';
});

使用动画库(如 GSAP)

通过 GSAP 实现更复杂的动画效果,例如弹性动画或缓动曲线。

js 实现抽屉

import { gsap } from 'gsap';

const drawer = document.querySelector('.drawer');
const toggleButton = document.querySelector('.toggle-button');

toggleButton.addEventListener('click', () => {
  const isOpen = drawer.style.transform === 'translateX(0px)';
  gsap.to(drawer, {
    x: isOpen ? -300 : 0,
    duration: 0.5,
    ease: 'power2.out'
  });
});

响应式抽屉实现

结合媒体查询和 JavaScript,在移动端和桌面端适配不同的抽屉行为。

@media (max-width: 768px) {
  .drawer {
    width: 80%;
  }
}
const drawer = document.querySelector('.drawer');
const toggleButton = document.querySelector('.toggle-button');

toggleButton.addEventListener('click', () => {
  if (window.innerWidth < 768) {
    drawer.classList.toggle('open');
  } else {
    // 桌面端其他逻辑
  }
});

无障碍优化

为抽屉添加 ARIA 属性和键盘事件支持,确保屏幕阅读器和键盘操作可用。

const drawer = document.querySelector('.drawer');
const toggleButton = document.querySelector('.toggle-button');

toggleButton.addEventListener('click', () => {
  const isOpen = drawer.classList.toggle('open');
  toggleButton.setAttribute('aria-expanded', isOpen);
});

document.addEventListener('keydown', (e) => {
  if (e.key === 'Escape' && drawer.classList.contains('open')) {
    drawer.classList.remove('open');
    toggleButton.setAttribute('aria-expanded', 'false');
  }
});

注意事项

  • 性能优化:使用 transformopacity 属性触发 GPU 加速,避免重排。
  • 遮罩层:为抽屉添加半透明遮罩(overlay)以提升用户体验。
  • 状态管理:通过 data-* 属性或变量记录抽屉状态,避免频繁查询 DOM。

标签: 抽屉js
分享给朋友:

相关文章

js 实现继承

js 实现继承

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

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: f…

js实现正交

js实现正交

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