Анимация на ванильном js
Всех приветствую, сегодня хочу рассказать как я сделал первую в своей жизни анимацию на javascript. Думаю можно начинать без лишних слов
Теория
Наша анимация будет работать при помощи интервального вызова одной функции, которая в свою очередь задает новый класс для hr полоски.
Кстати, анимация у нас будет накладываться на hr, расположенный под блоком меню.
Практика
Сейчас я покажу вам верстку, стили и js файл моего меню. Начнем мы с верстки и думаю здесь рассказывать нечего
<nav class="menu" id="menu"> <ul> <li><div class="logo"><a href="/"> <ul> <h1><span class="prog">Prog</span><span class="way">Way</span></h1> </ul></a> </div></li> <li><a onmouseover="animation('soft', 'over')" onmouseout="animation('soft', 'out')" class="amenu" href="/soft">Софт</a><hr class="step0" id="soft"></li> <li><a onmouseover="animation('quizs', 'over')" onmouseout="animation('quizs', 'out')" class="amenu" href="/quizs">Задачи</a><hr class="step0" id="quizs"></li> <li><a onmouseover="animation('posts', 'over')" onmouseout="animation('posts', 'out')" class="amenu" href="/posts">Статьи</a><hr class="step0" id="posts"></li> </ul> </nav>
Теперь рассмотрим стили
.menu { display: block; width: 100%; padding-bottom: 0; box-shadow: 0px 15px 5px 10px #272933; } ul { list-style: none; margin: 0% 0%; } .menu li { padding-top: 1em; width: 100%; text-align: center; } .menu ul { display: flex; background: #18171c; padding-left: 15%; padding-right: 15%; height: 100%; } .menu a { height: 100%; display: block; color: white; font-weight: bold; background: #18171c; text-decoration: none; font-size: 18px; } .menu li { width: 15%; padding-left: 4.3%; height: 100%; text-align: center; vertical-align: middle; } .amenu { padding-top: 4%; font-family: 'Didact Gothic', sans-serif; } .prog { color: white; font-size: 25px; } .way { color: #9966cc; font-size: 25px; } .step0 { width: 0%; } .step1 { width: 10%; } .step2 { width: 20%; } .step3 { width: 30%; } .step4 { width: 40%; } .step5 { width: 50%; } .step6 { width: 60%; } .step7 { width: 70%; } .step8 { width: 80%; } .step9 { width: 90%; } .step10 { width: 100%; }
А сейчас самое интересное... JAVASCRIPT код, но перед этим предлагаю подробнее рассмотреть верстку отдельного элемента меню
<li><a onmouseover="animation('soft', 'over')" onmouseout="animation('soft', 'out')" class="amenu" href="/soft">Софт</a><hr class="step0" id="soft"></li>
Элементу <a> мы задаем функцию animation в аргументы onmouseover и onmouseout. А функция в свою очередь принимает id hr-а( будет нужен для выбора определенного hr ) и over/out( это будет влиять на одно из условий в функции )
Элементу <hr> мы изначально задаем класс step0 и id, в моем случае это "soft".
Теперь перейдем в javascript-файл и изучим код функции
var timerover; var timerout; function animation(id, where) { var hr = document.getElementById(id) if (where == "over"){ clearInterval(timerout) timerover = setInterval(morewidth, 20); function morewidth(){ var classnow = hr.className if (classnow == "step0"){ hr.className = "step1" } else if (classnow == "step1"){ hr.className = "step2" } else if (classnow == "step2"){ hr.className = "step3" } else if (classnow == "step3"){ hr.className = "step4" } else if (classnow == "step4"){ hr.className = "step5" } else if (classnow == "step5"){ hr.className = "step6" } else if (classnow == "step6"){ hr.className = "step7" } else if (classnow == "step7"){ hr.className = "step8" } else if (classnow == "step8"){ hr.className = "step9" } else if (classnow == "step9"){ hr.className = "step10" clearInterval(timerover) } } } else if (where == "out") { clearInterval(timerover) timerout = setInterval(lesswidth, 20); function lesswidth(){ var classnow = hr.className if (classnow == "step10"){ hr.className = "step9" } else if (classnow == "step9"){ hr.className = "step8" } else if (classnow == "step8"){ hr.className = "step7" } else if (classnow == "step7"){ hr.className = "step6" } else if (classnow == "step6"){ hr.className = "step5" } else if (classnow == "step5"){ hr.className = "step4" } else if (classnow == "step4"){ hr.className = "step3" } else if (classnow == "step3"){ hr.className = "step2" } else if (classnow == "step2"){ hr.className = "step1" } else if (classnow == "step1"){ hr.className = "step0" clearInterval(timerout) } } } }
Давайте по порядку:
- В самом начале мы создаем 2 переменных: timerover и timerout. Они нам нужны для начала и завершения интервалов.
- Потом уже в теле функции мы задаем проверку на аргумент "where"( предлагаю изучить первое ответвление, так как второе почти полностью индентично )
- Здесь мы отчищаем timerout и запусткаем интервал timerover. В аргумент интервала передаем функцию( в данном случае morewidth, и частоту запуска 20мс )
- Теперь приступим к функции morewidth. Тут мы получаем класс hr на данный момент и проверяем его. При выполнении условия мы меняем его класс, тем самым увеличивая width элемента на 10%. И если доходим до step10 отчищаем интервал.
ВАЖНО
Не забывайте чистить интервал, иначе две функции буду противодействовать друг другу.
Итог
Это один из вариантов реализации анимации, я показал как это сделать именно на ванильном javascript`е. А что у нас получилось можете посмотреть в моем телеграм канале.
На сегодня все,
Удачи, программисты!