CSS 使用 vanilla js 对动态添加的内容进行转换

CSS Transitions on dynamically added content using vanilla js

我正在使用路由器,特别是 Navigo

我打算淡出现有内容,然后添加淡入的新内容。

我在路由器上配置的路由上更改了 'main' div 的内容。

<div id="main">
</div>

我目前的方法是检查 div 中是否有内容,然后向其中添加一个隐藏 class 并添加一个事件侦听器,以更改内容的动画结束。不幸的是,这似乎不起作用。添加隐藏 class 后,添加的第一个 div 会保留在那里而不会被删除,很可能是因为 animationend 事件不再被触发。

编辑:我已经更新了我的方法,淡出父内容,然后在动画结束时添加内容。同样为了兼容性,我已经包含了所有转换。

这是我目前的设置,大部分都是这样

然后通过js,

const routes: {path: string, content: string}[] = [{
        path: 'about',
        content: `<div class="about-content main-content">...</div>`
    },
    ...
]

const transitionEvent = (() => {
    var el: HTMLElement = document.createElement("faux");
  
    var transitions:Record<string, string> = {
      "transition"      : "transitionend",
      "OTransition"     : "oTransitionEnd",
      "MozTransition"   : "transitionend",
      "WebkitTransition": "webkitTransitionEnd"
    }
  
    for (let t in transitions){
      if (el.style[t] !== undefined){
        return transitions[t];
      }
    }
})();

const router = new Navigo('/');

const contentDom = document.getElementById('main');

routes.forEach(route => {
    router.on(route.path, () => {
        let temp = (e: Event) => {
            console.log(e);
            contentDom.removeEventListener(transitionEvent, temp, false);
            contentDom.innerHTML = route.content;
            contentDom.className = 'transition-in';
        };
        contentDom.addEventListener(transitionEvent, temp, false);
        contentDom.className = 'transition-out';
    })
})

最后是 css,

.main-content{
    visibility: visible;
    opacity: 1
        &.transition-in {
            animation: slide-up 1s ease-in-out;
        }

        &.transition-out {       
            animation: slide-up 1s ease-in-out;
            animation-direction: reverse;
        }
}
@keyframes slide-up {
    0% {
        opacity: 0;
        transform: translateY(20px);
    }
    100% {
        opacity: 1;
        transform: translateY(0);
    }
}

我终于解决了这个问题。我的错误是我在尝试动画上的 transitionend 事件。

将我的 css 更改为

.main-content{
    visibility: visible;
    opacity: 1
    transition: opacity 1s ease-in-out;
}

然后我的 js 改为设置不透明度,

routes.forEach(route => {
    router.on(route.path, () => {
        let temp = (e: Event) => {
            console.log(e);
            contentDom.removeEventListener(transitionEvent, temp, false);
            contentDom.innerHTML = route.content;
            contentDom.style.opacity = '1';
        };
        contentDom.addEventListener(transitionEvent, temp, false);
        contentDom.style.opacity = '0';
    })
})

解决了我的问题。