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>