🚫 아마존 웹사이트를 클론해보면서 CSS와 JS를 학습하는 내용입니다.
구현은 되었으나 정확한 코드가 아니며 더 좋은 방법은 학습해가며 수정하려고 합니다.
움직임에는 의미 전달이 향상되고 사용자와의 상호 작용을 방해하지 않아야 함을 항상 고민하고 사용하자.
transitions을 적용하기 위해서는 아래의 두 속성이 필요하다.
transition-property
: 전환할 속성 (ex : background-color, tranform)transition-duration
: 전환할 기간transition-timing *(optional)*
div {
transition: [property] [duration] [timing-function] [delay];
}
상태의 변환에 윤활유 역할을 한 transitions을 기억하면서
요소의 한 상태를 다른 상태로 변경하는 transforms에 대해 알아보자.
케러셀은 영어로 “merry-go-round”라 불리며, 원형으로 되어있는 놀이기구 회전목마를 생각하면 된다.
쭉 이어진 이미지들이 원형으로 돌아가면서 해당 장소로 반복하면서 돌아오는 구조를 생각해주면 된다.
function Track() {
this.element = document.querySelector(".banner__track");
this.leftBtn = document.querySelector(".banner__btn:first-child");
this.rightBtn = document.querySelector(".banner__btn:last-child");
this.directionByNum = 0;
}
Track.prototype.moveTrack = function (direction) {
if (direction === "left") {
this.directionByNum = 1;
} else if (direction === "right") {
this.directionByNum = -1;
}
this.element.style.transition = "transform .5s ease-in-out";
this.element.style.transform = `translateX(${
(this.directionByNum * 100) / banners.imgList.length
}%)`;
this.element.ontransitionend = () => {
this.reorgannizeEl(direction);
};
};
Track.prototype.reorgannizeEl = function (direction) {
this.element.removeAttribute("style");
direction === "left"
? this.element.insertBefore(
this.element.lastElementChild,
this.element.firstElementChild
)
: this.element.appendChild(this.element.firstElementChild);
};
Track.prototype.addEvent = function () {
this.leftBtn.addEventListener("click", this.moveTrack.bind(this, "left"));
this.rightBtn.addEventListener("click", this.moveTrack.bind(this, "right"));
};
this.element.style.transition = "transform .5s ease-in-out"
트랜지션을 CSS에서 부여하면 this.element.removeAttribute("style") 후
셋팅된 CSS 로 돌아가기에 애니메이션이 중복해서 발생된다.
function Banner() {
this.imgList = [
"bannerImg1",
"bannerImg2",
"bannerImg3",
"bannerImg4",
"bannerImg5",
"bannerImg6",
];
}
Banner.prototype.toBeElement = function (imgName) {
const div = document.createElement("div");
const img = document.createElement("img");
div.classList.add("banner__column");
img.classList.add("banner__img");
img.src = `photo/${imgName}.jpg`;
div.appendChild(img);
track.element.appendChild(div);
};
Banner.prototype.setBanners = function () {
this.imgList.forEach((imgName) => {
this.toBeElement(imgName);
});
};
.banner {
width: 1500px; // 보여지는 이미지 크기
overflow-x: hidden; // 보여지는 이미지를 벗어나면 가려준다.
margin: 0 auto; // 가운데 정렬
}
.banner__track {
display: flex; // 트랙내 이미지들 플레스 배치
position: relative;
width: 9000px; // 트랙에 들어가는 이미지 총 사이즈
~~transition: transform 0.3s ease-in-out; // 트렌지션 부여~~
left: -1500px; // 배너들 첫 세팅 시 제일 앞 배너가 위치하면 안된다.
}
.banner__img {
width: 1500px; // 이미지 크기
height: 600px;
}
Carousel practice
캐러셀 구현하기 참고자료