자바스크립트 주요기능 구현하기(3): Snackbar, Accordian, Slide
github커밋

animation-fill-mode:forwards: 애니메이션 동작 완료 후 마지막 to 유지하기@keyframes로 fadeIn, fadeOut 만들어주었다. 하나의 @keyframe에서 from, to로 같은 효과 만들 수 있을지 생각해봤는데 나타나서 해당 자리에 멈춰서서 보이는 부분을 만드려면 더 많은 keyframe가 필요할 것 같았다.animation-delay#snackbar.show {
    visibility: visible;
    opacity: 1;
    animation: fadeIn 0.5s , fadeOut 0.5s 2.5s forwards;
}
setTimeout()을 이용해 일정 시간이 지나면 클래스를 삭제해 보이지 않도록 만들어주었다.function snackBarFunc() {
    var snackBar = document.getElementById('snackbar');
    snackBar.classList.add('show');
    // 시간을 2.5초보다 긴 3.5초 전달
    setTimeout(function() {
        snackBar.classList.remove('show');
    }, 3500);
};
<button type="button" onclick="snackBarFunc()">Show</button>
var btnShow = document.querySelector('button');
btnShow.addEventListener('click', snackBarFunc);

max-height: 0: 이전 snackbar에선 opacity:0을 사용해 안 보이게 만들었다면, 이번엔 최대 높이값을 조정하여 영역이 자리를 차지하지 않고 안 보이도록 만들었다..panel {
    max-height: 0;
    transition: max-height 0.2s linear;
}
toggle() 사용해 클래스 있으면 삭제하고 없으면 추가nextElementSibling: 현재 선택된 태그 바로 다음 형제 태그scrollHeight: 현재 태그 높이값 확인  (스크롤바 없는 전체 높이값)btns.forEach(function(btn) {
    btn.addEventListener('click', function() {
        this.classList.toggle('active');
        var panel = this.nextElementSibling;
        panel.style.maxHeight = (panel.style.maxHeight) 
          ? null : panel.scrollHeight + 'px';
    });
});

e.target을 기억해내서 사용했다.current.length>0 && current[0]!==e.target// 최종
btns.forEach(function(btn) {
    btn.addEventListener('click', showOnlyOne);
});
function showOnlyOne (e) {
    var current = document.querySelectorAll('.accordian.active');
    if(current.length>0 && current[0]!==e.target) {
        current[0].classList.remove('active');
        current[0].nextElementSibling.style.maxHeight = null;
        console.log(current[0].classList);
    }
    togglePanel(e);
};
function togglePanel (e) {
    e.target.classList.toggle('active');
    var panel = e.target.nextElementSibling;
    panel.style.maxHeight = (panel.style.maxHeight) ? null : panel.scrollHeight + 'px';
};

var currentSlide = document.querySelector('.item.show');
if(currentSlide) {
  // 보여지는 슬라이드 있으면 삭제하기
} else {
  // 없으면 첫 슬라이드 보여주기
}
if(currentSlide) {
  // 보여지는 슬라이드 있으면 삭제
  if(nextSlide) {
    // 다음 슬라이드 있으면 보여주기
  } else {
    // 다음 슬라이드 없으면 첫 슬라이드 보여주기
  }
} else {
  // 없으면 첫 슬라이드 보여주기
}
setInterval(콜백함수, 시간간격): 일정 시간 간격을 두고 함수를 무한 반복 실행. 함수를 변수에 담아 clearInterval에 인자로 넘겨주면 특정 시간 뒤 멈추기 가능setTimeout(콜백함수, 딜레이): 일정 시간이 지난 후에 함수를 한 번 실행. 반복하려면 내부에서 자신 호출 필요// 1초마다 한 번씩 슬라이드 변경되다가 5초 지나면 정지하고 end 출력
let doSlide = setInterval(slide, 1000);
setTimeout(function() {
    clearInterval(doSlide);
    document.querySelector('.item.show').textContent = 'end';
}, 5000);
setInterval() 함수가 나왔는데, 이전 사용했던 setTimeOut()과 어떤 점이 다른지 헷갈려서 따로 검색해보았다.animation-delay 관련해서 여러 개의 애니메이션에 딜레이가 있으면, 그 딜레이 시작 기준점이 이벤트 시작 시점인지 이전 애니메이션이 끝난 시점인지 헷갈렸다.어제처럼 간단한 기능 구현이 다였지만, 강의만 따라가지 않고 여러 가지 변주를 주면서 연습하니 배우는 것이 많았다.