【day 09】vue的过渡与动画

Vue 的过渡与动画

基础的过渡 案例

 <!-- 第一步 包一个transition标签 -->
    <transition>
       <Song id="song" v-if="bool"></Song>
    </transition>
  
/*
希望组件节点  离开的时候  有过渡效果

离开的起点
离开的终点

*/

.v-leave{
  /* 离开的起点 */
  transform: translate(0,0);
}

/* 加上  过渡css属性 */
.v-leave-active{
  /* 触发了离开状态   一般是给transition过渡
  只要触发了leave  就会在这里  加上  transition过渡 
   leave结束了  把transition过渡移除
  
  */
  transition:transform 1s;
}

.v-leave-to{
  /* 离开的终点 */
  transform: translate(100%,0);
}


/* 进入时  添加  过渡效果 */
/* 元素将会  从右到左出现 */
.v-enter{
    /* 进入的终点 */
    transform:translate(100%,0)
}

.v-enter-active{
    transition:transform 1s;
}
.v-enter-to{
    /* 进入的终点 */
    transform:translate(0,0)
}

由于进入和离开 起点终点 是逆向的 写成多元素 选择器



/*
希望组件节点  离开的时候  有过渡效果

离开的起点
离开的终点

*/

.v-leave,.v-enter-to{
  /* 离开的起点 */
  transform: translate(0,0);
}

/* 加上  过渡css属性 */
.v-leave-active,.v-enter-active{
  /* 触发了离开状态   一般是给transition过渡
  只要触发了leave  就会在这里  加上  transition过渡 
   leave结束了  把transition过渡移除
  
  */
  transition:transform 1s;
}

.v-leave-to,.v-enter{
  /* 离开的终点 */
  transform: translate(100%,0);
}

当组件中有多个需要过渡的元素 且css不同


  <!-- 第一步 包一个transition标签 -->
    <transition>  //应用上 v-enter的样式  默认 v-
       <Song id="song" v-if="bool"></Song>
    </transition>
   <!-- singer-enter  把v替换成  name值 -->
    <transition name="singer">
       <Singer id="singer" v-if="bool"></Singer>
    </transition>
  

  <button @click="bool = !bool">切换bool值</button>
.v-leave,.v-enter-to{
  transform: translate(0,0);
}

.v-leave-active,.v-enter-active{

  transition:transform 1s;
}

.v-leave-to,.v-enter{
  transform: translate(100%,0);
}






.singer-leave,.singer-enter-to{

  transform: translate(0,0);
}

.singer-leave-active,.singer-enter-active{


  transition:transform 1s;
}

.singer-leave-to,.singer-enter{
  transform: translate(0,-400px);
}

App.vue

<template>
  <div id="app">
    <!-- 第一步 包一个transition标签 -->
    <transition>
       <Song id="song" v-if="bool"></Song>
    </transition>
  
    <transition name="singer">
       <Singer id="singer" v-if="bool"></Singer>
    </transition>
  

  <button @click="bool = !bool">切换bool值</button>
  </div>
</template>

<script>
import Song from "./components/Song";
import Singer from "./components/Singer";
export default{
  name:"App",
  components:{
    Song,
    Singer,
  },
  data(){
    return{
       bool:true
    }
 
  },
 

}

</script>

<style>
#song{
  /* float:left;  */
  width:100%;
  background-color: yellow;

}
#singer{
  float:left;
  width: 200px;
  background-color: skyblue;
}
.v-leave,.v-enter-to{
  transform: translate(0,0);
}

.v-leave-active,.v-enter-active{

  transition:transform 1s;
}
.v-leave-to,.v-enter{
  transform: translate(100%,0);
}
.singer-leave,.singer-enter-to{

  transform: translate(0,0);
}

.singer-leave-active,.singer-enter-active{


  transition:transform 1s;
}

.singer-leave-to,.singer-enter{
  transform: translate(0,-400px);
}


</style>

appear 属性

默认情况下 bool 为true时 song一刷新没有进入动画 加上appear属性即可

   
    <transition appear>
       <Song id="song" v-if="bool"></Song>
    </transition>
  
    <transition appear name="singer">
       <Singer id="singer" v-if="bool"  ></Singer>
    </transition>

dom 一刷新就会 有进入动画

transition-group

如果 多个元素需要 具有独立的过渡 切换

用上 transition-group

<ul>
        <transition-group appear>
          <li v-for="(item, index) in arr" :key="index" @click="fn(index)">
            {{ item.name }} ++++ {{ item.id }}
          </li>
        </transition-group>
      </ul>

注意事项 : 要具有 过渡效果的li 必须要具备 key值 

// 通过 操作 dom依赖的数据  实现 dom的消失  删除arr数组项 li就会触发 过渡效果
// 手动修改 display 不会触发过渡 (display none没有过渡效果) 删除节点也不会触发过渡效果 
data() {
    return {
      bool: true,
      arr: [
        { id: 1000, name: "zhuque" },
        { id: 1001, name: "zhuque" },
        { id: 1002, name: "zhuque" },
        { id: 1003, name: "zhuque" },
        { id: 1004, name: "zhuque" },
      ],
    };
  },
  methods: {
    fn(index) {
      this.arr.splice(index, 1);
    },
  }, 

App.vue

<template>
  <div id="app">
    <!-- 第一步 包一个transition标签  -->
    <!-- <transition appear>
      <Song id="song" v-if="bool"></Song>
    </transition>

    <transition name="singer" appear>
      <Singer id="singer" v-if="bool"></Singer>
    </transition> -->

    <ul>
      <transition-group appear>
        <li v-for="(item, index) in arr" :key="index" @click="fn(index)">
      id: {{ item.id }}  ---- name: {{ item.name }} 
        </li>
      </transition-group>
    </ul>

    <button @click="bool = !bool">切换bool值</button>
  </div>
</template>

<script>
import Song from "./components/Song";
import Singer from "./components/Singer";

export default {
  name: "App",
  components: {
    Song,
    Singer,
  },
  data() {
    return {
      bool: true,
      arr: [
        { id: 1000, name: "zz" },
        { id: 1001, name: "xx" },
        { id: 1002, name: "cc" },
        { id: 1003, name: "vv" },
        { id: 1004, name: "bb" },
      ],
    };
  },
  methods: {
    fn(index) {
      this.arr.splice(index, 1);
    },
  },
};
</script>
<style>
#song {
  background-color: yellow;
}
#singer {
  background-color: skyblue;
}
li {
  height: 40px;
  background-color: pink;
  border-bottom: 1px solid #000;
}
.v-leave,
.v-enter-to {
  transform: translate(0, 0);
}

.v-leave-active,
.v-enter-active {
  transition: transform, 1s;
}
.v-leave-to,
.v-enter {
  transform: translate(100%, 0);
}

.singer-leave-to,
.singer-enter {
  transform: translate(0, -325px);
}

.singer-leave,
.singer-enter-to {
  transform: translate(0, 0);
}

.singer-leave-active,
.singer-enter-active {
  transition: transform, 1s;
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值