Меня попросили взять счетчик загрузки на чистом CSS3 и сделать его динамически изменяемым по пикселям для использования в разных местах программы.
Мой текущий код: (который, по-видимому, плохо работает в фрагментах SO)
.loader {
animation:spin 1s infinite linear;
border:solid 2vmin transparent;
border-radius:50%;
border-right-color:#71c491;
border-top-color:#f7941d;
box-sizing:border-box;
height:20vmin;
left:calc(50% - 10vmin);
position:fixed;
top:calc(50% - 10vmin);
width:20vmin;
z-index:1;
&:before {
animation:spin 2s infinite linear;
border:solid 2vmin transparent;
border-radius:50%;
border-right-color:#21409a;
border-top-color:#92278f;
box-sizing:border-box;
content:"";
height:16vmin;
left:0;
position:absolute;
top:0;
width:16vmin;
}
&:after {
animation:spin 3s infinite linear;
border:solid 2vmin transparent;
border-radius:50%;
border-right-color:#13b0e6;
border-top-color:#18244c;
box-sizing:border-box;
content:"";
height:12vmin;
left:2vmin;
position:absolute;
top:2vmin;
width:12vmin;
}
}
@keyframes spin {
100% {
transform:rotate(360deg);
}
}
<div class = "loader"></div>
Я погуглил и попробовал transform:scale(), но, насколько я могу судить, он принимает только определенные данные и увеличивает/уменьшает размер в процентах. (2 = размер 200 %)
Я думаю, мне нужна какая-то оболочка, но я не слишком хорошо знаком с продвинутым CSS, чтобы получить эффект. Когда я пытался создать свой собственный, только верхняя граница счетчика изменялась в странную форму, а не внутренние границы. Я просто в тупике. Если бы вы могли указать мне в правильном направлении, я был бы признателен. Спасибо.
Вы можете попробовать сочетание CSS var() / calc() / clip() / сетки ... и relative
/absolute
position
ning, чтобы положить загрузчик поверх родителя, где вы нужно, если это тебя вдохновляет:
демонстрация с несколькими загрузчиками в пределах размера div и возможностью установить средний размер для начала, размер% в зависимости от ширины родителя.
значение для сброса в демо — --size
; вы также можете настроить другие значения --MyVarCss
в соответствии с вашими потребностями.
* {
box-sizing: border-box;
}
:root { /* init for the var() values */
--size: 20;/* value used to set the loader's width and adjust border's width */
--width: calc(var(--size) * 1%);
--widthBorder: calc( clamp(20px, 6vw, 80px) * var(--size) * 0.005);
}
.a,/* for the demo , just a bunch of containers */
.b,
.c,
.d,
.d,
.e {
position: relative;
/* what the parent loader needs to be (absolute/fixed/sticky works too, static not) */
float: left;
border: solid;
margin: 1em;
}
div.a {
--size: 50; /* reset the value used to set the loader's width */
width: 50%;
padding-top: 50%;
}
.b {
--size: 10;/* reset the value used to set the loader's width */
width: 600px;
height: 200px;
}
.c {
--size: 15;/* reset the value used to set the loader's width */
width: 25%;
padding-top: 20%;
}
.d {
--size: 30;/* reset the value used to set the loader's width */
width: 800px;
height: 400px;
}
.e {
--size: 14;/* reset the value used to set the loader's width */
width: 90%;
min-height: 20vh;
}
div {
width: 20%;
padding-top: 20%;
}
/* loader styles */
.loader {
position: absolute;
top: 0;
left: 0;
display: flex;
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
.loader b {
display: grid;
animation: rotate 3s -1s infinite linear;
border: solid var(--widthBorder) transparent;
padding: calc(var(--widthBorder) / 2);
border-radius: 50%;
border-right-color: #71c491;
border-top-color: #f7941d;
grid-row: 1;
grid-column: 1;
margin: 0;
}
.loader>b {
margin: auto;
width: var(--width);
}
.loader>b:before {
content: "";
padding-top: 100%;
grid-row: 1;
grid-column: 1;
}
.loader b b {
border-right-color: #21409a;
border-top-color: #92278f;
}
.loader b b b {
border-right-color: #13b0e6;
border-top-color: #18244c;
padding: 0;
}
@keyframes rotate {
100% {
transform: rotate(360deg);
}
}
<div class=a>
<div class = "loader"><b><b><b></b></b>
</b>
</div>
</div>
<div class=b>
<div class = "loader"><b><b><b></b></b>
</b>
</div>
</div>
<div class=c>
<div class = "loader"><b><b><b></b></b>
</b>
</div>
</div>
<div class=d>
<div class = "loader"><b><b><b></b></b>
</b>
</div>
</div>
<div class=e>
<div class = "loader"><b><b><b></b></b>
</b>
</div>
</div>