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>
相关推荐
敲敲了个代码6 小时前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
张雨zy7 小时前
Pinia 与 TypeScript 完美搭配:Vue 应用状态管理新选择
vue.js·ubuntu·typescript
dly_blog7 小时前
Vue 响应式陷阱与解决方案(第19节)
前端·javascript·vue.js
消失的旧时光-19438 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
console.log('npc')8 小时前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js
用户47949283569158 小时前
React Hooks 的“天条”:为啥绝对不能写在 if 语句里?
前端·react.js
我命由我123458 小时前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
用户47949283569159 小时前
给客户做私有化部署,我是如何优雅搞定 NPM 依赖管理的?
前端·后端·程序员
C_心欲无痕9 小时前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun9899 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构