同时为两个不同的元素淡入淡出过渡

Posted

技术标签:

【中文标题】同时为两个不同的元素淡入淡出过渡【英文标题】:fade in and fade out transition for two different elements at the same time 【发布时间】:2018-03-29 06:09:26 【问题描述】:

我是 Vue js 和转换的新手,我正在设计一个 Vue 组件,我打算在其中包装从服务器延迟加载的数据,以便在数据不可用时显示加载 gif。

它工作得很好。但是,当我添加一个简单的淡入淡出过渡以使加载 gif 淡出并在数据可用时同时淡入内容(反之亦然)时,内容和 gif 在一个出现时相互推动或向下推动消失。

这是我的Lazy.vue 组件文件:

<template>
  <div class="fixed-pos">
    <transition name="fade">
        <slot v-if="loaded"></slot>
        <div v-else>
            <img src="../assets/loading.gif"/>
        </div>
    </transition>
  </div>
</template>

<script>
export default 
  name: 'Lazy',
  props: 
    loaded: 
      type: Boolean
    
  

</script>

以及它的示例用法:

<template>
  <div>
    <button @click="loaded = !loaded">Toggle</button>
        <lazy :loaded="loaded">
            <ul v-if="rendered">
                <transition-group name="fade">
                    <li v-for="notif in notifs" v-bind:key="notif">
                        <span>notif</span>
                    </li>
                </transition-group>
            </ul>
        </lazy>
  </div>
</template>

<script>
import Lazy from './Lazy'

export default 
  name: 'HelloWorld',
  components: 
    Lazy
  ,
  data () 
    return 
      msg: 'Welcome to Your Vue.js App',
      rendered: true,
      notifs: [
        'Notif 1',
        'Notification 2 is here!',
        'Here comes another notification',
        'And another here ...'
      ],
      loaded: true
    
  

</script>

我的动画.css 文件:

.fade-enter-active, .fade-leave-active 
  transition: opacity .5s

.fade-enter, .fade-leave-to 
  opacity: 0

有没有办法使用 vue 转换或任何其他方式解决这个问题?

【问题讨论】:

【参考方案1】:

您的 gif 和内容需要 position: absolute; CSS 规则: JSFiddle example.

Doc 说:

...没有为页面布局中的元素创建空间。相反,它是相对于其最近的定位祖先(如果有的话)定位的;否则,它将相对于初始包含块放置。

您可能还需要 position: relative; 作为 gif 和内容的父元素。

【讨论】:

以上是关于同时为两个不同的元素淡入淡出过渡的主要内容,如果未能解决你的问题,请参考以下文章

CSS 过渡 - 仅在悬停时淡入淡出元素

CSS 最简洁hover事件的淡入淡出写法,且不占文档流位置!

使用 CSS 过渡的滑动 + 淡入淡出效果

angularjs链式淡入/淡出过渡

Vue CSS淡入/淡出视频过渡

淡入淡出/ css 类过渡发生乱序