css动画
2022-10-11 本文已影响0人
小猪x
参考:CSS3属性详解:动画详解
动画大全:CSS3动画代码大集合
小程序动画合集:10种小程序动画效果实现方法
一、过渡:transition
-
transition-property: all;
所有属性都发生过渡:all。 指定属性用逗号
分割width,height; -
transition-duration: 1s;
过渡的持续时间。 -
transition-timing-function: linear;
运动曲线。
运动曲线工具:https://cubic-bezier.com/#0,0,1,1-
linear
线性匀速 -
ease
减速 -
ease-in
加速 -
ease-out
减速 -
ease-in-out
先加速后减速 -
cubic-bezier(number, number, number, number)
贝塞尔曲线
-
-
transition-delay: 1s;
过渡延迟。多长时间后再执行这个过渡动画。
四个属性可以综合成
transition
: 过度属性 动画时间 运动曲线 延迟时间;
例如
transition: all 3s linear 0s;
transition: width .3s;
transition: background-color .3s;
clickTest() {
this.setData({
isClick: !this.data.isClick
});
}
<button class="btn_nor {{isClick ? 'btn_select' : ''}}" bindtap="clickTest">
点击动画
</button>
.btn_nor {
display: flex;
justify-content: center;
align-items: center;
width: 300rpx;
height: 80rpx;
background-color: #0D91EC;
color: white;
font-size: 30rpx;
opacity: 0.5;
transition: all 0.5s ease-in;
}
.btn_select {
height: 160rpx;
width: 500rpx;
opacity: 1; /*透明度渐变*/
background-color: #00ec65;
box-shadow: 0 0 15px #ec0015;
}
二、2D、3D - transform
(1) 2D转换
1、缩放 transform: scale(x, y);
- x:水平方向缩放倍数。
- y:垂直方向缩放倍数。
- 只写一个值就是等比例缩放。
transform: scale(2)
;
2、位移 transform: translate(水平位移, 垂直位移);
- 参数为百分比,相对于自身移动。
transform: translate(-50%, -50%);
- 正值:向右和向下。 负值:向左和向上。
transform: translate(50px, -50px);
- 只写一个值,则表示水平移动
transform: translate(50px);
3、旋转 transform: rotate(角度);
-
正值:顺时针
transform: rotate(45deg);
-
负值:逆时针
transform: rotate(-45deg);
-
turn:
1turn
=360deg
-
rotate 旋转时,默认是以盒子的正中心为坐标原点的。,可以用
transform-origin
改变旋转的坐标原点transform-origin: 水平坐标 垂直坐标;
- 属性值可以是百分比
%、em、px
等具体的值,也可以是top、right、bottom、left、center
关键词。 -
transform-origin: 50px 50px;
指定xy坐标旋转 -
transform-origin: center top;
顶部中心为坐标原点等价50% 0
-
transform-origin: 50% 0;
顶部中心为坐标原点等价center top
-
transform-origin:0 0;
左上角 - 参考CSS3之transform-origin详解
- 属性值可以是百分比
.btn_nor {
transition: all 0.5s ease-in; /**需要加上transition设置过渡时间**/
}
.btn_select {
transform: scale(1.5, 1.5) translate(50px, 50px) rotate(360deg) ; /**缩放、位移、旋转**/
}
(2) 3D 转换
3D坐标系:(左手坐标系)
c55bdeeed7291661d51aaf5e7a06c492.png伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方。拇指、食指和中指分别代表X、Y、Z轴的正方向,就建立了一个左手坐标系。
浏览器的这个平面,是X轴、Y轴;垂直于浏览器的平面,是Z轴。
旋转的方向:(左手法则)
左手握住旋转轴
,竖起拇指
指向旋转轴的正方向
,正向
就是其余手指卷曲
的方向。
所有的3d旋转,对着
正方向
去看,都是顺时针
旋转。
1、缩放:scaleX、scaleY、scaleZ 、scale3d
-
transform: scaleX(1.2);
//X放大1.2倍 -
transform: scaleY(1.5);
//Y放大1.2倍 -
transform: scaleZ(2);
//Z放大1.2倍 -
transform: scale3d(1.2, 1.5, 2);
// X、Y、Y等价上面
注意translateZ
增加透视效果perspective
才能看到
body {
/* 给box的父元素加透视效果*/
perspective: 1000px;
}
2、位移:translateX、translateY、translateZ 、translate3d
-
transform: translateX(100px);
//沿着 X 轴移动 -
transform: translateY(200px);
//沿着 Y 轴移动 -
transform: translateZ(300px);
//沿着 Z 轴移动 -
transform: translate3d(100px, 200px, 300px);
// X、Y、Z都移动
3、旋转:rotateX、rotateY、rotateZ、rotate3d
-
transform: rotateX(360deg);
//绕 X 轴旋转360度 -
transform: rotateY(360deg);
//绕 Y 轴旋转360度 -
transform: rotateZ(360deg);
//绕 Z 轴旋转360度 -
transform: rotate3d(1, 1, 0, 60deg);
//绕 XY 轴旋转60度
四、动画animation
步骤
- 通过
@keyframes
定义动画 - 将动画通过
百分比
,分割成多个节点;各节点分别定义各属性 - 在指定元素里,通过
animation
属性调用动画
定义动画:
@keyframes 动画名{
from{ 初始状态 }
to{ 结束状态 }
}
调用:
animation: 动画名称 持续时间;
-
animation: 动画名称 持续时间 运动曲线 何时开始 播放次数 是否反方向 动画起始或者结束的状态
。 animation: name 1s alternate linear 3 forwards;
animation: name 4s;
.box {
width: 100px;
height: 100px;
margin: 100px;
background-color: red;
/* 调用动画 具体参数参考下面*/
/*animation: move 1s alternate linear 3;*/
animation: move2 3s linear forwards ;
}
/* 方式一:定义一组动画*/
@keyframes move1 {
from {
transform: translateY(0px) rotate(0deg);
opacity: 1;
}
to {
transform: translateY(100px) rotate(555deg);
opacity: 0;
}
}
/* 方式二:定义多组动画*/
@keyframes move2 {
0% {
transform: translateX(0px) translateY(0px);
background-color: red;
border-radius: 0;
}
25% {
transform: translateX(100px) translateY(0px);
}
/*动画执行到 50% 的时候,背景色变成绿色,形状变成圆形*/
50% {
/* 虽然两个方向都有translate,但其实只是Y轴上移动了200px。
因为X轴的500px是相对最开始的原点来说的。可以理解成此时的 translateX 是保存了之前的位移 */
transform: translateX(100px) translateY(100px);
background-color: green;
border-radius: 50%;
}
75% {
transform: translateX(0px) translateY(200px);
}
/*动画执行到 100% 的时候,背景色还原为红色,形状还原为正方形*/
100% {
/*坐标归零,表示回到原点。*/
transform: translateX(0px) translateY(0px);
background-color: red;
border-radius: 0;
}
}
- 动画名称:
animation-name: @keyframes 动画名称;
- 持续时间:
animation-duration: 4s;
- 执行次数:
animation-iteration-count: infinite;
// infinite:无限次 n:指定次数 - 是否应该轮流反向播放动画:
animation-direction: alternate;
// normal: 正常 alternate: 反向 - 延迟执行:
animation-delay: 1s;
- 结束时盒子的状态:
animation-fill-mode: forwards;
// forwards:保持结束状态, backwards:结束回到最初状态 - 运动曲线:默认是“ease”
animation-timing-function: ease;
//inear、 ease-in-out、 cubic-bezier(n,n,n,n)、 steps()等,默认"ease"
五、steps()的效果
1、时钟转动
66d6ef0df6b11d529b92538543d42348.gifdiv {
width: 3px;
height: 200px;
background-color: #000;
margin: 100px auto;
transform-origin: center bottom; /* 旋转的中心点是底部 */
animation: myClock 60s steps(60) infinite;
}
@keyframes myClock {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
2、摆动的鱼
20180209_1245.gif<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
/*鱼摆动*/
.shark {
width: 509px;
height: 270px; /* 盒子的宽高是一帧的宽高 */
border: 1px solid #000;
margin: 100px auto;
background: url(images/shark.png) left top; /* 让图片一开始位于 0 px的位置 */
animation: sharkRun 1s steps(8) infinite; /* 一秒之内,从顶部移动到底部,分八帧 */
}
/* 鱼所在的父盒子 */
.sharkBox {
width: 509px;
height: 270px;
animation: sharkBoxRun 20s linear infinite;
}
@keyframes sharkRun {
0% {
}
/* 一张图片270宽度 8张 - 270 * 8 = 2160 */
100% {
background-position: left -2160px; /* 动画结束时,让图片位于最底部 */
}
}
/* 鱼所在的父盒子 从左->右移动 */
@keyframes sharkBoxRun {
0% {
transform: translateX(-600px);
}
100% {
transform: translateX(3000px);
}
}
</style>
</head>
<body>
<div class="sharkBox">
<div class="shark"></div>
</div>
</div>
</body>
</html>
六、其他DEMO
1、闪动按钮
提醒按钮.gif
<view class="btn_fav_remind">
<view class="remind_btn_flash"/>
<view class="remind_tv">提醒我</view>
</view>
.btn_fav_remind {
height: 42rpx;
width: 128rpx;
line-height: 42rpx;
text-align: center;
font-size: 24rpx;
color: black;
background-color: #FCD953;
border-radius: 48rpx;
overflow: hidden;
animation: scaleBtn 1s ease-in-out infinite;
}
.remind_tv {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.remind_btn_flash {
position: absolute;
top: 0;
left: 0;
width: 50%;
height: 100%;
background: linear-gradient(to right, transparent, rgba(255,255,255,0.8));
animation: scaleBtnFlash 1s ease-in-out infinite;
}
@keyframes scaleBtn {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
@keyframes scaleBtnFlash {
0% {
transform: skewX(-30deg) translateX(-120%);
}
50% {
transform: skewX(-30deg) translateX(-120%);
}
100% {
transform: skewX(-30deg) translateX(250%);
}
}
2、环绕旋转
20190407230827814.gif
20190408224632634.gif
.outer {
/**定义子元素水平居中**/
display:flex;
justify-content:center;
width: 100px;
height: 100px;
background-color: #6a5acd8c;
position:relative;
}
/**竖向辅助线**/
.vertical-line{
position:absolute;
left:50%;
transform:translateX(-50%);
height:100%;
width:1px;
background:#000;
}
/**横向辅助线**/
.horizontal-line{
position:absolute;
top:50%;
transform:translateY(-50%);
width:100%;
height:1px;
background:#000;
}
.inner {
position: absolute;
width:20px;
height:20px;
border-radius:50%;
background-color: #6a5acdeb;
transform-origin:50% 50px;/**50px为环绕半径*/
animation:an-circle 3s ease-in-out infinite;
}
.inner:nth-child(2){
height:18px;
width:18px;
background-color: rgba(205, 53, 12, 0.92);
animation-delay:.2s;
}
.inner:nth-child(3){
height:16px;
width:16px;
background-color: rgba(32, 205, 37, 0.92);
animation-delay:.4s;
}
.inner:nth-child(4){
height:14px;
width:14px;
background-color: rgba(205, 190, 11, 0.92);
animation-delay:.6s;
}
@keyframes an-circle {
to {
transform: rotate(1turn);
}
}
单个旋转
<view class="outer">
<view class="inner"/>
<view class="horizontal-line"/>
<view class="vertical-line"/>
</view>
多个旋转
<view class="outer">
<view class="inner"/>
<view class="inner"/>
<view class="inner"/>
<view class="inner"/>
<view class="horizontal-line"/>
<view class="vertical-line"/>
</view>