javascript - 向元素添加 `transitionend` 事件监听器只会导致动画反向触发

标签 javascript css css-animations

我似乎无法让这个过渡的开始部分起作用,只有结束部分。

我之所以按照我的方式构建我的 html,是因为我需要使用 display: nonedisplay:block 来实际删除元素文档流。使用 display 来显示和隐藏元素一般来说在与动画结合时是有问题的,所以想法是让容器元素服从 display 规则,并让 child 元素动画。

查看我的代码和/或 JSBin :

<button id="gallery_menu__trigger">Click me now</button>

<div id="gallery_menu__list">
  <div id="gallery_menu__list_items" class="gallery_menu__revealable">Hello!</div>
</div>

CSS:

#gallery_menu__list {
  display:none;
}

.gallery_menu__revealable {
  transform: translatey(-20px);
  opacity: 0;
  will-change: transform, opacity;
  transition: all .3s ease;
}

.gallery_menu__revealable--visible {
  transform: translateX(0);
  opacity: 1;
}

.gallery_menu__revealable--animating {
  transition: all .3s ease;
}

和 JS:

function init () {
  var galleryMenuTrigger = document.getElementById('gallery_menu__trigger');
  var galleryMenuList = document.getElementById('gallery_menu__list');
  var galleryMenuListItems = document.getElementById('gallery_menu__list_items');

  galleryMenuTrigger.addEventListener('click', toggleGalleryMenu(galleryMenuList, galleryMenuListItems), false)
  galleryMenuListItems.addEventListener('transitionend', onTransitionEnd(galleryMenuListItems), false)
}


function toggleGalleryMenu (galleryMenuList, galleryMenuListItems) {
  return function () {
    if (galleryMenuList.style.display === 'block') {
      addAnimatingClass(galleryMenuListItems)
      closeGalleryMenuListItems(galleryMenuListItems);
      setTimeout(closeGalleryMenu(galleryMenuList), 300);
      return;
    }

    displayGalleryMenu(galleryMenuList)
    addAnimatingClass(galleryMenuListItems)
    displayGalleryMenuListItems(galleryMenuListItems);
  }
}

function addAnimatingClass (galleryMenuListItems) {
  galleryMenuListItems.classList.add('gallery_menu__revealable--animating')
}

function onTransitionEnd (galleryMenuListItems) {
  return function () {
     return galleryMenuListItems.classList.remove('gallery_menu__revealable--animating');
  }
}

function displayGalleryMenu (galleryMenuList) {
  galleryMenuList.style.display = 'block'
}

function closeGalleryMenu (galleryMenuList) {
  return function() {
    return galleryMenuList.style.display = 'none'
  }
}

function displayGalleryMenuListItems (galleryMenuListItems) {  
  return galleryMenuListItems.classList.add('gallery_menu__revealable--visible')
}

function closeGalleryMenuListItems (galleryMenuListItems) {
  return galleryMenuListItems.classList.remove('gallery_menu__revealable--visible')
}



init();

最佳答案

你接近解决方案了,我做了一些小改动,我删除了 addAnimatingClass(galleryMenuListItems) 并更改了 displayGalleryMenuListItems(galleryMenuListItems。看:

function displayGalleryMenuListItems (galleryMenuListItems) {  
  return setTimeout(function(){
   galleryMenuListItems.classList.add('gallery_menu__revealable--visible')
  },300)
}

这是一个有效的 fiddle :https://jsfiddle.net/xg5fhyst/

关于javascript - 向元素添加 `transitionend` 事件监听器只会导致动画反向触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57804052/

相关文章:

javascript - Angular 6 : error TS2339: Property 'value' does not exist on type 'HTMLElement'

javascript - 如何将 html5 视频拉伸(stretch)到宽度 :600 and height 200?

Jquery 图标没有出现在 html 中

css - 动画不适用于 Safari 和 IE 11 中的页面重定向

javascript - 在 Javascript 中连接数组

javascript - Popover 模板选项使内容消失

javascript - NodeJS 如何处理多用户环境中的原语和对象?

html - 为什么 easy-in-out 不适用于联系表格部分?

css - 我需要在 css 中有两个动画,一个在开始时,一个在悬停时,但它不起作用

html - 如何修复剪辑路径切断包裹图像的一小部分?