Javascript 30 - Gün 26

22 Mayıs 2023

Projenin demosu : Demo

Başlangıç dosyalarını bulabileceğiniz repom: js-30 | github

Amaç

Javascript ile 22. günde geliştirdiğimize benzer bir mantıkla çalışan açılır bir menü yapacağız.

Çözüm

<!DOCTYPE html>
<html lang="en">
 
<head>
<meta charset="UTF-8">
<title>Follow Along Nav</title>
<link rel="icon" href="https://fav.farm/✅" />
</head>
 
<body>
<h2>Cool</h2>
<nav class="top">
  <!-- beyaz arka plana sahip olan divimiz bu -->
  <div class="dropdownBackground">
    <span class="arrow"></span>
  </div>
 
  <ul class="cool">
    <!-- li elementlerinin üzerine gelindiğinde dropdown sınıfına sahip içerik gösterilmeye başlanacak -->
    <li>
      <a href="#">About Me</a>
      <div class="dropdown dropdown1">
        <div class="bio">
          <img src="https://logo.clearbit.com/wesbos.com">
          <p>Wes Bos sure does love web development. He teaches things like JavaScript, CSS and BBQ. Wait. BBQ isn't
            part of web development. It should be though!</p>
        </div>
      </div>
    </li>
    <li>
      <a href="#">Courses</a>
      <ul class="dropdown courses">
        <li>
          <span class="code">RFB</span>
          <a href="https://ReactForBeginners.com">React For Beginners</a>
        </li>
        <li>
          <span class="code">ES6</span>
          <a href="https://ES6.io">ES6 For Everyone</a>
        </li>
        <li>
          <span class="code">NODE</span>
          <a href="https://LearnNode.com">Learn Node</a>
        </li>
        <li>
          <span class="code">STPU</span>
          <a href="https://SublimeTextBook.com">Sublime Text Power User</a>
        </li>
        <li>
          <span class="code">WTF</span>
          <a href="http://Flexbox.io">What The Flexbox?!</a>
        </li>
        <li>
          <span class="code">GRID</span>
          <a href="https://CSSGrid.io">CSS Grid</a>
        </li>
        <li>
          <span class="code">LRX</span>
          <a href="http://LearnRedux.com">Learn Redux</a>
        </li>
        <li>
          <span class="code">CLPU</span>
          <a href="http://CommandLinePowerUser.com">Command Line Power User</a>
        </li>
        <li>
          <span class="code">MMD</span>
          <a href="http://MasteringMarkdown.com">Mastering Markdown</a>
        </li>
      </ul>
    </li>
    <li>
      <a href="#">Other Links</a>
      <ul class="dropdown dropdown3">
        <li><a class="button" href="http://twitter.com/wesbos">Twitter</a></li>
        <li><a class="button" href="http://facebook.com/wesbos.developer">Facebook</a></li>
        <li><a class="button" href="http://wesbos.com">Blog</a></li>
        <li><a class="button" href="http://wesbos.com/courses">Course Catalog</a></li>
      </ul>
    </li>
  </ul>
</nav>
 
<style>
 /* Menünün çalışması için gereken stiller... */
</style>
 
<script>
  // cool sınıfına sahip elementlerin ilk üyelerini seçelim
  const triggers = document.querySelectorAll('.cool > li');
  const background = document.querySelector('.dropdownBackground')
  const nav = document.querySelector('.top')
 
  // fare ile üzerine gelindiğinde background adlı divimiz uygun yere taşınacak ve görünür hale getirilecektir
  function handleEnter() {
    this.classList.add('trigger-enter')
    setTimeout(() => {
      if (this.classList.contains('trigger-enter')) {
        this.classList.add('trigger-enter-active')
      }
 
    }, 150)
    background.classList.add('open')
 
    const dropdown = this.querySelector('.dropdown')
    const dropdownCoords = dropdown.getBoundingClientRect()
    const navCoords = nav.getBoundingClientRect()
 
    const coords = {
      height: dropdownCoords.height,
      width: dropdownCoords.width,
      top: dropdownCoords.top - navCoords.top,
      left: dropdownCoords.left - navCoords.left
    }
 
    background.style.setProperty('width', `${coords.width}px`)
    background.style.setProperty('height', `${coords.height}px`)
    background.style.setProperty('transform', `translate(${coords.left}px,${coords.top}px)`)
  }
 
  // fare ayrıldığında ise hem açılır menünün içerisindeki içerik hem de beyaz arkaplana sahip element gizlenecektir
  function handleLeave() {
    this.classList.remove('trigger-enter', 'trigger-enter-active')
    background.classList.remove('open')
  }
 
  triggers.forEach(trigger => trigger.addEventListener('mouseenter', handleEnter))
  triggers.forEach(trigger => trigger.addEventListener('mouseleave', handleLeave))
</script>
</body>
</html>
GitHubBu sayfayı düzenle