자바스크립트 주요기능 구현하기(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
관련해서 여러 개의 애니메이션에 딜레이가 있으면, 그 딜레이 시작 기준점이 이벤트 시작 시점인지 이전 애니메이션이 끝난 시점인지 헷갈렸다.어제처럼 간단한 기능 구현이 다였지만, 강의만 따라가지 않고 여러 가지 변주를 주면서 연습하니 배우는 것이 많았다.