슬라이드를 만들기전에
<슬라이드 잡아주는 태그> >position : relative, overflow: hidden (넘어가는것 지우기)
<슬라이드 ul태그> > absolute, float: left, left:0, top:0
-슬라이드 li들-
</ul>
<버튼> > 혹시 버튼이 자리잡기 힘들면 밖으로 빼거나 div로 한번 더 묶기 > position : absolute , flex,
</잡아주는 태그>
높이, 너비는 거의 vh,vw로 줌
-상황에 맞게 카드 배열 잘 맞춰야함
만들때부터 딱 맞게 만들기
- 카드 넘어갈때 규격 정확히 정하기(js에서)
> 안맞으면 뒤로 갈수록 튀어나옴
나머지는 상황따라 맞추기
1개 만들때는 (엄청 간단한 ver)
1.먼저 ul슬라이드 부분 태그를 document.querySelector을 이용해서 변수 선언
2. ul속 li들을 document.querySelectorAll로 잡아주기
<둘다 지정만 ul과 li잡기만 하면된다. 다른 APi로 할거면 그걸로>
3. 슬라이드 인덱스 세는 변수 선언 = 0
4. 슬라이드 인덱스 갯수 파악
>>> 미리 나와있으면 나와있는대로
>> 없으면 li잡은 변수에 .length
5. 버튼도 각각 번수 선언해서 잡아주기 document.querySelector
6. 함수선언문 이용
함수 = (매개변수n) => {
////이건 카드가 1장 넘어가면 왼쪽으로 움직이니 -로 해야함
ul잡은거.style.left = -매개변수n * (카드 1장 단위);
슬라이드 인덱스 세는 변수 선언 = 매개변수n
}
7. 다음버튼변수. addEventListener("click", () => {
슬라이드 함수(슬라이드 인덱스변수 + 1)
}
이전버튼변수. addEventListener("click", () => {
슬라이드 함수(슬라이드 인덱스변수 - 1)
}
슬라이드 끝일때 버튼 비활성화는 밑에 참고
하나의 함수로 다량의 슬라이드에 적용하기
----만든 코드보며 되새기기---
js
export { setupSlideNavigation };
const setupSlideNavigation = ({ slidesSelector, prevBtnSelector, nextBtnSelector }) => {
const slides = document.querySelector(slidesSelector);
const prevBtn = document.querySelector(prevBtnSelector);
const nextBtn = document.querySelector(nextBtnSelector);
let currentIdx = 0;
const moveSlides = (num) => {
slides.style.left = -num * 14.8 + "vw";
// 슬라이드 속도 설정
slides.style.transitionDuration = "0.6s";
// 슬라이드 애니메이션 타이밍 함수 설정
slides.style.transitionTimingFunction = "ease-in-out";
currentIdx = num;
prevBtn.disabled = num === 0;
nextBtn.disabled = num === slides.children.length - 6;
};
nextBtn.addEventListener("click", () => {
moveSlides(currentIdx + 1);
});
prevBtn.addEventListener("click", () => {
moveSlides(currentIdx - 1);
});
};
// 각 슬라이드에 대한 정보를 사용하여 슬라이드 네비게이션 설정
const slideData = [
{
slidesSelector: "#now-playing",
prevBtnSelector: "#prevNow",
nextBtnSelector: "#nextNow"
},
{
slidesSelector: "#popular",
prevBtnSelector: "#prevPopular",
nextBtnSelector: "#nextPopular"
},
{
slidesSelector: "#top-rated",
prevBtnSelector: "#prevTop",
nextBtnSelector: "#nextTop"
},
{
slidesSelector: "#upcoming",
prevBtnSelector: "#prevUp",
nextBtnSelector: "#nextUp"
}
];
slideData.forEach((data) => {
setupSlideNavigation(data);
});
1개 만들때와 비슷
1개만드는 방법에 직접적으로 잡을 태그 셀렉하지 말고
매개변수로 받게 만들면된다.
prevBtn.disabled = num === 0;
nextBtn.disabled = num === slides.children.length - 6;
이거는 이전버튼이 0일경우 비활성
_ 만든 카드수가 6개일경우 다음버튼은 -6
직접적으로 함수를 호출하면
배열에 인덱스가 몇개있는지 모르기 때문에
각 슬라이스 데이터를 객체로 잡고
그걸 한번 데이터로 뽑아줘야한다.
위처럼 만들경우
마지막 버튼은 비활성이 잘되지만
이전버튼은 다음을 한번 누르고 이전을 눌러야 비활성화
+ 처음에 이전누르면 빈 화면이 나왔다.
>> 이거때문에 개별로 처음에 이전버튼을 비활성화 시켜야하는데
제일 쉽게 해결하는 방법은 html 이전버튼코드에 disabled = ''ture 추가
disabled="true"
html
<main>
<h2>Now Playing</h2>
<div class="movie-container">
<ul class="flex-container" id="now-playing"></ul>
<div class="arrow">
<button class="prev" id="prevNow" disabled="true">prev</button>
<button class="next" id="nextNow">next</button>
</div>
</div>
<h2>Popular</h2>
<div class="movie-container">
<ul class="flex-container" id="popular"></ul>
<div class="arrow">
<button class="prev" id="prevPopular" disabled="true">prev</button>
<button class="next" id="nextPopular">next</button>
</div>
</div>
<h2>Top Rated</h2>
<div class="movie-container">
<ul class="flex-container" id="top-rated"></ul>
<div class="arrow">
<button class="prev" id="prevTop" disabled="true">prev</button>
<button class="next" id="nextTop">next</button>
</div>
</div>
<h2>Upcoming</h2>
<div class="movie-container">
<ul class="flex-container" id="upcoming"></ul>
<div class="arrow">
<button class="prev" id="prevUp" disabled="true">prev</button>
<button class="next" id="nextUp">next</button>
</div>
</div>
</main>
css
.movie-container {
position: relative;
width: 88vw;
height: 42vh;
margin: 0 auto;
display: flex;
justify-content: center;
overflow: hidden;
}
/* flex 사용 */
.flex-container {
display: flex;
align-items: flex-start;
position: absolute;
left: 0;
top: 0;
width: 86vw;
padding: 0;
float: left;
}
/* 넓이 지정을 통해 한줄당 나열될 카드 수 지정 */
.card {
width: 18vw;
height: 40vh;
/* 카드수 수정은 마진으로 */
margin: 0 0.6vw;
text-align: center;
background-color: #938866;
border-radius: 2rem;
list-style-type: none;
}
.arrow {
position: absolute;
display: flex;
width: 100%;
bottom: 45%;
justify-content: space-between;
}
.prev {
float: left;
}
.next {
float: right;
}
.image-box img {
width: 8vw;
height: 27vh;
border-radius: 2rem;
margin-top: 1rem;
}
네, slideData.forEach((data) => { setupSlideNavigation(data); }); 코드를 실행하면 각 슬라이드에 대한 정보가 담긴 객체를 이용하여 setupSlideNavigation 함수가 호출됩니다.
이 함수 내에서는 각 슬라이드의 요소를 선택하고 해당 슬라이드에 대한 네비게이션을 설정합니다. 그리고 슬라이드의 자식 요소의 수를 이용하여 각 슬라이드에 몇 개의 요소가 있는지 알 수 있습니다.
따라서 setupSlideNavigation 함수를 호출하고 나면 각 슬라이드의 요소 수를 기준으로 네비게이션을 설정하게 됩니다.
'javascript' 카테고리의 다른 글
배열 인덱스 마지막 찾기 (0) | 2024.05.09 |
---|---|
이미지 자동 전환 (0) | 2024.05.08 |
Math 내장 객체 (0) | 2024.05.03 |
for...in (0) | 2024.05.02 |
프로토타입 체인 (0) | 2024.05.02 |