1. 动画1
< ! DOCTYPE html>
< html lang= "en" >
< head>
< meta charset= "UTF-8" / >
< title> Order< / title>
< ! -- < link rel= "stylesheet" href= "https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css" / >
< link rel= "stylesheet" href= "https://fonts.googleapis.com/css?family=Roboto:400,500,700&display=swap" / > -- >
< style>
: root {
-- primary: #275EFE;
-- primary- light: #7699FF;
-- dark: #1C212E;
-- grey- dark: #3F4656;
-- grey: #6C7486;
-- grey- light: #CDD9ED ;
-- white: #FFF ;
-- green: #16BF78;
-- sand: #DCB773 ;
-- sand- light: #EDD9A9 ;
}
. order {
- webkit- appearance: none;
- moz- appearance: none;
appearance : none;
border : 0 ;
background : var ( -- dark) ;
position : relative;
height : 63px;
width : 240px;
padding : 0 ;
outline : none;
cursor : pointer;
border- radius: 32px;
- webkit- mask- image: - webkit- radial- gradient ( white, black) ;
- webkit- tap- highlight- color: transparent;
overflow : hidden;
transition : transform 0 . 3s ease;
}
. order span {
-- o: 1 ;
position : absolute;
left : 0 ;
right : 0 ;
text- align: center;
top : 19px;
line- height: 24px;
color : var ( -- white) ;
font- size: 16px;
font- weight: 500 ;
opacity : var ( -- o) ;
transition : opacity 0 . 3s ease;
}
. order span. default {
transition- delay: 0 . 3s;
}
. order span. success {
-- offset: 16px;
-- o: 0 ;
}
. order span. success svg {
width : 12px;
height : 10px;
display : inline- block;
vertical- align: top;
fill : none;
margin : 7px 0 0 4px;
stroke : var ( -- green) ;
stroke- width: 2 ;
stroke- linecap: round;
stroke- linejoin: round;
stroke- dasharray: 16px;
stroke- dashoffset: var ( -- offset) ;
transition : stroke- dashoffset 0 . 3s ease;
}
. order: active {
transform : scale ( 0.96 ) ;
}
. order . lines {
opacity : 0 ;
position : absolute;
height : 3px;
background : var ( -- white) ;
border- radius: 2px;
width : 6px;
top : 30px;
left : 100 % ;
box- shadow: 15px 0 0 var ( -- white) , 30px 0 0 var ( -- white) , 45px 0 0 var ( -- white) , 60px 0 0 var ( -- white) , 75px 0 0 var ( -- white) , 90px 0 0 var ( -- white) , 105px 0 0 var ( -- white) , 120px 0 0 var ( -- white) , 135px 0 0 var ( -- white) , 150px 0 0 var ( -- white) , 165px 0 0 var ( -- white) , 180px 0 0 var ( -- white) , 195px 0 0 var ( -- white) , 210px 0 0 var ( -- white) , 225px 0 0 var ( -- white) , 240px 0 0 var ( -- white) , 255px 0 0 var ( -- white) , 270px 0 0 var ( -- white) , 285px 0 0 var ( -- white) , 300px 0 0 var ( -- white) , 315px 0 0 var ( -- white) , 330px 0 0 var ( -- white) ;
}
. order . back,
. order . box {
-- start: var ( -- white) ;
-- stop: var ( -- grey- light) ;
border- radius: 2px;
background : linear- gradient ( var ( -- start) , var ( -- stop) ) ;
position : absolute;
}
. order . truck {
width : 60px;
height : 41px;
left : 100 % ;
z- index: 1 ;
top : 11px;
position : absolute;
transform : translateX ( 24px) ;
}
. order . truck: before,
. order . truck: after {
-- r: - 90deg;
content : "" ;
height : 2px;
width : 20px;
right : 58px;
position : absolute;
display : block;
background : var ( -- white) ;
border- radius: 1px;
transform- origin: 100 % 50 % ;
transform : rotate ( var ( -- r) ) ;
}
. order . truck: before {
top : 4px;
}
. order . truck: after {
-- r: 90deg;
bottom : 4px;
}
. order . truck . back {
left : 0 ;
top : 0 ;
width : 60px;
height : 41px;
z- index: 1 ;
}
. order . truck . front {
overflow : hidden;
position : absolute;
border- radius: 2px 9px 9px 2px;
width : 26px;
height : 41px;
left : 60px;
}
. order . truck . front: before,
. order . truck . front: after {
content : "" ;
position : absolute;
display : block;
}
. order . truck . front: before {
height : 13px;
width : 2px;
left : 0 ;
top : 14px;
background : linear- gradient ( var ( -- grey) , var ( -- grey- dark) ) ;
}
. order . truck . front: after {
border- radius: 2px 9px 9px 2px;
background : var ( -- primary) ;
width : 24px;
height : 41px;
right : 0 ;
}
. order . truck . front . window {
overflow : hidden;
border- radius: 2px 8px 8px 2px;
background : var ( -- primary- light) ;
transform : perspective ( 4px) rotateY ( 3deg) ;
width : 22px;
height : 41px;
position : absolute;
left : 2px;
top : 0 ;
z- index: 1 ;
transform- origin: 0 50 % ;
}
. order . truck . front . window: before,
. order . truck . front . window: after {
content : "" ;
position : absolute;
right : 0 ;
}
. order . truck . front . window: before {
top : 0 ;
bottom : 0 ;
width : 14px;
background : var ( -- dark) ;
}
. order . truck . front . window: after {
width : 14px;
top : 7px;
height : 4px;
position : absolute;
background : rgba ( 255 , 255 , 255 , 0.14 ) ;
transform : skewY ( 14deg) ;
box- shadow: 0 7px 0 rgba ( 255 , 255 , 255 , 0.14 ) ;
}
. order . truck . light {
width : 3px;
height : 8px;
left : 83px;
transform- origin: 100 % 50 % ;
position : absolute;
border- radius: 2px;
transform : scaleX ( 0.8 ) ;
background : #f0dc5f;
}
. order . truck . light: before {
content : "" ;
height : 4px;
width : 7px;
opacity : 0 ;
transform : perspective ( 2px) rotateY ( - 15deg) scaleX ( 0.94 ) ;
position : absolute;
transform- origin: 0 50 % ;
left : 3px;
top : 50 % ;
margin- top: - 2px;
background : linear- gradient ( 90deg, #f0dc5f, rgba ( 240 , 220 , 95 , 0.7 ) , rgba ( 240 , 220 , 95 , 0 ) ) ;
}
. order . truck . light. top {
top : 4px;
}
. order . truck . light. bottom {
bottom : 4px;
}
. order . box {
-- start: var ( -- sand- light) ;
-- stop: var ( -- sand) ;
width : 21px;
height : 21px;
right : 100 % ;
top : 21px;
}
. order . box: before,
. order . box: after {
content : "" ;
top : 10px;
position : absolute;
left : 0 ;
right : 0 ;
}
. order . box: before {
height : 3px;
margin- top: - 1px;
background : rgba ( 0 , 0 , 0 , 0.1 ) ;
}
. order . box: after {
height : 1px;
background : rgba ( 0 , 0 , 0 , 0.15 ) ;
}
. order. animate . default {
-- o: 0 ;
transition- delay: 0s;
}
. order. animate . success {
-- offset: 0 ;
-- o: 1 ;
transition- delay: 7s;
}
. order. animate . success svg {
transition- delay: 7 . 3s;
}
. order. animate . truck {
- webkit- animation: truck 10s ease forwards;
animation : truck 10s ease forwards;
}
. order. animate . truck: before {
- webkit- animation: door1 2 . 4s ease forwards 0 . 3s;
animation : door1 2 . 4s ease forwards 0 . 3s;
}
. order. animate . truck: after {
- webkit- animation: door2 2 . 4s ease forwards 0 . 6s;
animation : door2 2 . 4s ease forwards 0 . 6s;
}
. order. animate . truck . light: before,
. order. animate . truck . light: after {
- webkit- animation: light 10s ease forwards;
animation : light 10s ease forwards;
}
. order. animate . box {
- webkit- animation: box 10s ease forwards;
animation : box 10s ease forwards;
}
. order. animate . lines {
- webkit- animation: lines 10s ease forwards;
animation : lines 10s ease forwards;
}
@- webkit- keyframes truck {
10 % ,
30 % {
transform : translateX ( - 164px) ;
}
40 % {
transform : translateX ( - 104px) ;
}
60 % {
transform : translateX ( - 224px) ;
}
75 % ,
100 % {
transform : translateX ( 24px) ;
}
}
@keyframes truck {
10 % ,
30 % {
transform : translateX ( - 164px) ;
}
40 % {
transform : translateX ( - 104px) ;
}
60 % {
transform : translateX ( - 224px) ;
}
75 % ,
100 % {
transform : translateX ( 24px) ;
}
}
@- webkit- keyframes lines {
0 % ,
30 % {
opacity : 0 ;
transform : scaleY ( 0.7 ) translateX ( 0 ) ;
}
35 % ,
65 % {
opacity : 1 ;
}
70 % {
opacity : 0 ;
}
100 % {
transform : scaleY ( 0.7 ) translateX ( - 400px) ;
}
}
@keyframes lines {
0 % ,
30 % {
opacity : 0 ;
transform : scaleY ( 0.7 ) translateX ( 0 ) ;
}
35 % ,
65 % {
opacity : 1 ;
}
70 % {
opacity : 0 ;
}
100 % {
transform : scaleY ( 0.7 ) translateX ( - 400px) ;
}
}
@- webkit- keyframes light {
0 % ,
30 % {
opacity : 0 ;
transform : perspective ( 2px) rotateY ( - 15deg) scaleX ( 0.88 ) ;
}
40 % ,
100 % {
opacity : 1 ;
transform : perspective ( 2px) rotateY ( - 15deg) scaleX ( 0.94 ) ;
}
}
@keyframes light {
0 % ,
30 % {
opacity : 0 ;
transform : perspective ( 2px) rotateY ( - 15deg) scaleX ( 0.88 ) ;
}
40 % ,
100 % {
opacity : 1 ;
transform : perspective ( 2px) rotateY ( - 15deg) scaleX ( 0.94 ) ;
}
}
@- webkit- keyframes door1 {
30 % ,
50 % {
transform : rotate ( 32deg) ;
}
}
@keyframes door1 {
30 % ,
50 % {
transform : rotate ( 32deg) ;
}
}
@- webkit- keyframes door2 {
30 % ,
50 % {
transform : rotate ( - 32deg) ;
}
}
@keyframes door2 {
30 % ,
50 % {
transform : rotate ( - 32deg) ;
}
}
@- webkit- keyframes box {
8 % ,
10 % {
transform : translateX ( 40px) ;
opacity : 1 ;
}
25 % {
transform : translateX ( 112px) ;
opacity : 1 ;
}
26 % {
transform : translateX ( 112px) ;
opacity : 0 ;
}
27 % ,
100 % {
transform : translateX ( 0px) ;
opacity : 0 ;
}
}
@keyframes box {
8 % ,
10 % {
transform : translateX ( 40px) ;
opacity : 1 ;
}
25 % {
transform : translateX ( 112px) ;
opacity : 1 ;
}
26 % {
transform : translateX ( 112px) ;
opacity : 0 ;
}
27 % ,
100 % {
transform : translateX ( 0px) ;
opacity : 0 ;
}
}
html {
box- sizing: border- box;
- webkit- font- smoothing: antialiased;
}
* {
box- sizing: inherit;
}
* : before,
* : after {
box- sizing: inherit;
}
body {
min- height: 100vh;
font- family: Roboto, Arial;
display : flex;
justify- content: center;
align- items: center;
background : #E4ECFA ;
}
body . dribbble {
position : fixed;
display : block;
right : 20px;
bottom : 20px;
}
body . dribbble img {
display : block;
height : 28px;
}
< / style>
< / head>
< body>
< ! -- partial: index. partial. html -- >
< button class = "order" >
< span class = "default" > 确认订单< / span> < span class = "success" > 订单已发送
< svg viewbox= "0 0 12 10" >
< polyline points= "1.5 6 4.5 9 10.5 1" > < / polyline>
< / svg> < / span>
< div class = "box" > < / div>
< div class = "truck" >
< div class = "back" > < / div>
< div class = "front" >
< div class = "window" > < / div>
< / div>
< div class = "light top" > < / div>
< div class = "light bottom" > < / div>
< / div>
< div class = "lines" > < / div>
< / button>
< script src= "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" > < / script>
< script>
$ ( '.order' ) . click ( function ( e ) {
let button = $ ( this ) ;
if ( ! button. hasClass ( 'animate' ) ) {
button. addClass ( 'animate' ) ;
setTimeout ( ( ) => {
button. removeClass ( 'animate' ) ;
} , 10000 ) ;
}
} ) ;
< / script>
< / body>
< / html>
动画2
< ! DOCTYPE html>
< html lang= "en" >
< head>
< meta charset= "UTF-8" >
< title> Document< / title>
< style>
. truck- button {
-- color: #fff;
-- background: #2B3044;
-- tick: #16BF78;
-- base: #0D0F18;
-- wheel: #2B3044;
-- wheel- inner: #646B8C;
-- wheel- dot: #fff;
-- back: #6D58FF;
-- back- inner: #362A89;
-- back- inner- shadow: #2D246B;
-- front: #A6ACCD ;
-- front- shadow: #535A79;
-- front- light: #FFF8B1 ;
-- window: #2B3044;
-- window- shadow: #404660 ;
-- street: #646B8C;
-- street- fill: #404660 ;
-- box: #DCB97A ;
-- box- shadow: #B89B66 ;
padding : 12px 0 ;
width : 172px;
cursor : pointer;
text- align: center;
position : relative;
border : none;
outline : none;
color : var ( -- color) ;
background : var ( -- background) ;
border- radius: var ( -- br, 5px) ;
- webkit- appearance: none;
- webkit- tap- highlight- color: transparent;
transform- style: preserve- 3d;
transform : rotateX ( var ( -- rx, 0deg) ) translateZ ( 0 ) ;
transition : transform 0 . 5s, border- radius 0 . 3s linear var ( -- br- d, 0s) ;
}
. truck- button: before,
. truck- button: after {
content : "" ;
position : absolute;
left : 0 ;
top : 0 ;
width : 100 % ;
height : 6px;
display : block;
background : var ( -- b, var ( -- street) ) ;
transform- origin: 0 100 % ;
transform : rotateX ( 90deg) scaleX ( var ( -- sy, 1 ) ) ;
}
. truck- button: after {
-- sy: var ( -- progress, 0 ) ;
-- b: var ( -- street- fill) ;
}
. truck- button . default,
. truck- button . success {
display : block;
font- weight: 500 ;
font- size: 14px;
line- height: 24px;
opacity : var ( -- o, 1 ) ;
transition : opacity 0 . 3s;
}
. truck- button . success {
-- o: 0 ;
position : absolute;
top : 12px;
left : 0 ;
right : 0 ;
}
. truck- button . success svg {
width : 12px;
height : 10px;
display : inline- block;
vertical- align: top;
fill : none;
margin : 7px 0 0 4px;
stroke : var ( -- tick) ;
stroke- width: 2 ;
stroke- linecap: round;
stroke- linejoin: round;
stroke- dasharray: 16px;
stroke- dashoffset: var ( -- offset, 16px) ;
transition : stroke- dashoffset 0 . 4s ease 0 . 45s;
}
. truck- button . truck {
position : absolute;
width : 72px;
height : 28px;
transform : rotateX ( 90deg) translate3d ( var ( -- truck- x, 4px) , calc ( var ( -- truck- y- n, - 26 ) * 1px) , 12px) ;
}
. truck- button . truck: before,
. truck- button . truck: after {
content : "" ;
position : absolute;
bottom : - 6px;
left : var ( -- l, 18px) ;
width : 10px;
height : 10px;
border- radius: 50 % ;
z- index: 2 ;
box- shadow: inset 0 0 0 2px var ( -- wheel) , inset 0 0 0 4px var ( -- wheel- inner) ;
background : var ( -- wheel- dot) ;
transform : translateY ( calc ( var ( -- truck- y) * - 1px) ) translateZ ( 0 ) ;
}
. truck- button . truck: after {
-- l: 54px;
}
. truck- button . truck . wheel,
. truck- button . truck . wheel: before {
position : absolute;
bottom : var ( -- b, - 6px) ;
left : var ( -- l, 6px) ;
width : 10px;
height : 10px;
border- radius: 50 % ;
background : var ( -- wheel) ;
transform : translateZ ( 0 ) ;
}
. truck- button . truck . wheel {
transform : translateY ( calc ( var ( -- truck- y) * - 1px) ) translateZ ( 0 ) ;
}
. truck- button . truck . wheel: before {
-- l: 35px;
-- b: 0 ;
content : "" ;
}
. truck- button . truck . front,
. truck- button . truck . back,
. truck- button . truck . box {
position : absolute;
}
. truck- button . truck . back {
left : 0 ;
bottom : 0 ;
z- index: 1 ;
width : 47px;
height : 28px;
border- radius: 1px 1px 0 0 ;
background : linear- gradient ( 68deg, var ( -- back- inner) 0 % , var ( -- back- inner) 22 % , var ( -- back- inner- shadow) 22.1 % , var ( -- back- inner- shadow) 100 % ) ;
}
. truck- button . truck . back: before,
. truck- button . truck . back: after {
content : "" ;
position : absolute;
}
. truck- button . truck . back: before {
left : 11px;
top : 0 ;
right : 0 ;
bottom : 0 ;
z- index: 2 ;
border- radius: 0 1px 0 0 ;
background : var ( -- back) ;
}
. truck- button . truck . back: after {
border- radius: 1px;
width : 73px;
height : 2px;
left : - 1px;
bottom : - 2px;
background : var ( -- base) ;
}
. truck- button . truck . front {
left : 47px;
bottom : - 1px;
height : 22px;
width : 24px;
- webkit- clip- path: polygon ( 55 % 0 , 72 % 44 % , 100 % 58 % , 100 % 100 % , 0 100 % , 0 0 ) ;
clip- path: polygon ( 55 % 0 , 72 % 44 % , 100 % 58 % , 100 % 100 % , 0 100 % , 0 0 ) ;
background : linear- gradient ( 84deg, var ( -- front- shadow) 0 % , var ( -- front- shadow) 10 % , var ( -- front) 12 % , var ( -- front) 100 % ) ;
}
. truck- button . truck . front: before,
. truck- button . truck . front: after {
content : "" ;
position : absolute;
}
. truck- button . truck . front: before {
width : 7px;
height : 8px;
background : #fff;
left : 7px;
top : 2px;
- webkit- clip- path: polygon ( 0 0 , 60 % 0 % , 100 % 100 % , 0 % 100 % ) ;
clip- path: polygon ( 0 0 , 60 % 0 % , 100 % 100 % , 0 % 100 % ) ;
background : linear- gradient ( 59deg, var ( -- window) 0 % , var ( -- window) 57 % , var ( -- window- shadow) 55 % , var ( -- window- shadow) 100 % ) ;
}
. truck- button . truck . front: after {
width : 3px;
height : 2px;
right : 0 ;
bottom : 3px;
background : var ( -- front- light) ;
}
. truck- button . truck . box {
width : 13px;
height : 13px;
right : 56px;
bottom : 0 ;
z- index: 1 ;
border- radius: 1px;
overflow : hidden;
transform : translate ( calc ( var ( -- box- x, - 24 ) * 1px) , calc ( var ( -- box- y, - 6 ) * 1px) ) scale ( var ( -- box- s, 0.5 ) ) ;
opacity : var ( -- box- o, 0 ) ;
background : linear- gradient ( 68deg, var ( -- box) 0 % , var ( -- box) 50 % , var ( -- box- shadow) 50.2 % , var ( -- box- shadow) 100 % ) ;
background- size: 250 % 100 % ;
background- position- x: calc ( var ( -- bx, 0 ) * 1 % ) ;
}
. truck- button . truck . box: before,
. truck- button . truck . box: after {
content : "" ;
position : absolute;
}
. truck- button . truck . box: before {
content : "" ;
background : rgba ( 255 , 255 , 255 , 0.2 ) ;
left : 0 ;
right : 0 ;
top : 6px;
height : 1px;
}
. truck- button . truck . box: after {
width : 6px;
left : 100 % ;
top : 0 ;
bottom : 0 ;
background : var ( -- back) ;
transform : translateX ( calc ( var ( -- hx, 0 ) * 1px) ) ;
}
. truck- button. animation {
-- rx: - 90deg;
-- br: 0 ;
}
. truck- button. animation . default {
-- o: 0 ;
}
. truck- button. animation. done {
-- rx: 0deg;
-- br: 5px;
-- br- d: . 2s;
}
. truck- button. animation. done . success {
-- o: 1 ;
-- offset: 0 ;
}
html {
box- sizing: border- box;
- webkit- font- smoothing: antialiased;
}
* {
box- sizing: inherit;
}
* : before,
* : after {
box- sizing: inherit;
}
body {
min- height: 100vh;
display : flex;
font- family: "Inter UI" , "Inter" , Arial;
justify- content: center;
align- items: center;
background : #000 ;
}
body . dribbble {
position : fixed;
display : block;
right : 20px;
bottom : 20px;
}
body . dribbble img {
display : block;
height : 28px;
}
body . twitter {
position : fixed;
display : block;
right : 64px;
bottom : 14px;
}
body . twitter svg {
width : 32px;
height : 32px;
fill : #1da1f2;
}
< / style>
< / head>
< body>
< ! -- partial: index. partial. html -- >
< button class = "truck-button" >
< span class = "default" > 提交订单< / span>
< span class = "success" >
订单完成
< svg viewbox= "0 0 12 10" >
< polyline points= "1.5 6 4.5 9 10.5 1" > < / polyline>
< / svg>
< / span>
< div class = "truck" >
< div class = "wheel" > < / div>
< div class = "back" > < / div>
< div class = "front" > < / div>
< div class = "box" > < / div>
< / div>
< / button>
< script src= 'https://cdn.jsdelivr.net/npm/gsap@3.0.1/dist/gsap.min.js' > < / script>
< script>
document. querySelectorAll ( '.truck-button' ) . forEach ( button => {
button. addEventListener ( 'click' , e => {
e. preventDefault ( ) ;
let box = button. querySelector ( '.box' ) ,
truck = button. querySelector ( '.truck' ) ;
if ( ! button. classList. contains ( 'done' ) ) {
if ( ! button. classList. contains ( 'animation' ) ) {
button. classList. add ( 'animation' ) ;
gsap. to ( button, {
'--box-s' : 1 ,
'--box-o' : 1 ,
duration : .3 ,
delay : .5
} ) ;
gsap. to ( box, {
x : 0 ,
duration : .4 ,
delay : .7
} ) ;
gsap. to ( button, {
'--hx' : - 5 ,
'--bx' : 50 ,
duration : .18 ,
delay : .92
} ) ;
gsap. to ( box, {
y : 0 ,
duration : .1 ,
delay : 1.15
} ) ;
gsap. set ( button, {
'--truck-y' : 0 ,
'--truck-y-n' : - 26
} ) ;
gsap. to ( button, {
'--truck-y' : 1 ,
'--truck-y-n' : - 25 ,
duration : .2 ,
delay : 1.25 ,
onComplete ( ) {
gsap. timeline ( {
onComplete ( ) {
button. classList. add ( 'done' ) ;
}
} ) . to ( truck, {
x : 0 ,
duration : .4
} ) . to ( truck, {
x : 40 ,
duration : 1
} ) . to ( truck, {
x : 20 ,
duration : .6
} ) . to ( truck, {
x : 96 ,
duration : .4
} ) ;
gsap. to ( button, {
'--progress' : 1 ,
duration : 2.4 ,
ease : "power2.in"
} ) ;
}
} ) ;
}
} else {
button. classList. remove ( 'animation' , 'done' ) ;
gsap. set ( truck, {
x : 4
} ) ;
gsap. set ( button, {
'--progress' : 0 ,
'--hx' : 0 ,
'--bx' : 0 ,
'--box-s' : .5 ,
'--box-o' : 0 ,
'--truck-y' : 0 ,
'--truck-y-n' : - 26
} ) ;
gsap. set ( box, {
x : - 24 ,
y : - 6
} ) ;
}
} ) ;
} ) ;
< / script>
< / body>
< / html>
动画3
< ! DOCTYPE html>
< html lang= "en" >
< head>
< meta charset= "UTF-8" >
< title> Document< / title>
< link rel= "stylesheet" >
< style>
* {
margin : 0 ;
padding : 0 ;
font- family: "Montserrat" , sans- serif;
}
body {
width : 100vw;
height : 100vh;
background- color: #000 ;
display : flex;
justify- content: center;
align- items: center;
}
. place- order {
width : 160px;
height : 50px;
border- radius: 10px;
background- color: #2b59b5;
position : relative;
overflow : hidden;
border : none;
cursor : pointer;
}
. place- order . text {
width : 100 % ;
height : 100 % ;
line- height: 50px;
opacity : 0 ;
color : #fff;
font- weight: bold;
font- size: 16px;
position : absolute;
top : 0 ;
transition : all 0 . 2s;
transform : translateY ( 20px) ;
}
. place- order: focus {
outline : none;
}
. place- order . forklift {
display : none;
transform : scale ( 0.4 ) ;
position : absolute;
top : - 2px;
left : - 65px;
animation : 4s lift- moving infinite;
}
. place- order . forklift . upper {
width : 34px;
height : 20px;
margin- bottom: 2px;
border : 5px solid #ff7745;
position : relative;
border- radius: 10px 50px 10px 5px;
}
. place- order . forklift . upper: after {
content : "" ;
width : 30px;
height : 50px;
position : absolute;
left : 170 % ;
top : 12px;
box- sizing: border- box;
border- left: 5px solid #000 ;
border- bottom: 6px solid #000 ;
border- radius: 0 0 0 5px;
transform- origin: center;
}
. place- order . forklift . lower {
width : 60px;
height : 30px;
position : relative;
background- color: #FF4500 ;
border- radius: 5px 15px 10px 10px;
}
. place- order . forklift . lower: before,
. place- order . forklift . lower: after {
content : "" ;
width : 20px;
height : 20px;
position : absolute;
left : 0 ;
bottom : - 10px;
border : 3px solid #2b59b5;
border- radius: 50 % ;
background- color: #000 ;
}
. place- order . forklift . lower: after {
left : 36px;
}
. place- order . box {
display : none;
width : 50px;
height : 50px;
background- color: #ad8762;
border- radius: 5px;
position : absolute;
top : 56px;
left : 50px;
transform : scale ( 0.4 ) ;
animation : 4s box infinite;
}
. place- order . box: before,
. place- order . box: after {
content : "" ;
width : 4px;
height : 12px;
left : 21px;
background- color: #ffbf59;
position : absolute;
}
. place- order . box: after {
height : 10px;
left : 25px;
}
. place- order-- default . default {
opacity : 1 ;
transform : translateY ( 0 ) ;
}
. place- order-- default . done {
transform : translateY ( 20px) ;
}
. place- order-- placing . forklift {
display : block;
}
. place- order-- placing . box {
display : block;
}
. place- order-- placing . default {
transform : translateY ( - 20px) ;
}
. place- order-- done . done {
opacity : 1 ;
transform : translateY ( 0 ) ;
}
. place- order-- done . default {
transform : translateY ( - 20px) ;
}
@keyframes lift- moving {
0 % {
left : - 65px;
}
50 % {
left : 20px;
}
60 % {
left : 15px;
}
100 % {
left : 200px;
}
}
@keyframes box {
0 % {
top : 56px;
}
20 % {
top : 6px;
left : 50px;
}
50 % {
top : 6px;
left : 50px;
}
60 % {
top : 6px;
left : 45px;
}
100 % {
top : 6px;
left : 230px;
}
}
< / style>
< / head>
< body>
< ! -- partial: index. partial. html -- >
< button class = "place-order place-order--default" >
< div class = "default text" > 提交订单< / div>
< div class = "forklift" >
< div class = "upper" > < / div>
< div class = "lower" > < / div>
< / div>
< div class = "box animation" > < / div>
< div class = "done text" > 订单完成< / div>
< / button>
< ! -- partial -- >
< script>
const btn = document. querySelector ( ".place-order" ) ;
btn. addEventListener ( "click" , ( ) => {
btn. classList. remove ( "place-order--default" ) ;
btn. classList. add ( "place-order--placing" ) ;
setTimeout ( ( ) => {
btn. classList. remove ( "place-order--placing" ) ;
btn. classList. add ( "place-order--done" ) ;
} , 4000 ) ;
setTimeout ( ( ) => {
btn. classList. remove ( "place-order--done" ) ;
btn. classList. add ( "place-order--default" ) ;
} , 6000 ) ;
} )
< / script>
< / body>
< / html>