Vue 实现的精彩动画效果

在 Vue 开发中,我们可以利用<transition>组件来打造各种令人惊艳的动画效果。下面来详细看看这些有趣的动画效果及其实现代码。

一、缩放类效果

  1. zoom-in(整体放大进入)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="zoom-in">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.zoom-in-enter-active {
  animation: zoomIn 0.5s ease;
}

@keyframes zoomIn {
  from {
    transform: scale(0);
  }

  to {
    transform: scale(1);
  }
}
</style>
  1. zoom-in-left(从左侧放大进入)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="zoom-in-left">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.zoom-in-left-enter-active {
  animation: zoomInLeft 0.5s ease;
}

@keyframes zoomInLeft {
  from {
    transform: scale(0) translateX(-100%);
  }

  to {
    transform: scale(1) translateX(0);
  }
}
</style>
  1. zoom-in-right(从右侧放大进入)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="zoom-in-right">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.zoom-in-right-enter-active {
  animation: zoomInRight 0.5s ease;
}

@keyframes zoomInRight {
  from {
    transform: scale(0) translateX(100%);
  }

  to {
    transform: scale(1) translateX(0);
  }
}
</style>
  1. zoom-in-top(从顶部放大进入)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="zoom-in-top">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.zoom-in-top-enter-active {
  animation: zoomInTop 0.5s ease;
}

@keyframes zoomInTop {
  from {
    transform: scale(0) translateY(-100%);
  }

  to {
    transform: scale(1) translateY(0);
  }
}
</style>
  1. zoom-in-bottom(从底部放大进入)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="zoom-in-bottom">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.zoom-in-bottom-enter-active {
  animation: zoomInBottom 0.5s ease;
}

@keyframes zoomInBottom {
  from {
    transform: scale(0) translateY(100%);
  }

  to {
    transform: scale(1) translateY(0);
  }
}
</style>
  1. zoom-in-center-x(沿水平中心轴放大进入)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="zoom-in-center-x">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.zoom-in-center-x-enter-active {
  animation: zoomInCenterX 0.5s ease;
}

@keyframes zoomInCenterX {
  from {
    transform: scaleX(0);
  }

  to {
    transform: scaleX(1);
  }
}
</style>
  1. zoom-in-center-y(沿垂直中心轴放大进入)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="zoom-in-center-y">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.zoom-in-center-y-enter-active {
  animation: zoomInCenterY 0.5s ease;
}

@keyframes zoomInCenterY {
  from {
    transform: scaleY(0);
  }

  to {
    transform: scaleY(1);
  }
}
</style>

二、滑动类效果

  1. slide(普通滑动)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="slide">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.slide-enter-active {
  animation: slideIn 0.5s ease;
}

@keyframes slideIn {
  from {
    transform: translateX(-100%);
  }

  to {
    transform: translateX(0);
  }
}
</style>
  1. slide-left(向左滑动)
html 复制代码
<template>
  <div>
    <button @click="isShow =! isShow">显示/隐藏</button>
    <transition name="slide-left">
      <h1 v-show="isShow">你好啊</h1>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      isShow: true,
    };
  },
};
</script>

<style scoped>
.slide-left-enter-active {
  animation: slideLeftIn 0.5s ease;
}

@keyframes slideLeftIn {
  from {
    transform: translateX(100%);
  }

  to {
    transform: translateX(0);
  }
}
</style>
  1. 向右滑动(slide-right)
html 复制代码
<template>
	 <div>
	   <button @click="isShow =! isShow">显示/隐藏</button>
	   <transition name="slide-right">
		 <h1 v-show="isShow">你好啊</h1>
	   </transition>
	 </div>
</template>

<script>
export default {
  data() {
    return {
      isShow: false
    };
  }
};
</script>

<style scoped>
.slide-right-enter-active,
.slide-right-leave-active {
  transition: all 0.5s ease;
}

.slide-right-enter,
.slide-right-leave-to {
  transform: translateX(-100%);
}
</style>
  1. 向上滑动(slide-top)
html 复制代码
<template>
	<div>
	  <button @click="isShow =! isShow">显示/隐藏</button>
	  <transition name="slide-top">
			 <h1 v-show="isShow">你好啊</h1>
	  </transition>
	</div>
</template>

<script>
export default {
  data() {
    return {
      isShow: false
    };
  }
};
</script>

<style scoped>
		.slide-top-enter-active,
		.slide-top-leave-active {
		  transition: all 0.5s ease;
		}

		.slide-top-enter,
		.slide-top-leave-to {
		  transform: translateY(-100%);
		}
</style>
  1. 向下滑动(slide-bottom)
html 复制代码
<template>
  <div class="slide-bottom-animation" v-if="showBottom">向下滑动示例</div>
</template>

<script>
export default {
  data() {
    return {
      showBottom: false
    };
  }
};
</script>

<style scoped>
  		.slide-bottom-enter-active,
	  .slide-bottom-leave-active {
	    transition: all 0.5s ease;
	  }
	  
	  .slide-bottom-enter,
	  .slide-bottom-leave-to {
	    transform: translateY(100%);
	  }
	  
</style>

三、淡入淡出效果

html 复制代码
<template>
		 <div>
		   <button @click="isShow =! isShow">显示/隐藏</button>
		   <transition name="fade-animation">
		 		 <h1 v-show="isShow">你好啊</h1>
		   </transition>
		 </div> 
</template>

<script>
export default {
  data() {
    return {
      isShow: true
    };
  }
};
</script>

<style scoped>
.fade-animation-enter-active,
.fade-animation-leave-active {
  transition: opacity 0.5s ease;
}

.fade-animation-enter,
.fade-animation-leave-to {
  opacity: 0;
}
</style>
相关推荐
东坡肘子16 分钟前
不是模型变慢了,是任务变大了 -- 肘子的 Swift 周报 #146
人工智能·swiftui·swift
yuhaiqiang26 分钟前
上线一个人静态网站需要多少钱,难不难?
前端·后端·程序员
宸津-代码粉碎机30 分钟前
Jar热部署进阶实战|修复原生方案OOM与类冲突问题,生产级无BUG优化方案
java·大数据·服务器·开发语言·前端·人工智能·python
To_OC9 小时前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
勇往直前plus9 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
咩咩啃树皮9 小时前
第43篇:Vue3计算属性(computed)完全精讲——缓存机制、依赖计算、业务最优解
前端·vue.js·缓存
徐小夕11 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
kyriewen13 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz13 小时前
Rust &‘static str浅析
java·前端·javascript·rust
IT_陈寒13 小时前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端