Когда я в это время посмотрел несколько дорам на Douban, я обнаружил, что анимация загрузки Douban довольно хороша. Поэтому я решил подражать этому и написать один.
Я пропускаюCSS3СотрудничатьSVGЧтобы завершить эту анимацию загрузки, имитирующую Дубана. Не используетсяSVGНе паникуйте, ниже я напишу соответствующие свойства, чтобы облегчить ваше понимание. Потому что это действительно очень просто. Итак, давайте сразу к делу
инициализировать svg
Нам нужно сначала выполнить статическое笑脸
Инициализировать размер представления SVG
<svg width="100" height="100"></svg>
Я указал ширину и высоту100pxПлощадь,width=”100”а такжеwidth=”100px”эквивалентны.
нарисовать рот
мы кладем嘴巴нарисуй его, вsvgнарисуй круг внутри
<circle class="mouth" cx="50" cy="50" r="14"></circle>
cxа такжеcyточка определения атрибутаxа такжеyкоординировать.
Видим, что в браузере есть закрашенная черная точка
Далее мы добавляем наш ротcssстиль
.mouth {
fill: none;
stroke: #00B51D;
stroke-width: 5;
stroke-linecap: round;
stroke-dasharray: 44, 44;
transform-origin: center; /* transform动画时以自身中心作为基点 */
}
соответствующее свойство
| css-свойство | иллюстрировать | здесь |
|---|---|---|
| fill | Цвет заливки | нет (без наполнения) |
| stroke | цвет контура | #00B51D |
| stroke-width | ширина контура | 5 |
| stroke-linecap | Формы на обоих концах открытого пути | round |
| stroke-dasharray | Создайте пунктирную линию | 44, 44 |
| transform-origin | Положение базовой точки повернутого элемента | центр (самоцентр) |
Сосредоточьтесь здесьstroke-dasharray, значение его свойства может бытьnone,<dasharray>а такжеinherit.
<dasharray>это<length>а также<percentage>Последовательность чисел, разделяйте числа запятыми или пробелами и указывайте длину дефисов и пробелов.
Когда параметр: На самом деле это означает длину пунктирной линии и расстояние между каждой пунктирной линией
Когда есть два или более параметра: один для длины и один для интервала
- stroke-dasharray = '10' означает: пунктирная линия длинная
10,интервал10, затем повторите пунктирную линию длинной10,интервал10 - stroke-dasharray = '10, 5' означает: длина пунктирной линии
10,интервал5, затем повторите пунктирную линию длинной10,интервал5 - stroke-dasharray = '20, 10, 5' означает: длина пунктирной линии
20,интервал10, пунктирная линия длинная5, за которым следует интервал20,пунктирная линия10,интервал5, а затем запустите цикл следующим образом
По формуле длины окружностиL=2πr, радиус окружностиr=14,такL=87.96452≈88, то длину пунктирной линии принимаем равной44,интервал44Нарисуйте пунктирную линию, которая составляет ровно половину окружности круга.
Видно, что наш嘴巴часть сделана
рисовать глаза
Далее приступайте к покраске眼睛, я нарисовал ещеcircle.
<circle class="eye" cx="50" cy="50" r="14"></circle>
мы все еще можем пройтиstroke-dasharrayнарисовать пару глаз
первый嘴巴Закомментируйте, чтобы не повлиять на нашу отладку.
Длина тире штрих-dasharray составляет0, вы можете получить无数个Пунктирный круг. Согласно формуле периметра круга выше, мы можем получить периметр как88, то каждый из нас1/4длина22, затем мы регулируем интервал до66. В это время вертикальное расстояние между двумя точками точно90度
Далее мы добавляем наши глазаcssстиль
.eye {
fill: none;
stroke: #00B51D;
stroke-width: 5;
stroke-linecap: round;
stroke-dasharray: 0, 66;
}
Чтобы выровнять рот, поворачиваем влево45度,ДатьeyeплюсtransformАтрибуты
transform-origin: center;
transform: rotate(-45deg);
Итак, мы закончили眼睛охватывать
добавить анимацию
После просмотра анимации загрузки Douban в замедленной съемке (кадр за кадром) бесчисленное количество раз, я наконец нашел закономерность (плачет).
анимация рта
Добавление анимационных эффектов, это также самый захватывающий шаг, давайте сначала посмотрим嘴巴часть
Через анимацию мы можем видеть嘴巴часть вращается两圈, и вращается第一圈, расстояние между двумя сторонами уменьшается до1/4,существует第二圈, интервал возвращается к1/2, а в конце есть абзац停留时间.
Согласно последнему абзацу停留时间а также旋转两圈
мы можем пройтиtransformготово, просто
@keyframes mounthAni {
80%, 100% {
transform: rotate(720deg);
}
}
第一圈Когда расстояние между двумя сторонами уменьшается до1/4, то есть в это времяstroke-dasharrayценность44, 22, а затем вернуться к1/2
@keyframes mounthAni {
40% {
stroke-dasharray: 44, 22; /* 间距改为1/4 */
}
80%, 100% {
stroke-dasharray: 44, 44; /* 间距恢复为1/2 */
transform: rotate(720deg);
}
}
Анимация работает со скоростьюНачните быстро, закончите медленно, поэтому мы используемease-outтак какЗначение функции кривой Безье
так嘴巴Анимация завершена
анимация глаз
Точно так же с помощью анимации мы можем видеть, что眼睛Детали также вращаются两圈, и вращается第一圈, расстояние между двумя сторонами увеличивается до7/8,существует第二圈, интервал возвращается к3/4, а в конце есть абзац停留时间.
@keyframes eyeAni {
40% {
stroke-dasharray: 0, 77; /* 间距改为7/8 */
}
80%, 100% {
transform: rotate(675deg); /* 间距恢复为3/4 */
stroke-dasharray: 0, 66;
}
}
Анимация работает со скоростьюначать и закончить медленно, поэтому мы используемease-in-outтак какЗначение функции кривой Безье
Пока наш眼睛Анимация закончена
Мы объединили две анимации, чтобы завершить анимацию загрузки, имитирующую Douban, что очень просто.
исходный код
html
<svg width="100" height="100">
<circle class="mouth" cx="50" cy="50" r="14"></circle>
<circle class="eye" cx="50" cy="50" r="14"></circle>
</svg>
css
.mouth {
fill: none;
stroke: #00B51D;
stroke-width: 5;
stroke-linecap: round;
stroke-dasharray: 44, 44;
transform-origin: center; /* transform动画时以自身中心作为基点 */
animation: mounthAni 2.3s ease-out infinite;
}
.eye {
fill: none;
stroke: #00B51D;
stroke-width: 5;
stroke-linecap: round;
stroke-dasharray: 0, 66;
transform-origin: center;
transform: rotate(-45deg);
animation: eyeAni 2.3s ease-in-out infinite;
}
@keyframes mounthAni {
40% {
stroke-dasharray: 44, 22; /* 间距改为1/4 */
}
80%, 100% {
stroke-dasharray: 44, 44; /* 间距恢复为1/2 */
transform: rotate(720deg);
}
}
@keyframes eyeAni {
40% {
stroke-dasharray: 0, 77; /* 间距改为7/8 */
}
80%, 100% {
transform: rotate(675deg); /* 间距恢复为3/4 */
stroke-dasharray: 0, 66;
}
}
Суммировать
CSS3Анимация достаточно мощная, но если вы хотите добиться того же интервала, что и выше, вы можете变大变小анимационные эффекты, используйте толькоCSSЯ так и не понял как это реализовать.Если есть способ,прокомментируйте и расскажите 😀,поэтому я им воспользовалсяSVGДобавитьCSSЧтобы сделать,眼睛Некоторые изначально думали об использованииanimateMotionТолько что закончила, но после долгого прочтения до сих пор не могу им пользоваться🤣, поэтому думала пользоваться только имCSSАнимационный эффект завершил эту анимацию, я не ожидал, что она окажется неожиданно простой, поэтому хочу поделиться с вами методом. Вся анимация загрузки вращается вокругstroke-dasharrayрасширять, использоватьSVGАтрибуты — это действительно верхушка айсберга. Если в приведенном выше содержании есть какие-либо ошибки, я надеюсь, что вы можете дать мне дополнительный совет.