【发布时间】:2017-07-13 23:10:21
【问题描述】:
我只需要使用 css 和 javascript 来制作 pie spinner/loader。
到目前为止,当背景是纯色时,我设法让它工作,因为它不需要查看隐藏半圆的 div(不介意颜色和顶部/左侧):
.wrapper {
position: relative;
background: transparent;
width: 50px;
height: 50px;
background: gray;
}
.wrapper,
.wrapper * {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.wrapper .pie,
.wrapper * .pie {
width: 50%;
height: 100%;
transform-origin: 100% 50%;
position: absolute;
background: red;
}
.wrapper .spinner,
.wrapper * .spinner {
border-radius: 100% 0 0 100%/50% 0 0 50%;
z-index: 200;
border-right: none;
animation: rota 5s linear infinite
}
.wrapper .filler,
.wrapper * .filler {
border-radius: 0 100% 100% 0/0 50% 50% 0;
left: 50%;
opacity: 0;
z-index: 100;
border-left: none;
background: red;
animation: opa 5s steps(1, end) infinite reverse
}
.wrapper .mask,
.wrapper * .mask {
width: 50%;
height: 100%;
position: absolute;
background: inherit;
opacity: 1;
z-index: 300;
animation: opa 5s steps(1, end) infinite
}
.wrapper:hover .spinner,
.wrapper:hover .filler,
.wrapper:hover .mask {
animation-play-state: running;
}
@-moz-keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@-webkit-keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@-o-keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@-moz-keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
@-webkit-keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
@-o-keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
@keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
<div class="wrapper">
<div class="pie spinner"></div>
<div class="pie filler"></div>
<div class="mask"></div>
</div>
问题是,我需要使背景透明,这样我才能看到它,但是蒙版 div 变得无用:
body {
background-image: url(http://www.publicdomainpictures.net/pictures/20000/velka/tulip-flower-garden.jpg)
}
.wrapper {
position: relative;
background: transparent;
width: 50px;
height: 50px;
background: transparent;
}
.wrapper,
.wrapper * {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.wrapper .pie,
.wrapper * .pie {
width: 50%;
height: 100%;
transform-origin: 100% 50%;
position: absolute;
background: red;
}
.wrapper .spinner,
.wrapper * .spinner {
border-radius: 100% 0 0 100%/50% 0 0 50%;
z-index: 200;
border-right: none;
animation: rota 5s linear infinite
}
.wrapper .filler,
.wrapper * .filler {
border-radius: 0 100% 100% 0/0 50% 50% 0;
left: 50%;
opacity: 0;
z-index: 100;
border-left: none;
background: red;
animation: opa 5s steps(1, end) infinite reverse
}
.wrapper .mask,
.wrapper * .mask {
width: 50%;
height: 100%;
position: absolute;
background: inherit;
opacity: 1;
z-index: 300;
animation: opa 5s steps(1, end) infinite
}
.wrapper:hover .spinner,
.wrapper:hover .filler,
.wrapper:hover .mask {
animation-play-state: running;
}
@-moz-keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@-webkit-keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@-o-keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes rota {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@-moz-keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
@-webkit-keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
@-o-keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
@keyframes opa {
0% {
opacity: 1;
}
50%,
100% {
opacity: 0;
}
}
<div class="wrapper">
<div class="pie spinner"></div>
<div class="pie filler"></div>
<div class="mask"></div>
</div>
有没有可能实现我想要的?怎么样?
【问题讨论】:
-
您可以使用 css 渐变背景旋转,例如codepen
-
这个差不多就是我想要的了,唯一的问题是这个项目我不能用jQuery,不过我会研究一下渐变背景旋转。
标签: javascript html css spinner