Hamburgers动画事件监听:transitionend回调应用

Hamburgers动画事件监听:transitionend回调应用

【免费下载链接】hamburgers Tasty CSS-animated Hamburgers 【免费下载链接】hamburgers 项目地址: https://gitcode.com/gh_mirrors/ha/hamburgers

你是否曾遇到过汉堡菜单动画未完成就触发后续操作的问题?本文将详细介绍如何利用transitionend事件监听Hamburgers动画完成状态,确保菜单交互流畅自然。读完本文你将掌握:动画完成检测方法、回调函数设计、多动画同步处理及实际项目应用示例。

项目基础与动画原理

Hamburgers是一个CSS动画汉堡图标库,提供了多种动画效果如3D旋转、弹性形变等。项目核心动画定义在Sass源码中,通过transition属性控制动画过程。

基础动画参数定义在_base.scss中:

transition-property: opacity, filter;
transition-duration: 0.15s;
transition-timing-function: linear;

不同动画类型如折叠效果_collapse.scss会覆盖基础参数,设置特定的过渡曲线和时长:

transition-duration: 0.13s;
transition-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);

transitionend事件监听实现

基本监听模式

通过JavaScript监听transitionend事件可捕获动画完成状态。以折叠动画为例:

const hamburger = document.querySelector('.hamburger--collapse');
hamburger.addEventListener('transitionend', function(e) {
  // 检测特定动画属性完成
  if (e.propertyName === 'transform') {
    console.log('折叠动画完成');
    // 菜单显示/隐藏逻辑
    document.getElementById('navigation').classList.toggle('is-visible');
  }
});

多动画类型适配

不同动画类型可能触发多个transitionend事件,需通过事件委托统一处理:

document.addEventListener('transitionend', function(e) {
  // 仅处理汉堡图标元素
  if (e.target.closest('.hamburger')) {
    const hamburger = e.target.closest('.hamburger');
    const type = Array.from(hamburger.classList).find(c => c.startsWith('hamburger--'));
    
    // 根据动画类型执行不同回调
    switch(type) {
      case 'hamburger--collapse':
        handleCollapseComplete(hamburger);
        break;
      case 'hamburger--elastic':
        handleElasticComplete(hamburger);
        break;
      // 其他动画类型...
    }
  }
}, true);

高级应用场景

动画序列控制

利用事件监听实现动画串联,例如先执行折叠动画再显示菜单:

function toggleMenu() {
  const hamburger = document.querySelector('.hamburger--3dx');
  const menu = document.getElementById('navigation');
  
  // 添加活动类触发动画
  hamburger.classList.toggle('is-active');
  
  // 监听动画结束
  hamburger.addEventListener('transitionend', function onTransitionEnd() {
    // 移除事件监听避免重复触发
    hamburger.removeEventListener('transitionend', onTransitionEnd);
    // 执行后续操作
    menu.classList.toggle('is-visible');
  }, { once: true }); // 使用once选项自动移除监听
}

动画时长动态获取

从CSS中读取实际过渡时长,用于精确控制定时器:

function getTransitionDuration(element) {
  const style = window.getComputedStyle(element);
  // 解析duration值(可能包含ms或s单位)
  const duration = parseFloat(style.transitionDuration);
  const delay = parseFloat(style.transitionDelay);
  // 返回总时长(毫秒)
  return (duration + delay) * 1000;
}

// 使用示例
const hamburgerInner = document.querySelector('.hamburger-inner');
const duration = getTransitionDuration(hamburgerInner);
console.log(`动画总时长: ${duration}ms`);

项目文件与资源

动画类型定义

Hamburgers提供30多种动画类型,定义在_sass/hamburgers/types/目录下,主要包括:

每种类型通过修改transition属性实现独特动画效果,如漩涡动画_vortex.scss设置了特殊的时序函数:

transition-timing-function: cubic-bezier(0.19, 1, 0.22, 1);

核心样式文件

常见问题与解决方案

多重触发问题

当元素有多个过渡属性时,transitionend会触发多次。解决方案:

function handleSingleTransition(element, property, callback) {
  const handler = function(e) {
    if (e.propertyName === property) {
      callback();
      element.removeEventListener('transitionend', handler);
    }
  };
  element.addEventListener('transitionend', handler);
}

// 使用:只监听transform属性的过渡结束
handleSingleTransition(hamburger, 'transform', () => {
  console.log('transform动画完成');
});

浏览器兼容性处理

添加浏览器前缀支持和事件监听备选方案:

// 事件名称前缀处理
const transitionendEvent = (() => {
  const el = document.createElement('div');
  if ('transition' in el.style) return 'transitionend';
  if ('WebkitTransition' in el.style) return 'webkitTransitionEnd';
  if ('MozTransition' in el.style) return 'mozTransitionEnd';
  return 'transitionend';
})();

// 使用兼容事件名
hamburger.addEventListener(transitionendEvent, callback);

总结与扩展

通过transitionend事件监听,我们可以精确控制Hamburgers动画的执行流程,解决菜单交互中的时序问题。核心要点包括:

  1. 理解CSS过渡属性与事件触发机制的对应关系
  2. 正确管理事件监听的添加与移除
  3. 结合项目实际动画类型设计回调逻辑

官方文档:README.md中提供了更多关于Sass定制和安装的信息。建议进一步探索_sass/hamburgers/目录下的源码,创建自定义动画类型并实现更复杂的交互效果。

下一篇将介绍如何使用CSS变量动态修改Hamburgers动画参数,敬请关注!

【免费下载链接】hamburgers Tasty CSS-animated Hamburgers 【免费下载链接】hamburgers 项目地址: https://gitcode.com/gh_mirrors/ha/hamburgers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值