Ответ 1
Я думаю, что в вашей настройке есть 2 небольших ошибки.
Во-первых, расстояние между вашими точками является суммой двух параметров для массива штрихового штриха. Поскольку первый параметр всегда равен 0,001, второй должен быть результатом вашей формулы минус 0,001.
Во-вторых, вы размещаете 36 точек вокруг круга. Это дает 10 градусов для угла от точки к точке. Таким образом, ваши анимации должны быть конкретными 10deg, 20deg, 30deg для серии, а не 15deg 30deg 45deg... Это создает прыжок на 5 градусов в конце каждого цикла.
Я думаю, что у меня это более или менее работающее
fiddle
Была также проблема с начальным вращением; Я надеюсь, что теперь это то, что вы хотели.
А также был какой-то округленный из-за небольшого размера svg; установка его на 600 квадратных работает намного лучше.
Я также добавил строку на 10 град, чтобы проверить правильность выравнивания точек.
CSS
body {
background: black;
padding: 0;
margin: 0;
}
circle {
fill: none;
stroke-width: 10;
stroke-linecap: round;
}
circle { -webkit-transform-origin: center center; -moz-transform-origin: center center; transform-origin: center center;
-webkit-animation-duration: 3s;
-webkit-animation-timing-function: ease-in-out;
-webkit-animation-iteration-count: infinite;}
circle:nth-child(2) { -webkit-animation-name:second;
-moz-animation:second 3s ease-in-out infinite;
animation:second 3s ease-in-out infinite;}
circle:nth-child(3) { -webkit-animation-name:third; -moz-animation:third 3s ease-in-out infinite; animation:third 3s ease-in-out infinite; }
circle:nth-child(4) { -webkit-animation-name:fourth; -moz-animation:fourth 3s ease-in-out infinite; animation:fourth 3s ease-in-out infinite; }
circle:nth-child(5) { -webkit-animation-name:fifth; -moz-animation:fifth 3s ease-in-out infinite; animation:fifth 3s ease-in-out infinite; }
circle:nth-child(6) { -webkit-animation-name:sixth; -moz-animation:sixth 3s ease-in-out infinite; animation:sixth 3s ease-in-out infinite; }
circle:nth-child(7) { -webkit-animation-name:seventh; -moz-animation:seventh 3s ease-in-out infinite; animation:seventh 3s ease-in-out infinite; }
circle:nth-child(8) { -webkit-animation-name:eighth; -moz-animation:eighth 3s ease-in-out infinite; animation:eighth 3s ease-in-out infinite; }
circle:nth-child(9) { -webkit-animation-name:ninth; -moz-animation:ninth 3s ease-in-out infinite; animation:ninth 3s ease-in-out infinite; }
circle:nth-child(10) {
-webkit-animation-name:tenth;
-moz-animation:tenth 3s ease-in-out infinite;
animation:tenth 3s ease-in-out infinite;
-webkit-transform: rotate(10deg);}
@-webkit-keyframes second { 0% { -webkit-transform:rotate(5deg) }
100% { -webkit-transform:rotate(15deg) } }
@-webkit-keyframes third { 100% { -webkit-transform:rotate(20deg) } }
@-webkit-keyframes fourth { 0% { -webkit-transform:rotate(5deg) }
100% { -webkit-transform:rotate(35deg) } }
@-webkit-keyframes fifth { 100% { -webkit-transform:rotate(40deg) } }
@-webkit-keyframes sixth { 0% { -webkit-transform:rotate(5deg) }
100% { -webkit-transform:rotate(55deg) } }
@-webkit-keyframes seventh {100% { -webkit-transform:rotate(60deg) } }
@-webkit-keyframes eighth { 0% { -webkit-transform:rotate(5deg) }
100% { -webkit-transform:rotate(75deg) } }
@-webkit-keyframes ninth { 0% { -webkit-transform:rotate(0deg) }
100% { -webkit-transform:rotate(80deg) } }
@-webkit-keyframes tenth { 0% { -webkit-transform:rotate(5deg) }
100% { -webkit-transform:rotate(95deg) } }
@-moz-keyframes second { 0% { -moz-transform:rotate(5deg) }
100% { -moz-transform:rotate(15deg) } }
@-moz-keyframes third { 100% { -moz-transform:rotate(20deg) } }
@-moz-keyframes fourth { 0% { -moz-transform:rotate(5deg) }
100% { -moz-transform:rotate(35deg) } }
@-moz-keyframes fifth { 100% { -moz-transform:rotate(40deg) } }
@-moz-keyframes sixth { 0% { -moz-transform:rotate(5deg) }
100% { -moz-transform:rotate(55deg) } }
@-moz-keyframes seventh { 100% { -moz-transform:rotate(60deg) } }
@-moz-keyframes eighth { 0% { -moz-transform:rotate(5deg) }
100% { -moz-transform:rotate(75deg) } }
@-moz-keyframes ninth { 100% { -moz-transform:rotate(80deg) } }
@-moz-keyframes tenth { 0% { -moz-transform:rotate(5deg) }
100% { -moz-transform:rotate(95deg) } }
line {
stroke-width: 1;
-webkit-transform-origin: left center;
-webkit-transform: rotate(-10deg);
}
И также немного оптимизировал стили
Хорошо, после большого количества времени, проведенного с этой проблемой, я почти уверен, что есть какая-то ошибка в виде округления/точности.
Я полностью изменил идею, чтобы избежать этой проблемы. Цель состоит в том, чтобы круги делали полные круги до окончания анимации, так что начало и конец анимации всегда синхронизированы.
Поскольку это создает огромный стиль ключевых кадров, я хочу его повторно использовать; для этого я сгруппировал круги вложенным образом; и применили анимацию к каждой группе:
HTML
<svg viewBox="0 0 60 60">
<g class="g">
<circle cx="30" cy="30" r="10" stroke-dasharray="0.001, 1.745" stroke="hsl(120, 100%, 50%)"/>
<g class="g">
<circle cx="30" cy="30" r="12" stroke-dasharray="0.001, 2.094" stroke="hsl(108, 100%, 50%)" class="c2"/>
<g class="g">
<circle cx="30" cy="30" r="14" stroke-dasharray="0.001, 2.443" stroke="hsl(96, 100%, 50%)"/>
<g class="g">
<circle cx="30" cy="30" r="16" stroke-dasharray="0.001, 2.793" stroke="hsl(84, 100%, 50%)" class="c2"/>
<g class="g">
<circle cx="30" cy="30" r="18" stroke-dasharray="0.001, 3.142" stroke="hsl(72, 100%, 50%)"/>
<g class="g">
<circle cx="30" cy="30" r="20" stroke-dasharray="0.001, 3.491" stroke="hsl(60, 100%, 50%)" class="c2"/>
<g class="g">
<circle cx="30" cy="30" r="22" stroke-dasharray="0.001, 3.840" stroke="hsl(48, 100%, 50%)"/>
<g class="g">
<circle cx="30" cy="30" r="24" stroke-dasharray="0.001, 4.189" stroke="hsl(36, 100%, 50%)" class="c2"/>
<g class="g">
<circle cx="30" cy="30" r="26" stroke-dasharray="0.001, 4.538" stroke="hsl(24, 100%, 50%)"/>
<g class="g">
<circle cx="30" cy="30" r="28" stroke-dasharray="0.001, 4.887" stroke="hsl(12, 100%, 50%)" class="c2"/>
</g></g></g></g></g></g></g></g></g></g>
</svg>
(да, вернемся к низкому разрешению!)
CSS
body {
background: black;
padding: 0;
margin: 0;
}
circle {
fill: none;
stroke-width: 1;
stroke-linecap: round;
}
.g {
-webkit-transform-origin: center center; -moz-transform-origin: center center; transform-origin: center center;
-webkit-animation-duration: 108s;
-webkit-animation-timing-function: ease-in-out;
-webkit-animation-iteration-count: infinite;
-webkit-animation-name: anim;
-moz-animation:second 3s ease-in-out infinite;
animation:second 3s ease-in-out infinite;}
.c2 {
-webkit-transform-origin: center center;
-webkit-transform: rotate(5deg);
}
@-webkit-keyframes anim { 0% { -webkit-transform:rotate(0deg)}
2.778% { -webkit-transform:rotate(10deg)}
5.56% { -webkit-transform:rotate(20deg)}
8.33% { -webkit-transform:rotate(30deg)}
11.11% { -webkit-transform:rotate(40deg)}
13.89% { -webkit-transform:rotate(50deg)}
16.67% { -webkit-transform:rotate(60deg)}
19.44% { -webkit-transform:rotate(70deg)}
22.22% { -webkit-transform:rotate(80deg)}
25% { -webkit-transform:rotate(90deg)}
27.78% { -webkit-transform:rotate(100deg)}
30.56% { -webkit-transform:rotate(110deg)}
33.33% { -webkit-transform:rotate(120deg)}
36.11% { -webkit-transform:rotate(130deg)}
38.89% { -webkit-transform:rotate(140deg)}
41.67% { -webkit-transform:rotate(150deg)}
44.44% { -webkit-transform:rotate(160deg)}
47.22% { -webkit-transform:rotate(170deg)}
50% { -webkit-transform:rotate(180deg)}
52.78% { -webkit-transform:rotate(190deg)}
55.56% { -webkit-transform:rotate(200deg)}
58.33% { -webkit-transform:rotate(210deg)}
61.11% { -webkit-transform:rotate(220deg)}
63.89% { -webkit-transform:rotate(230deg)}
66.67% { -webkit-transform:rotate(240deg)}
69.44% { -webkit-transform:rotate(250deg)}
72.22% { -webkit-transform:rotate(260deg)}
75% { -webkit-transform:rotate(270deg)}
77.78% { -webkit-transform:rotate(280deg)}
80.56% { -webkit-transform:rotate(290deg)}
83.33% { -webkit-transform:rotate(300deg)}
86.11% { -webkit-transform:rotate(310deg)}
88.89% { -webkit-transform:rotate(320deg)}
91.67% { -webkit-transform:rotate(330deg)}
94.44% { -webkit-transform:rotate(340deg)}
97.22% { -webkit-transform:rotate(350deg)}
100% { -webkit-transform:rotate(360deg)}
}
И новая демонстрация (Извините, только webkit)
Это моя попытка исследовать ошибки. Я изменил систему, вместо анимации, у меня есть два набора кругов, один по цвету и другой по черному над ним, и повернутый на 10 град. Цветные круги не должны отображаться; смещение является мерой ошибки. (возможно, вам нужно прокрутить, чтобы увидеть круги