不加过渡动画,变化不太流畅
MDN css transitions
w3school transform
w3school animation
animation: [ * animation-name] [ * animation-duration] [animation-timing-function] [animation-delay] [animation-iteration-count] [animation-direction] [animation-fill-mode] [animation-play-state];
MDN keyframes
@keyframes myname { 0% { top: 0px; } 25% { top: 200px; } 50% { top: 100px; } 75% { top: 200px; } 100% { top: 0px; } }
keyframes rotation { from { transform: rotate(90deg); } to { transform: rotate(450deg); } }
transition: [ * transition-property] [ * transition-duration] [transition-timing-function] [transition-delay];
animation 强调流程与控制,对元素的一个或多个属性的变化进行控制,可以有多个关键帧(animation 和 @keyframes结合使用)
transition 强调过渡,是元素的一个或多个属性发生变化时产生的过渡效果,同一个元素通过两个不同的途径获取样式,
状态 a -> b:
状态 b -> a:
a { width: 100px; transition: width 2s; } b { width: 300px; transition: width 6s; }
w3school css 过渡
常需要应用过渡动画的伪类选择器
原选择器:过渡前的状态、过渡的过程(该状态变至其他状态的过渡过程)
伪类选择器:过渡后的状态(可以只写有变更的样式)
/* 把鼠标悬停在 div 元素上,宽度变宽的过渡效果 */ div { width: 100px; height: 100px; background: red; transition: width 2s; } div:hover { width: 300px; }
vue Transition
hello
.v-enter-active, .v-leave-active { transition: opacity 0.5s ease; } .v-enter-from, .v-leave-to { opacity: 0; }
...
.fade-enter-active, .fade-leave-active { transition: opacity 0.5s ease; } .fade-enter-from, .fade-leave-to { opacity: 0; }
hello
Hello here is some bouncy text!
@keyframes bounce-in { 0% { transform: scale(0); } 50% { transform: scale(1.25); } 100% { transform: scale(1); } } .bounce-enter-active { animation: bounce-in 0.5s; } .bounce-leave-active { animation: bounce-in 0.5s reverse; }
尽管过渡 class 仅能应用在 的直接子元素上,我们还是可以使用深层级的 CSS 选择器,在深层级的元素上触发过渡效果
在这种情况下,你可以通过向 组件传入 duration prop 来显式指定过渡的持续时间 (以毫秒为单位)。总持续时间应该匹配延迟加上内部元素的过渡持续时间
是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。
- {{ item }}
.list-move, /* 对移动中的元素应用的过渡 */ .list-enter-active, .list-leave-active { transition: all 0.5s ease; } .list-enter-from, .list-leave-to { opacity: 0; transform: translateX(30px); } /* 确保将离开的元素从布局流中删除 以便能够正确地计算移动的动画。 */ .list-leave-active { position: absolute; }
过渡动画的 css 可以另起一个 css 文件书写
vue 点击图标旋转
//class随state的true或者false改变
// 持续旋转 .rotation { animation: rotation 2s infinite linear; } @keyframes rotation { from { transform: rotate(0deg); } to { transform: rotate(359deg); } }
把 v-if 改为两种 class 的转变,再加上过渡
.scroll { box-sizing: border-box; width: 440rpx; font-weight: 300; background: #ffffff; border-radius: 5px; border: 1rpx solid; transition-property: all; transition-duration: 0.1s; } .scroll--full { border-color: #999999; max-height: 155rpx; } .scroll--null { border-color: #ffffff; max-height: 0rpx; }
@keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } .fade-in { animation: fade-in 1s forwards linear; }
/* 淡入淡出 */ .v-enter-active, .v-leave-active { transition: opacity 0.5s ease; } .v-enter-from, .v-leave-to { opacity: 0; }
@keyframes fade-up { 0% { opacity: 0; transform: translateY(3em); } 100% { opacity: 1; transform: translateY(none); } } .fade-up { animation: fade-up 3s cubic-bezier(0.05, 0.98, 0.17, 0.97) forwards; }
@keyframes wiggle { 0%, 7% { transform: rotateZ(0); opacity: 0; } 15% { transform: rotateZ(-15deg); opacity: 1; } 20% { transform: rotateZ(10deg); } 25% { transform: rotateZ(-10deg); } 30% { transform: rotateZ(6deg); } 35% { transform: rotateZ(-4deg); } 40%, 100% { transform: rotateZ(0); } }
.animation { … animation: bounceAround 1.1s ease-in-out infinite; } @keyframes bounceAround { 0% {transform:translateY(0);} 20% {transform:translateY(-60px) rotate(0deg);} 25%{transform:translateY(20px) rotate(0deg);} 35%, 55%{transform:translateY(0px) rotate(0deg);} 60% {transform: translateY(-20px) rotate(0deg);} 100%{transform: translateY(-20px) rotate(360deg);} }
CSS 制作动画属性大多是 transform 和 opacity 之类的。用这些属性制作动画非常高效,因为:
他们在动画过程中不会影响到 DOM 结构,因此不会每一帧都触发昂贵的 CSS 布局重新计算。
大多数的现代浏览器都可以在执行 transform 动画时利用 GPU 进行硬件加速。
相比之下,像 height 或者 margin 这样的属性会触发 CSS 布局变动,因此执行它们的动画效果更昂贵,需要谨慎使用。我们可以在 CSS-Triggers 这类的网站查询哪些属性会在执行动画时触发 CSS 布局变动。