啥也不说 先上效果图
完整代码
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>魔方4格滚动加载动画</title>
<!--<link rel="stylesheet/less" href="./less.less" />
<script src="https://cdn.bootcss.com/less.js/2.7.2/less.min.js"></script>-->
<style type="text/css">
/* 动画 */
@-webkit-keyframes willRotate { 0% { -webkit-transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); } 8.3% { -webkit-transform: rotateX(-90deg) rotateY(0deg) rotateZ(0deg); } 16.6% { -webkit-transform: rotateX(-90deg) rotateY(0deg) rotateZ(90deg); } 24.9% { -webkit-transform: rotateX(0deg) rotateY(0deg) rotateZ(90deg); } 33.2% { -webkit-transform: rotateX(0deg) rotateY(-90deg) rotateZ(90deg); } 41.5% { -webkit-transform: rotateX(0deg) rotateY(-90deg) rotateZ(180deg); } 49.8% { -webkit-transform: rotateX(0deg) rotateY(0deg) rotateZ(180deg); } 58.1% { -webkit-transform: rotateX(90deg) rotateY(0deg) rotateZ(180deg); } 66.4% { -webkit-transform: rotateX(90deg) rotateY(0deg) rotateZ(270deg); } 74.7% { -webkit-transform: rotateX(0deg) rotateY(0deg) rotateZ(270deg); } 83% { -webkit-transform: rotateX(0deg) rotateY(90deg) rotateZ(270deg); } 91.3% { -webkit-transform: rotateX(0deg) rotateY(90deg) rotateZ(360deg); } 100% { -webkit-transform: rotateX(0deg) rotateY(0deg) rotateZ(360deg); } }
@-moz-keyframes willRotate { 0% { -moz-transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); } 8.3% { -moz-transform: rotateX(-90deg) rotateY(0deg) rotateZ(0deg); } 16.6% { -moz-transform: rotateX(-90deg) rotateY(0deg) rotateZ(90deg); } 24.9% { -moz-transform: rotateX(0deg) rotateY(0deg) rotateZ(90deg); } 33.2% { -moz-transform: rotateX(0deg) rotateY(-90deg) rotateZ(90deg); } 41.5% { -moz-transform: rotateX(0deg) rotateY(-90deg) rotateZ(180deg); } 49.8% { -moz-transform: rotateX(0deg) rotateY(0deg) rotateZ(180deg); } 58.1% { -moz-transform: rotateX(90deg) rotateY(0deg) rotateZ(180deg); } 66.4% { -moz-transform: rotateX(90deg) rotateY(0deg) rotateZ(270deg); } 74.7% { -moz-transform: rotateX(0deg) rotateY(0deg) rotateZ(270deg); } 83% { -moz-transform: rotateX(0deg) rotateY(90deg) rotateZ(270deg); } 91.3% { -moz-transform: rotateX(0deg) rotateY(90deg) rotateZ(360deg); } 100% { -moz-transform: rotateX(0deg) rotateY(0deg) rotateZ(360deg); } }
@-o-keyframes willRotate { 0% { -o-transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); } 8.3% { -o-transform: rotateX(-90deg) rotateY(0deg) rotateZ(0deg); } 16.6% { -o-transform: rotateX(-90deg) rotateY(0deg) rotateZ(90deg); } 24.9% { -o-transform: rotateX(0deg) rotateY(0deg) rotateZ(90deg); } 33.2% { -o-transform: rotateX(0deg) rotateY(-90deg) rotateZ(90deg); } 41.5% { -o-transform: rotateX(0deg) rotateY(-90deg) rotateZ(180deg); } 49.8% { -o-transform: rotateX(0deg) rotateY(0deg) rotateZ(180deg); } 58.1% { -o-transform: rotateX(90deg) rotateY(0deg) rotateZ(180deg); } 66.4% { -o-transform: rotateX(90deg) rotateY(0deg) rotateZ(270deg); } 74.7% { -o-transform: rotateX(0deg) rotateY(0deg) rotateZ(270deg); } 83% { -o-transform: rotateX(0deg) rotateY(90deg) rotateZ(270deg); } 91.3% { -o-transform: rotateX(0deg) rotateY(90deg) rotateZ(360deg); } 100% { -o-transform: rotateX(0deg) rotateY(0deg) rotateZ(360deg); } }
@-ms-keyframes willRotate { 0% { -ms-transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); } 8.3% { -ms-transform: rotateX(-90deg) rotateY(0deg) rotateZ(0deg); } 16.6% { -ms-transform: rotateX(-90deg) rotateY(0deg) rotateZ(90deg); } 24.9% { -ms-transform: rotateX(0deg) rotateY(0deg) rotateZ(90deg); } 33.2% { -ms-transform: rotateX(0deg) rotateY(-90deg) rotateZ(90deg); } 41.5% { -ms-transform: rotateX(0deg) rotateY(-90deg) rotateZ(180deg); } 49.8% { -ms-transform: rotateX(0deg) rotateY(0deg) rotateZ(180deg); } 58.1% { -ms-transform: rotateX(90deg) rotateY(0deg) rotateZ(180deg); } 66.4% { -ms-transform: rotateX(90deg) rotateY(0deg) rotateZ(270deg); } 74.7% { -ms-transform: rotateX(0deg) rotateY(0deg) rotateZ(270deg); } 83% { -ms-transform: rotateX(0deg) rotateY(90deg) rotateZ(270deg); } 91.3% { -ms-transform: rotateX(0deg) rotateY(90deg) rotateZ(360deg); } 100% { -ms-transform: rotateX(0deg) rotateY(0deg) rotateZ(360deg); } }
@keyframes willRotate { 0% { transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); } 8.3% { transform: rotateX(-90deg) rotateY(0deg) rotateZ(0deg); } 16.6% { transform: rotateX(-90deg) rotateY(0deg) rotateZ(90deg); } 24.9% { transform: rotateX(0deg) rotateY(0deg) rotateZ(90deg); } 33.2% { transform: rotateX(0deg) rotateY(-90deg) rotateZ(90deg); } 41.5% { transform: rotateX(0deg) rotateY(-90deg) rotateZ(180deg); } 49.8% { transform: rotateX(0deg) rotateY(0deg) rotateZ(180deg); } 58.1% { transform: rotateX(90deg) rotateY(0deg) rotateZ(180deg); } 66.4% { transform: rotateX(90deg) rotateY(0deg) rotateZ(270deg); } 74.7% { transform: rotateX(0deg) rotateY(0deg) rotateZ(270deg); } 83% { transform: rotateX(0deg) rotateY(90deg) rotateZ(270deg); } 91.3% { transform: rotateX(0deg) rotateY(90deg) rotateZ(360deg); } 100% { transform: rotateX(0deg) rotateY(0deg) rotateZ(360deg); } }
/* 动画 end */
/* checkerboard */
.checkerboard {
width: 200px;
height: 200px;
margin-top: 100px;
margin-left: 100px;
position: relative;
-webkit-transform: rotateX(45deg) rotateY(0deg) rotateZ(45deg);
-moz-transform: rotateX(45deg) rotateY(0deg) rotateZ(45deg);
-ms-transform: rotateX(45deg) rotateY(0deg) rotateZ(45deg);
transform: rotateX(45deg) rotateY(0deg) rotateZ(45deg);
-webkit-transform-origin: 50px 50px;
-moz-transform-origin: 50px 50px;
-ms-transform-origin: 50px 50px;
transform-origin: 50px 50px;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.checkerboard__cell {
box-sizing: border-box;
float: left;
width: 100px;
height: 100px;
border: 1px black solid;
-webkit-transform: translateZ(-50px);
-moz-transform: translateZ(-50px);
-ms-transform: translateZ(-50px);
transform: translateZ(-50px);
}
/* checkerboard end */
/* rotateBox */
.rotate {
position: absolute;
display: block;
width: 100px;
height: 100px;
padding: 0;
margin: 0;
-webkit-transform-origin: 100% 100% -50px;
-moz-transform-origin: 100% 100% -50px;
-ms-transform-origin: 100% 100% -50px;
transform-origin: 100% 100% -50px;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.rotate__surface {
position: absolute;
display: block;
width: 100px;
height: 100px;
-webkit-backface-visibility: hidden;
backface-visibility: visible;
}
.rotate__surface--front {
-webkit-transform: translateZ(50px);
-moz-transform: translateZ(50px);
-ms-transform: translateZ(50px);
transform: translateZ(50px);
background-color: #0000ff;
}
.rotate__surface--back {
-webkit-transform: rotateY(180deg) translateZ(50px);
-moz-transform: rotateY(180deg) translateZ(50px);
-ms-transform: rotateY(180deg) translateZ(50px);
transform: rotateY(180deg) translateZ(50px);
background-color: #008000;
}
.rotate__surface--right {
-webkit-transform: rotateY(90deg) translateZ(50px);
-moz-transform: rotateY(90deg) translateZ(50px);
-ms-transform: rotateY(90deg) translateZ(50px);
transform: rotateY(90deg) translateZ(50px);
background-color: #ff0000;
}
.rotate__surface--left {
-webkit-transform: rotateY(-90deg) translateZ(50px);
-moz-transform: rotateY(-90deg) translateZ(50px);
-ms-transform: rotateY(-90deg) translateZ(50px);
transform: rotateY(-90deg) translateZ(50px);
background-color: #f07810;
}
.rotate__surface--top {
-webkit-transform: rotateX(90deg) translateZ(50px);
-moz-transform: rotateX(90deg) translateZ(50px);
-ms-transform: rotateX(90deg) translateZ(50px);
transform: rotateX(90deg) translateZ(50px);
background-color: #ffff00;
}
.rotate__surface--bottom {
-webkit-transform: rotateX(-90deg) translateZ(50px);
-moz-transform: rotateX(-90deg) translateZ(50px);
-ms-transform: rotateX(-90deg) translateZ(50px);
transform: rotateX(-90deg) translateZ(50px);
background-color: #ffffff;
}
#rotateBoxA {
-webkit-animation: willRotate 6s linear infinite normal;
-moz-animation: willRotate 6s linear infinite normal;
-ms-animation: willRotate 6s linear infinite normal;
animation: willRotate 6s linear infinite normal;
}
/* rotateBox end */
</style>
</head>
<body>
<div class="checkerboard">
<div class="checkerboard__cell"></div>
<div class="checkerboard__cell"></div>
<div class="checkerboard__cell"></div>
<div class="checkerboard__cell"></div>
<div class="rotate" id="rotateBoxA">
<div class="rotate__surface rotate__surface--front"></div>
<div class="rotate__surface rotate__surface--back"></div>
<div class="rotate__surface rotate__surface--right"></div>
<div class="rotate__surface rotate__surface--left"></div>
<div class="rotate__surface rotate__surface--top"></div>
<div class="rotate__surface rotate__surface--bottom"></div>
</div>
</div>
</body>
</html>
less源码
完整案例的 css 是由 less 编译的, less 源码如下
//@import "../../mine/less/_animation.less";
.pre(@style, @value) {
-webkit-@{style}: @value;
-moz-@{style}: @value;
-ms-@{style}: @value;
@{style}: @value;
}
.transition(@arg) {
.pre(transition, @arg);
}
.transition-delay(@delay: 0) {
.pre(transition-delay, @delay);
}
.transition-duration(@duration: 200ms) {
.pre(transition-duration, @duration);
}
.transition-property(@property: all) {
.pre(transition-property, @property);
}
.transition-timing-function(@function: ease) {
.pre(transition-timing-function, @function);
}
.transform(@arg) {
.pre(transform, @arg);
}
.transform-origin(@args) {
.pre(transform-origin, @args);
}
.transform-style(@style) {
.pre(transform-style, @style);
}
.rotate(@deg: 45deg) {
.transform(rotate(@deg));
}
.scale(@factor: .5) {
.transform(scale(@factor));
}
.translate(@x, @y) {
.transform(translate(@x, @y));
}
.translate3d(@x, @y, @z) {
.transform(translate3d(@x, @y, @z));
}
.translateHardware(@x, @y) {
.translate(@x, @y);
.pre(transform, translate3d(@x, @y, 0));
}
.animation(@value) {
.pre(animation, @value);
}
.keyframes(@name) {
@-webkit-keyframes @name {
.-frames(-webkit-)
}
@-moz-keyframes @name {
.-frames(-moz-)
}
@-o-keyframes @name {
.-frames(-o-)
}
@-ms-keyframes @name {
.-frames(-ms-)
}
@keyframes @name {
.-frames()
}
}
//以上是 animation.less 提供的方法
/* 动画 */
.willRotate {
.keyframes(willRotate);
.-frames(@-...) {
0% {
@{-}transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg);
}
8.3% {
@{-}transform: rotateX(-90deg) rotateY(0deg) rotateZ(0deg);
}
16.6% {
@{-}transform: rotateX(-90deg) rotateY(0deg) rotateZ(90deg);
}
24.9% {
@{-}transform: rotateX(0deg) rotateY(0deg) rotateZ(90deg);
}
33.2% {
@{-}transform: rotateX(0deg) rotateY(-90deg) rotateZ(90deg);
}
41.5% {
@{-}transform: rotateX(0deg) rotateY(-90deg) rotateZ(180deg);
}
49.8% {
@{-}transform: rotateX(0deg) rotateY(0deg) rotateZ(180deg);
}
58.1% {
@{-}transform: rotateX(90deg) rotateY(0deg) rotateZ(180deg);
}
66.4% {
@{-}transform: rotateX(90deg) rotateY(0deg) rotateZ(270deg);
}
74.7% {
@{-}transform: rotateX(0deg) rotateY(0deg) rotateZ(270deg);
}
83% {
@{-}transform: rotateX(0deg) rotateY(90deg) rotateZ(270deg);
}
91.3% {
@{-}transform: rotateX(0deg) rotateY(90deg) rotateZ(360deg);
}
100% {
@{-}transform: rotateX(0deg) rotateY(0deg) rotateZ(360deg);
}
}
}
/* 动画 end */
/* checkerboard */
.checkerboard {
width: 200px;
height: 200px;
margin-top: 100px;
margin-left: 100px;
position: relative;
.pre(transform, rotateX(45deg) rotateY(0deg) rotateZ(45deg));
.transform-origin(50px 50px);
.transform-style(preserve-3d);
&__cell {
box-sizing: border-box;
float: left;
width: 100px;
height: 100px;
border: 1px black solid;
.pre(transform, translateZ(-50px));
}
}
/* checkerboard end */
/* rotateBox */
.rotate {
position: absolute;
display: block;
width: 100px;
height: 100px;
padding: 0;
margin: 0;
.transform-origin(100% 100% -50px);
.transform-style(preserve-3d);
&__surface {
position: absolute;
display: block;
width: 100px;
height: 100px;
-webkit-backface-visibility: hidden;
backface-visibility: visible;
// background: radial-gradient(transparent 30%, rgba(94, 126, 17, 0.25) 100%);
&--front {
.pre(transform, translateZ(50px));
background-color: #0000ff;
}
&--back {
.pre(transform, rotateY(180deg) translateZ(50px));
background-color: #008000;
}
&--right {
.pre(transform, rotateY(90deg) translateZ(50px));
background-color: #ff0000;
}
&--left {
.pre(transform, rotateY(-90deg) translateZ(50px));
background-color: #f07810;
}
&--top {
.pre(transform, rotateX(90deg) translateZ(50px));
background-color: #ffff00;
}
&--bottom {
.pre(transform, rotateX(-90deg) translateZ(50px));
background-color: #ffffff;
}
}
}
#rotateBoxA {
.animation(willRotate 6s linear infinite normal);
}
/* rotateBox end */
end