@kunjut19

Как правильно переписать этот toggle из jQuery в чистый JS?

Написал навигацию с помощью tailwindcss. Но резкое раскрытие меню на маленьких экранах мне не нравится - хочу, чтобы меню плавно выплывало. Нашел готовое решение, которое мне подходит. Но оно с использованием jQuery, который я не хочу использовать. А переписать на чистый JS своими силами не получается (а именно я не понимаю, каким образом height: "toggle" влияет на <div class="hidden">). Поэтому прошу у вас помощи! Как должен выглядеть этот jQuery скрипт на чистом JS?

<nav class="flex items-center bg-gray-800 p-3 flex-wrap">
  <a href="#" class="p-2 mr-4 inline-flex items-center">
    <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="fill-current text-white h-8 w-8 mr-2">
      <path
        d="M12.001 4.8c-3.2 0-5.2 1.6-6 4.8 1.2-1.6 2.6-2.2 4.2-1.8.913.228 1.565.89 2.288 1.624C13.666 10.618 15.027 12 18.001 12c3.2 0 5.2-1.6 6-4.8-1.2 1.6-2.6 2.2-4.2 1.8-.913-.228-1.565-.89-2.288-1.624C16.337 6.182 14.976 4.8 12.001 4.8zm-6 7.2c-3.2 0-5.2 1.6-6 4.8 1.2-1.6 2.6-2.2 4.2-1.8.913.228 1.565.89 2.288 1.624 1.177 1.194 2.538 2.576 5.512 2.576 3.2 0 5.2-1.6 6-4.8-1.2 1.6-2.6 2.2-4.2 1.8-.913-.228-1.565-.89-2.288-1.624C10.337 13.382 8.976 12 6.001 12z" />
    </svg>
    <span class="text-xl text-white font-bold uppercase tracking-wide">Talwind CSS</span>
  </a>
  <button class="text-white inline-flex p-3 hover:bg-gray-900 rounded lg:hidden ml-auto hover:text-white outline-none nav-toggler" data-target="#navigation">
    <i class="material-icons">menu</i>
  </button>
  <div class="hidden top-navbar w-full lg:inline-flex lg:flex-grow lg:w-auto" id="navigation">
    <div class="lg:inline-flex lg:flex-row lg:ml-auto lg:w-auto w-full lg:items-center items-start  flex flex-col lg:h-auto">
      <a href="#" class="lg:inline-flex lg:w-auto w-full px-3 py-2 rounded text-gray-400 items-center justify-center hover:bg-gray-900 hover:text-white">
        <span>Home</span>
      </a>
      <a href="#" class="lg:inline-flex lg:w-auto w-full px-3 py-2 rounded text-gray-400 items-center justify-center hover:bg-gray-900 hover:text-white">
        <span>About</span>
      </a>
      <a href="#" class="lg:inline-flex lg:w-auto w-full px-3 py-2 rounded text-gray-400 items-center justify-center hover:bg-gray-900 hover:text-white">
        <span>Services</span>
      </a>
      <a href="#" class="lg:inline-flex lg:w-auto w-full px-3 py-2 rounded text-gray-400 items-center justify-center hover:bg-gray-900 hover:text-white">
        <span>Gallery</span>
      </a>
      <a href="#" class="lg:inline-flex lg:w-auto w-full px-3 py-2 rounded text-gray-400 items-center justify-center hover:bg-gray-900 hover:text-white">
        <span>Products</span>
      </a>
      <a href="#" class="lg:inline-flex lg:w-auto w-full px-3 py-2 rounded text-gray-400 items-center justify-center hover:bg-gray-900 hover:text-white">
        <span>Contact Us</span>
      </a>
    </div>
  </div>
</nav>


<script>
  $(document).ready(function() {
    $(".nav-toggler").each(function(_, navToggler) {
      var target = $(navToggler).data("target");
      $(navToggler).on("click", function() {
        $(target).animate({
          height: "toggle"
        });
      });
    });
  });
</script>


P.S. код взят отсюда
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 1
arrakisfremen
@arrakisfremen
Фуллстек разработчик
В jQuery в функции animate значение 'toggle' для height — это всего лишь предопределённая в jQuery строка, как, например, 'show' и 'hide'. Когда функция animate получает такую, известную ей, строку вместо числового значения, она начинает вести себя по заданному алгоритму. В случае с 'toggle' этот алгоритм будет по таймеру уменьшать с некоторым шагом значение height от 100% до нуля, а потом увеличивать обратно от нуля до 100%. Соотственно, чтобы реализовать аналогичное поведение без jQuery, нужно запустить функцию setTimeout и в ней манипулировать значением height в нужном элементе. Ну и с интервалом, и шагом изменения поэкспериментировать прийдётся.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы