메인 배너 무한 슬라이더 구현
// 전역 변수 할당
const $slideContainer = document.querySelector('.content-slideImg');
const $wrapper = document.querySelector('.content-slideImg-wrapper');
const $rightBtn = document.querySelector('.content-slideImg-btn-right');
const $leftBtn = document.querySelector('.content-slideImg-btn-left');
const getImgs = () => document.querySelectorAll('.content-slide-img');
const interval = 5000;
let slides = getImgs();
// 이미지 노드들의 기준 위치를 index로 선언
let index = 1;
// setInterval이 할당되는 변수
let slideId;
// 첫 이미지와 마지막 이미지를 cloneNode를 통해 복제하여 첫 이미지는 가장 마지막에, 마지막 이미지는 가장 첫번째로 복제한다. 이때 img노드는 3개(기존html코드)에서 5개가 된다.
const firstClone = slides[0].cloneNode(true);
const lastClone = slides[slides.length - 1].cloneNode(true);
firstClone.id = 'first-clone';
lastClone.id = 'last-clone';
$wrapper.append(firstClone);
$wrapper.prepend(lastClone);
const slidesWidth = slides[index].clientWidth;
$wrapper.style.transform = `translateX(${-slidesWidth * index}px)`;
// html img의 실제 컨텐츠 넓이를 변수(slidesWidth)에 할당하고 setinterval을 통해 slidesWidth만큼 이미지가 x축 이동한다.
const startSlide = () => {
slideId = setInterval(() => {
index++;
$wrapper.style.transform = `translateX(${-slidesWidth * index}px)`;
$wrapper.style.transition = '.7s';
}, interval);
};
// 이미지가 끝까지 이동했다면 다시 index를 1로 수정하고 이미지를 처음으로 돌린다.
$wrapper.addEventListener('transitionend', () => {
slides = getImgs();
if (slides[index].id === firstClone.id) {
$wrapper.style.transition = 'none';
index = 1;
$wrapper.style.transform = `translateX(${-slidesWidth * index}px)`;
}
if (slides[index].id === lastClone.id) {
$wrapper.style.transition = 'none';
index = slides.length - 2;
$wrapper.style.transform = `translateX(${-slidesWidth * index}px)`;
}
});
// nextButton의 무분별한 클릭으로 index가 늘어나는걸 방지하기 위해 조건을 걸어주고 setInterval의 콜백 함수를 차용한다.
const moveToNextSlide = () => {
slides = getImgs();
if (index >= slides.length - 1) return;
index++;
$wrapper.style.transform = `translateX(${-slidesWidth * index}px)`;
$wrapper.style.transition = '.7s';
};
const moveToPreviousSlide = () => {
if (index <= 0) return;
index--;
$wrapper.style.transform = `translateX(${-slidesWidth * index}px)`;
$wrapper.style.transition = '.7s';
};
$slideContainer.addEventListener('mouseenter', () => {
clearInterval(slideId);
});
$slideContainer.addEventListener('mouseleave', startSlide);
$rightBtn.addEventListener('click', moveToNextSlide);
$leftBtn.addEventListener('click', moveToPreviousSlide);
startSlide();
$slider-width: 400px;
$slider-height: 300px;
무한 슬라이더를 구현하기 위해 레퍼런스를 살펴보면서 위와 같은 코드를 보게 됐는데 도무지 어떤 문법인지 알 수가 없어서 구글에 'What is dollar sign in css'라고 검색해보았다. 그리고 CSS 전처리기(CSS Preprocessor)인 SASS(Syntactically Awesome Style Sheets)/SCSS라는 것을 알게 됐다.
CSS 전처리기는 쉽게 생각하면 CSS의 확장 기능이라고 생각하면 된다. SCSS 파일로는 웹에서 동작하지 않아 CSS 파일로 컴파일되어 웹에 적용되게 된다.
1. 셀렉터 중첩
- 셀렉터 안에 셀렉터를 집어넣어 CSS의 계층적인 구조를 시각화할 수 있다. 코드 가독성이 매우 올라간다.
2. 변수 선언
- 특정 넓이, 특정 색상을 변수로 할당하여 CSS 값으로 적용할 수 있다. 이는 CSS 협업 간 미세한 오차를 줄여준다. 또한 유지보수에도 효율이 올라간다.