Я пытаюсь создать анимацию Apple's OS X загрузчика.
То, что я уже попробовал:
.animation-wrapper {
width: 200px;
height: 200px;
border: 1px solid black;
border-radius: 50%;
position: relative;
overflow: hidden;
filter: brightness(0.8);
-webkit-filter: brightness(0.8);
}
.pie-piece1 {
position: absolute;
width: 50%;
height: 50%;
bottom: 0;
left: 0;
background: linear-gradient(to right, rgba(255, 0, 0, 1) 0%, rgba(255, 255, 0,
1) 100%);
}
.pie-piece2 {
position: absolute;
width: 50%;
height: 50%;
bottom: 0;
right: 0;
background: linear-gradient(to right, rgba(255, 255, 0, 1) 0%, rgba(0, 255, 0,
1) 100%);
}
.pie-piece3 {
position: absolute;
width: 50%;
height: 50%;
top: 0;
left: 0;
background: linear-gradient(to right, rgba(255, 0, 0, 1) 0%, rgba(255, 0, 255,
1) 100%);
}
.pie-piece4 {
position: absolute;
width: 50%;
height: 50%;
top: 0;
right: 0;
background: linear-gradient(to right, rgba(255, 0, 255, 1) 0%, rgba(0, 0, 255,
1) 100%);
}
.rotating-spinners {
position: absolute;
}
.spike {
fill: rgba(22, 22, 22, 0.5);
}
Линейные градиенты неправильно направлены. Я не смог найти способ сделать градиент,
идущий в двух направлениях.
Есть ли способ, чтобы создать это, используя только CSS или SVG, не смешивая их,
как это сделал я?
Или есть другие решения, может использовать canvas, или какую-то другую магию?
Перевод вопроса: Circle loading animation @Persijn
Ответы
Ответ 1
Вот моя SVG-только версия. Цвет фона колеса не идеален, но я думаю, что получилось
довольно близко.
Источник: @Paul LeBeau
Ответ 2
Вот решение CSS, в котором я рассмотрю использование только одного элемента.
Я буду использовать форму, которую создал в этом предыдущем ответе, а выше я рассмотрю
конический градиент conic-gradient()
На самом деле conic-Gradient() поддерживается только в Chrome и Safari, но у нас
скоро будет лучшая поддержка:
.box {
--R:50px; /*Radius*/
--c1:grey; /*first color*/
--c2:#fff; /*second color*/
--g1:var(--c1) 98%, transparent 100%;
--g2:var(--c2) 98%, transparent 100%;
width:calc(2*var(--R));
height:calc(2*var(--R));
border-radius:100%;
border:1px solid;
position:relative;
overflow:hidden;
display:inline-block;
background:conic-gradient(rgba(128, 0, 128,0.7), rgba(0, 0, 255,0.7),rgba(0, 128,
0,0.7),rgba(255, 255, 0,0.7), rgba(255, 0, 0,0.7), rgba(128, 0, 128,0.7));
box-shadow:0 3px 5px inset rgba(0,0,0,0.5);
}
.box::before,
.box::after{
content:"";
position:absolute;
z-index:-1;
top:0;
bottom:0;
left:0;
width:50%;
background:
/*we rotate by 30deg so will use :
sin(30deg)*R = 0.5xR
cos(30deg)*R = 0.866xR
*/
radial-gradient(circle var(--R) at calc(var(--R) + 0.866*var(--R)) calc(var(--R)
- 0.5*var(--R)) ,var(--g1)),
radial-gradient(circle var(--R) at calc(var(--R) + 0.5*var(--R)) calc(var(--R)
- 0.866*var(--R)),var(--g2)),
radial-gradient(circle var(--R) at var(--R) 0
,var(--g1)),
radial-gradient(circle var(--R) at calc(var(--R) - 0.5*var(--R)) calc(var(--R)
- 0.866*var(--R)),var(--g2)),
radial-gradient(circle var(--R) at calc(var(--R) - 0.866*var(--R)) calc(var(--R)
- 0.5*var(--R)) ,var(--g1)),
radial-gradient(circle var(--R) at 0 var(--R)
,var(--g2)),
radial-gradient(circle var(--R) at calc(var(--R) - 0.866*var(--R)) calc(var(--R)
+ 0.5*var(--R)) ,var(--g1));
transform-origin:right;
animation:animate 3s linear infinite;
}
/*the same shape rotated*/
.box::after {
animation-delay:-1.5s;
}
@keyframes animate {
to {
transform:rotate(-360deg);
}
}
Вывод:
Вращение в противоположном направлении:
.box {
--R:50px; /*Radius*/
--c1:grey; /*first color*/
--c2:#fff; /*second color*/
--g1:var(--c1) 98%, transparent 100%;
--g2:var(--c2) 98%, transparent 100%;
width:calc(2*var(--R));
height:calc(2*var(--R));
border-radius:100%;
border:1px solid;
position:relative;
overflow:hidden;
display:inline-block;
background:conic-gradient(rgba(128, 0, 128,0.7), rgba(0, 0, 255,0.7),rgba(0, 128,
0,0.7),rgba(255, 255, 0,0.7), rgba(255, 0, 0,0.7), rgba(128, 0, 128,0.7));
box-shadow:0 3px 5px inset rgba(0,0,0,0.5);
}
.box::before,
.box::after{
content:"";
position:absolute;
z-index:-1;
top:0;
bottom:0;
left:0;
width:50%;
background:
/*we rotate by 30deg so will use :
sin(30deg)*R = 0.5xR
cos(30deg)*R = 0.866xR
*/
radial-gradient(circle var(--R) at calc(var(--R) + 0.866*var(--R)) calc(var(--R)
- 0.5*var(--R)) ,var(--g1)),
radial-gradient(circle var(--R) at calc(var(--R) + 0.5*var(--R)) calc(var(--R)
- 0.866*var(--R)),var(--g2)),
radial-gradient(circle var(--R) at var(--R) 0
,var(--g1)),
radial-gradient(circle var(--R) at calc(var(--R) - 0.5*var(--R)) calc(var(--R)
- 0.866*var(--R)),var(--g2)),
radial-gradient(circle var(--R) at calc(var(--R) - 0.866*var(--R)) calc(var(--R)
- 0.5*var(--R)) ,var(--g1)),
radial-gradient(circle var(--R) at 0 var(--R)
,var(--g2)),
radial-gradient(circle var(--R) at calc(var(--R) - 0.866*var(--R)) calc(var(--R)
+ 0.5*var(--R)) ,var(--g1));
transform-origin:right;
animation:animate 3s linear infinite;
}
/*the same shape rotated*/
.box::after {
animation-delay:-1.5s;
}
@keyframes animate {
from {
transform:scale(-1,1) rotate(0deg);
}
to {
transform:scale(-1,1) rotate(-360deg);
}
}
Источник: @Temani Afif
Ответ 3
В моем варианте ответа конический градиент - это встроенное растровое изображение,
извлеченное путем вычисления максимального значения каждого пикселя в анимированном
GIF, приведённым автором вопроса.
Полупрозрачный черный pattern крыльев ветряной мельницы накладывается поверх него
и анимируется, а фильтр размытия избавляет от артефактов JPEG.
(Edit: добавлена отражающая подсветка, чтобы она выглядела немного более трехмерной)
Источник: @squeamish ossifrage
Комментариев нет:
Отправить комментарий