//ES5 문법에서
// 배열의 값을 호출해서 변수에 담거나 사용할 때
let one;
let two;
let arr = [1, 2, 3, 4, 5];
one = arr[1];
two = arr[3];
console.log(one, two); //2,4
// ES6에서 도입
// 구조분해 할당
//변수를 선언하고 배열의 arr2의 값을 구조분해 할당해서
//순서대로 할당 시킨다.
// 배열의 구조 분해 할당
let arr2 = [1, 2, 3, 4];
let [one1, two1, three1, four1] = arr2;
console.log(one1, two1, three1, four1);//1,2,3,4
// 값이 순서대로 할당된다.
let [a, b] = [1, 2];
console.log(a, b);
// 할당되는 값이 없으면 undefined
let [c, d] = [1];
console.log(c, d);
let name1 = { firstName: "lee", lastName: "mu" };
// es6 객체의 각 키를 뽑아서 변수에 할당.
// obj는 순서가 아니다.
// key를 기준으로 구조분해 할당이 이루어진다.
// 순서가 아니고,
let { lastName, firstName } = name1;
console.log(firstName, lastName); // 'lee' , 'mu'
let name4 = ({ firstName = "lee", lastName } = { lastName: "kim" });
console.log(firstName, lastName);//'lee','kim'
해당 변수가 object구조면 {}를 이용해 미리 변수를 선언해서 편리하게 사용할 수 있다.
이는 이미 js내장 함수도 사용할 수 있다. 대표적으로 length가 있다.
//문자열을 담은 변수에서 구조분해할당
let str = "asdfgh";
// 문자열 길이구하는 length
// 구조분해 할당으로 변수에 할당
let { length } = str;
console.log(length);//6
활용 예는 특정 오브젝트에서 원하는 값만을 따로 저장할 때 쓸 수 있다.
//작업할 때 객체화 시켜서
// 작업을 하다가 객체안에 필요한 값만 호출해서 구조분해 할당해서 사용할 수 있다.
let list = [
{ id: 1, content: "ㅎㅎ못가", isActive: true },
{ id: 2, content: "ㅎㅎ못가", isActive: true },
{ id: 3, content: "ㅎㅎ못가", isActive: true },
];
// id값만 뽑아오자
let { id } = list;
// list객체에서 id키 값만 구조분해할당으로 할당 해줄수있다.
list.forEach((i) => {
let { id, content } = i;
console.log(id); //1,2,3
});
// 스프레드 연산자
// 스프레드 연산자 많이 사용한다.
// 스프레드 연산자 구문 ...
// 스프레드 연산자는 본 객체를 변경하지않고
// 새로운 객체를 만들어준다.
let temp = [1, 2, 3];
let temp2 = [4, 5, 6, 7];
let temp3 = [...temp, ...temp2];
console.log(temp3); //[1,2,3,4,5,6,7]
대괄호,중괄호를 벗기는 역할을 한다. 얕은복사,깊은 복사에서 리액트 때 많이 썼던 기억이 난다.
let obj = {
a: 1,
b: 2,
};
let obj2 = {
a: 1,
b: 3,
c: 1,
};
let obj4 = {
a: 3,
b: 4,
c: 4,
};
let obj3 = {
...obj,
...obj2,
...obj4,
};
// 마지막으로 키값이 동일할 경우 마지막 값으로 할당된다.
console.log(obj3);
마찬가지로 object형식도 spreadoperator를 쓸 수 있다.
1.html
<body>
<!-- swiper 라이브러리를 사용하면 빠르고 편하긴한데
수정이 어렵다. -->
<div class="swiper-wrap">
<div class="swiper">
<ul class="swiper-content">
<li class="swiper-first-item">4</li>
<li class="swiper-item">1</li>
<li class="swiper-item">2</li>
<li class="swiper-item">3</li>
<li class="swiper-item">4</li>
<li class="swiper-last-item">1</li>
</ul>
</div>
<span class="prev">이전</span>
<span class="next">다음</span>
</div>
</body>
2.css
.swiper-wrap {
width: 500px;
height: max-content;
position: relative;
margin: auto;
}
.swiper {
width: 500px;
height: 500px;
position: relative;
margin: auto;
overflow: hidden;
}
.swiper-content {
width: max-content;
height: 100%;
position: absolute;
top: 0;
left: 0;
padding: 0;
margin: 0;
display: flex;
list-style: none;
transition: 1s;
}
.swiper-item {
width: 500px;
height: 100%;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
/* 이벤트 제거 */
pointer-events: none;
}
.swiper-first-item {
width: 500px;
height: 100%;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
/* 이벤트 제거 */
pointer-events: none;
}
.swiper-last-item {
width: 500px;
height: 100%;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
/* 이벤트 제거 */
pointer-events: none;
}
.prev,
.next {
z-index: 1;
cursor: pointer;
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 50px;
}
.prev {
left: 5x;
}
.next {
right: 5px;
}
3.js
// 클릭의 시작 위치를 가지고 있고
// 끝나면 끝난 좌표와 비굑를 해서
// 오른쪽을 스와이프 된건지
// 왼쪽으로 스와이프 된건지 부터 확인을 하고
// 인덱스를 기준으로 움직임을 제어해보자.
// 마우스 시작 클릭 지점 x좌표
let _start;
// 진행중인 인덱스
let _index = 2;
let _swiper = document.querySelector(".swiper");
let _swiperContent = document.querySelector(".swiper-content");
let swiperItem = document.querySelectorAll(".swiper-item");
let firstIndex = document.querySelector(".swiper-first-item");
let lastIndex = document.querySelector(".swiper-last-item");
let { length } = document.querySelectorAll(".swiper-item");
let _prev = document.querySelector(".prev");
let _next = document.querySelector(".next");
firstIndex.style.display = "";
lastIndex.style.display = "none";
// getComputedStyle 적용된 스타일의 값을 가져올 수 있다.
// 적용된 스타일 가져올 태그를 매개변수로 전달
let _swiperWidth = parseInt(getComputedStyle(_swiper).width);
_swiper.addEventListener("mousedown", (e) => {
// console.log('클릭 시작');
// 클릭했을 때 x좌표
// 클릭한 x의 좌표
// e.clientX;
_swiperContent.style.transition = "1s";
_start = e.clientX;
});
_swiper.addEventListener("mouseup", (e) => {
if (e.clientX < _start - 50) {
_index++;
swiperMove();
} else if (e.clientX > _start + 50) {
_index--;
swiperMove();
}
});
// 인덱스를 기준으로 움직임
function swiperMove() {
_swiperContent.style.left = -((_index - 1) * _swiperWidth) + "px";
}
_prev.addEventListener("click", () => {
console.log(_index);
_index--;
swiperMove();
_swiperContent.style.transition = "1s";
});
_next.addEventListener("click", () => {
console.log(_index);
_index++;
swiperMove();
_swiperContent.style.transition = "1s";
});
// 메모
_swiperContent.addEventListener("transitionend", () => {
if (_index === length + 1) {
lastIndex.style.display = "";
} else if (_index === length + 2) {
_index = 2;
_swiperContent.style.transition = "0s";
_swiperContent.style.left = "-500px";
} else if (_index === 1) {
_index = length + 1;
_swiperContent.style.transition = "0s";
_swiperContent.style.left = -(4 * _swiperWidth) + "px";
}
});
_swiperContent.style.left = -(1 * _swiperWidth) + "px";
💡 기본적으로 이 코드가 작동하는 방식은 다음과 같다.
1.swiper 클래스에 overflow를 hidden을 준다.
2.swiper-content 에display: flex;와 position: absolute; 을 줌으로서 위치를 고정시키고 자식 컨텐츠를 일렬로 늘인다.
3.swiper-item 에선 부모와 똑같은 크기를 자식 하나하나에 부여하고 일부로 옆으로 넘치게한다.
이렇게 되면 부모 밖으로 나가는건 hidden으로 보이지 않고, 하나의 요소(부모와 크기가 같으므로)만 보이게 된다.
4. 그 후 left로 500px단위로 움직여 보여지게 만든다.
_swiper.addEventListener("mousedown", (e) => {
// console.log('클릭 시작');
// 클릭했을 때 x좌표
// 클릭한 x의 좌표
// e.clientX;
_swiperContent.style.transition = "1s";
_start = e.clientX;
});
_swiper.addEventListener("mouseup", (e) => {
if (e.clientX < _start - 50) {
_index++;
swiperMove();
} else if (e.clientX > _start + 50) {
_index--;
swiperMove();
}
});
// 인덱스를 기준으로 움직임
function swiperMove() {
_swiperContent.style.left = -((_index - 1) * _swiperWidth) + "px";
}
_prev.addEventListener("click", () => {
console.log(_index);
_index--;
swiperMove();
_swiperContent.style.transition = "1s";
});
_next.addEventListener("click", () => {
console.log(_index);
_index++;
swiperMove();
_swiperContent.style.transition = "1s";
});