all
:所有属性都表现出过渡动画(默认)none
:没有过渡动画0s
,表示不出现过渡动画transition-property
指定的属性上linear
匀速ease
慢 -> 较快 -> 慢 (默认)ease-in
慢入快出ease-out
快入慢出ease-in-out
慢入慢出cubic-bezier(n, n, n, n)
0s
transition: transition-property transition-duration transition-timing-function transition-delay;
transition: margin-right 2s, color 1s;
transition
,注意 transition-duration
必须设置transition-duration
为 0
hover
选择器设置 transition-duration
为需要的时间transition-duration
为所需的时间hover
选择器设置 transition-duration
为 0
其实就是 CSS 样式的覆盖问题,hover
写在后面,后面的样式会覆盖前面的样式
none
:特殊关键字,表示无关键帧0s
,表示无动画transition-timing-function
steps(int[, start|end])
:指定了时间函数中的间隔数量(步长)int
指定函数的间隔数,该参数是一个正整数start|end
是可选的,表示动画是从时间段的开头连续还是末尾连续start
:表示直接开始;end
:表示戛然而止,默认值)0
,代表动画在应用到元素上后立即开始执行1.5
) ,默认为 1
infinite
,表示无限循环播放动画normal
正向播放 (默认)reverse
反向播放alternate
奇数次正向播放,偶数次反向播放alternate-reverse
偶数次正向播放,奇数次反向播放forwards
停在终点位置backwards
返回初始位置 (默认)running
播放动画 (默认)paused
停止动画animation: name duration timing-function delay iteration-count direction fill-mode play-state;
@keyframes
from
- to
分别设置动画的第一帧、最后一帧的状态;与 steps(n)
搭配使用@keyframes 动画的名称 {
from {
起始状态
}
to {
终点状态
}
}
%
设置关键帧,关键帧按时间划分;0~100 之间可按需插入任意帧@keyframes 动画的名称 {
0% {
起始状态
}
50% {
中间的某个状态
}
100% {
终点状态
}
}
animation
<template>
<button onclick="console.log('节流')">节流button>
template>
<style lang="scss" scoped>
button {
animation: throttle 2s step-end forwards;
}
button:active {
animation: none;
}
@keyframes throttle {
from {
pointer-events: none; // 元素永远不会成为鼠标事件的 target
// 但是, 当其后代元素的 pointer-events 属性指定其他值时, 鼠标事件可以指向后代元素;
// 在这种情况下, 鼠标事件将在捕获或冒泡阶段触发父元素的事件侦听器
}
to {
pointer-events: all; // 只有鼠标指针在元素内部或边界时, 元素才会成为鼠标事件的目标
// SVG 中 fill, stroke 和 visibility 属性的值不影响事件处理
}
}
style>
transition
<template>
<button onclick="console.log('节流')">节流button>
template>
<script setup lang="ts">
// 通过 transitionstart 监听 transition 动画开始事件
document.addEventListener("transitionstart", (ev: any) => {
ev.target.disabled = true;
});
// 通过 transitionend 监听 transition 动画结束事件
document.addEventListener("transitionend", (ev: any) => {
ev.target.disabled = false;
});
script>
<style lang="scss" scoped>
button {
opacity: 0.99;
transition: opacity 2s;
}
button:not(:disabled):active {
opacity: 1;
transition: 0s;
}
style>
通过 transition 实现较简单动画
<template>
<button class="button">Defaultbutton>
template>
<style lang="scss" scoped>
$primary-color: royalblue;
.button {
padding: 8px 16px;
border: 1px solid #d9d9d9;
background-color: transparent;
border-radius: 2px;
cursor: pointer;
transition: .3s;
position: relative;
&:hover {
color: $primary-color;
border-color: currentColor; // currentColor 表示当前元素被应用的 color 颜色值
}
}
/* 通过 after 伪元素实现水波效果 */
.button::after {
content: '';
position: absolute;
inset: 0; // inset 是 top, right, bottom, left 属性的简写; 它具有与边距简写相同的多值语法
opacity: 0;
box-shadow: 0 0 0 6px $primary-color;
transition: .3s;
}
.button:active::after {
box-shadow: none;
opacity: 0.4;
transition: 0s;
}
style>
通过 animition 实现较复杂动画
<template>
<button class="button">Defaultbutton>
template>
<style lang="scss" scoped>
.button {
animation: joggle 0s; // 将时间设置为 0, 防止进入页面时动画先触发一次
}
.button:hover {
animation-duration: 1s;
}
.button:active {
animation: none;
}
@keyframes joggle {
from {
transform: scale3d(1, 1, 1)
}
10%,
20% {
transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)
}
30%,
50%,
70%,
90% {
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)
}
40%,
60%,
80% {
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)
}
to {
transform: scale3d(1, 1, 1)
}
}
style>