Я пытаюсь создать оверлей с вращающейся загрузкой, как в ролевых играх, для навыков персонажа. Вот пример из WoW (мне нужно именно так);
Это моя попытка (оказалось, что мои навыки CSS не так сильны) - как вы можете видеть, она выглядит странно.
Любые идеи о том, как это сделать, спасибо!
Источник в ClojureScript, но я думаю, это не должно быть проблемой;
(def skill-keyframes-opa
((keyframes (j/lit {"0%" {:opacity "1"}
"50%, 100%" {:opacity "0"}}))))
(def skill-loading-wrapper
(css (j/lit {:background :white
:opacity 0.5
:z-index 1
:width 45
:height 45
:position :relative
:top 2
:left 2})))
(def skill-loading-pie
(css (j/lit {:width "50%"
:height "100%"
:position :absolute
:transform-origin "100% 50%"
:background :grey
:border "10px solid rgba (0, 0, 0, 0.4)"})))
(defn- skill-loading-spinner [duration]
((css (j/lit {:border-radius "100% 0 0 100% / 50% 0 0 50%"
:z-index 200
:border-right :none
:animation (str skill-keyframes-rota " " duration "s linear infinite")}))))
(defn- skill-loading-filler [duration]
((css (j/lit {:border-radius "0 100% 100% 0 / 0 50% 50% 0"
:z-index 100
:border-left :none
:animation (str skill-keyframes-opa " " duration "s steps(1, end) infinite reverse")
:left "50%"
:opacity 0}))))
(defn skill-loading-mask [duration]
((css (j/lit {:width "50%"
:height "100%"
:position :absolute
:z-index 300
:opacity 1
:background :inherit
:animation (str skill-keyframes-opa " " duration "s steps(1, end) infinite")}))))
(defn use-skill [duration]
[:div {:class (skill-loading-wrapper)}
[:div {:class [(skill-loading-pie) (skill-loading-spinner duration)]}]
[:div {:class [(skill-loading-pie) (skill-loading-filler duration)]}]
[:div {:class (skill-loading-mask duration)}]])
@FiddlingAway опубликовано



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вероятно, вы захотите сделать наложение слева темным, а не светлым. Странность, вероятно, возникает из-за того, что более светлое наложение на самом деле находится «поверх» более темного значка.
Если вы вместо этого используете темное (или даже черное) наложение, оно будет более точно соответствовать примеру.
Источники:
Анимация @property должна быть заменена анимацией style.setProperty('--cooldown', '23.4%') js, поскольку значения js являются источником правды.
.cooldown {
/* set via style.setProperty('--cooldown', '23.4%') in js */
--cooldown: 50%;
background: conic-gradient(
transparent 0,
transparent var(--cooldown),
rgba(0, 0, 0, 0.5) var(--cooldown),
rgba(0, 0, 0, 0.5)
);
animation: cooldown 1s linear infinite;
}
/* makes --cooldown animateable for css animations */
@property --cooldown {
syntax: "<percentage>";
inherits: false;
initial-value: 0%;
}
@keyframes cooldown {
0% { --cooldown: 0%; }
100% { --cooldown: 100%; }
}
/* makes children be over each other */
.childs-overlayed {
height: 100px;
width: 100px;
border: 2px solid black;
display: grid;
grid-template-areas: "only";
}
.childs-overlayed > * {
grid-area: only;
height: 100%;
width: 100%;
}<div class = "childs-overlayed">
<img src = "https://via.placeholder.com/100">
<div class = "cooldown"></div>
</div>Вы можете упростить background: conic-gradient(transparent var(--cooldown), rgba(0, 0, 0, 0.5) var(--cooldown));
Можете ли вы опубликовать свой код?