javascript - 进入和离开时的 VueJS 转换

标签 javascript css vue.js vuejs2

我正在尝试学习 VueJS,但目前无法通过转换解决此问题。我有两个名为 ComponentAComponentB 的组件,如下所示:

组件A:

<template>
<div id="ComponentA">
    <h1 class="header" v-on:click="update">HEADER</h1>
    <transition
        name="custom-classes-transition"
        enter-active-class="animated fadeInDown"
        leave-active-class="animated fadeOutUp"
    ><p class="content" v-if="visible">
        Some information...
    </p></transition>
</div>
</template>

<script>
import App from "@/App";

export default {
    datas: {
        visible: false
    },
    name: "ComponentA",
    data () {
        return this.$options.datas;
    },
    methods: {
        update () {
            App.update(this.$options.name);
        }
    }
};
</script>

<style scoped>
</style>

组件B:

<template>
<div id="ComponentB">
    <h1 class="header" v-on:click="update">HEADER2</h1>
    <transition
        name="custom-classes-transition"
        enter-active-class="animated fadeInDown"
        leave-active-class="animated fadeOutUp"
    ><p class="content" v-if="visible">
        Some more information...
    </p></transition>
</div>
</template>

<script>
import App from "@/App";

export default {
    datas: {
        visible: false
    },
    name: "ComponentB",
    data () {
        return this.$options.datas;
    },
    methods: {
        update () {
            App.update(this.$options.name);
        }
    }
};
</script>

<style scoped>
</style>

这是我的 App.vue:

<template>
  <div id="app">
      <header href="https://cdn.jsdelivr.net/npm/animate.css" rel="stylesheet" type="text/css">
      <ComponentA />
      <ComponentB />
  </div>
</template>

<script>
import ComponentA from "@/components/ComponentA";
import ComponentB from "@/components/ComponentB";

export default {
    name: "App",
    components: {
        ComponentA,
        ComponentB
    },
    update (clickedComponent) {
        for (let component in this.components) {
            component = this.components[component];

            if (component.name === clickedComponent) {
                component.datas.visible = !component.datas.visible;
            } else {
                component.datas.visible = false;
            }
        }
    }
};
</script>

<style>
@import url('https://fonts.googleapis.com/css?family=Space+Mono');

:root {
    --background: #0f0f0f;
    --blueish: #546a76;
    --grayish: #7c7c7c;
    --lighterblueish: #737c81;
}

body {
    line-height: 1.7;

    background-color: var(--background);
    color: var(--grayish);

    font-family: 'Space Mono', monospace;
    font-size: 18px;
    position: relative;

    height: 100%;
    width: 60%;
    margin: auto;
    padding-top: 10vh;
}

.header {
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;

    color: var(--blueish);
    width: max-content;
    position: sticky;
    left: 100%;
}

.header span {
    background-color: var(--lighterblueish);
    color: var(--background);
}

.content {
    padding-top: 5%;
}

.content span {
    color: var(--blueish);
}
</style>

所以问题是当我单击 ComponentA 的标题时,它的“内容”以漂亮的平滑动画淡入,而 ComponentB 向下移动但没有任何过渡。我无法向 ComponentB 的运动添加过渡。它立即跳下来。我尝试添加键,过渡到 body 上的所有内容,但这些都不起作用。我需要以某种方式向 ComponentB 的移动添加过渡。

编辑:JSFiddle:https://jsfiddle.net/44ctt020/2/

最佳答案

显然你正在使用 animate.css为你的动画。如果您查看源代码,动画 fadeInDown 是由使用这些属性的关键帧定义的:

0% {
  opacity: 0;
  transform: translate3d(0,-100%,0);
}
100% {
  opacity: 1;
  transform: none;
}

translate3d 独立于页面上的保留空间移动元素的内容。您可以在此代码笔中看到:https://codepen.io/anon/pen/WMJjMO .

因此,一旦您显示组件 A,它就会占用页面上所需的空间并立即将组件 B 向下推,然后为其内容设置动画。

要实现您描述的效果,您必须为内容元素的高度设置动画。这将使其他组件相应地向上或向下移动。

我建议阅读此 Vue 指南并在 CSS 属性不透明度和高度上定义自定义过渡:https://v2.vuejs.org/v2/guide/transitions.html

关于javascript - 进入和离开时的 VueJS 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48898242/

相关文章:

javascript - 如何测试一个字符串是否是有效的UTF16字符串?

javascript - 关于Web应用程序如何工作以及服务器客户端如何实现的问题

javascript - 使用 jquery 滑动 - 一个元素高于第二个

css - Chrome devtools 在同一行报告相同的 CSS 两次

javascript - 导入脚本顺序错误,函数未定义

javascript - AngularJS Ionicframework无限滚动GET REQUEST列表一次10个

javascript - 如何在使用find jquery时计算它穿过的元素数量

javascript - 如何在编辑器中隐藏您的自定义 website.com 网站菜单

javascript - 使用 element ui vue js 固定侧组件

javascript - VueJs : use method from root element inside a component