Javascript 30 - Gün 5

24 Mart 2023

Bugün CSS flex kullanarak bir resim galerisi yapacağız.

Projenin demosu : Demo

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

1. Flex ile galeriyi oluşturalım

Başlangıçta site aşağıdaki gibi duruyor. Başlangıç

Resimlerin yanyana gelmesini sağlamak için .panels containerını flex yapalım.

.panels {
  min-height: 100vh;
  overflow: hidden;
  display: flex;
}

Resimler yanyana geldi ancak genişliğin tamamı kullanılmıyor, kullanılması için flex'in içindeki elemanların sahip olduğu .panel class'ına flex:1 özelliğini ekleyelim.

.panel {
  /* .... */
  flex: 1;
}

.panel içindeki yazıların alt alta sıralanması ve dikeyde ortalanması için aşağıdaki değişiklikleri yapalım.

.panel > * {
  margin: 0;
  width: 100%;
  transition: transform 0.5s;
  /* yazıları yanyana alır */
  display: flex;
  /* yazıları ortalar */
  justify-content: center;
  align-items: center;
  flex: 1 0 auto;
}

Şimdi her paneldeki ilk ve son metinleri (örneğin ilk panel için "Hey" ve "Dance!" metinlerini) başlangıçta gizlemek ve yalnızca .open-active classına sahip olduklarında göstermek için aşağıdaki değişiklikleri yapalım.

/* panellerdeki ilk ve son metinleri gizle ve göster */
.panel > *:first-child {
  transform: translateY(-100%);
}
 
.panel.open-active > *:first-child {
  transform: translateY(0);
}
 
.panel > *:last-child {
  transform: translateY(100%);
}
 
.panel.open-active > *:last-child {
  transform: translateY(0);
}

Artık yalnızca .open-active classına sahip panellerde yazılar görünecektir.

Son olarak .open class'ına sahip panellerin genişliğini flex ile büyütelim.

.panel.open {
  flex: 5;
  font-size: 40px;
}

2. Javascript ile panellere tıklandığında gerekli sınıfları ekleyelim

Javascript tarafında .panel class'ına sahip tüm elementleri seçelim ve bunlara tıklandığında ".open" classını ekleyelim. Ayrıca 2.Gün'de gördüğümüz transitionend olayında da ".open-active" class'ını ekleyerek yazıların görünmesini sağlayalım.

<script>
const panels = document.querySelectorAll(".panel");
 
function toggleOpen() {
  this.classList.toggle("open");
}
function toggleActive(e) {
  console.log(e.propertyName);
  if (e.propertyName.includes("flex")) {
    this.classList.toggle("open-active");
  }
}
 
panels.forEach((panel) => panel.addEventListener("click", toggleOpen));
panels.forEach((panel) =>
  panel.addEventListener("transitionend", toggleActive)
);
</script>

Bu projeden öğrendiklerim

  • flex:1 ile flex elemanlarının mevcut genişliğin tamamını kullanılması sağlanabilir.
  • toggle ile elementteki bir classı ekleyip/silebiliriz.
  • transitionend eventinde 'transition'a uğrayan özelliğin flex olduğunu anlamak için e.propertyName kullanılabilir.
GitHubBu sayfayı düzenle