coding
'빡코' 팀프로젝트 - 개발일지 (1)
Jeo
2021. 10. 5. 19:12
스파르타 코딩클럽에서 왕초보 웹개발 종합반을 수강했고, 이어서 15일 메이킹 챌린지에 참여했다.
수업을 들으면서도 많이 배웠지만, 팀프로젝트에 참여하면서 정말 밀도 높게 공부할 수 있었다.
# 개발 업무내용
- 우리 팀 빡코는 'Ques?tion'이라는 웹사이트를 만들고 있다. 사용자에게 랜덤으로 다양한 주제의 질문을 주고 그 답변을 받아오는 사이트이다.
- 현재까지 내가 맡았던 부분은 이용자가 처음 접속했을 때 마주하는 메인페이지의 프론트엔드 구성이었다. 원하는 디자인과 기능을 구현하기 위해 css와 javascript를 많이 공부하게 되었다.
# 업무 중 이슈/고민 .. 그리고 해결한 내용
- 슬라이드 구현
- 가장 시간을 많이 들여서 구현한 기능이었다.
- 초반에는 카드 개수를 줄여서 한번 버튼 클릭만으로 끝에 있는 카드까지 볼 수 있도록 만들어봤었다.
-
qnaBox.style.width = (cardWidth + cardMargin) * cardCount - cardMargin + 'px'; function moveSlide1(num) { qnaBox.style.left = (-num * 740 + 'px'); currentIndex = num; }; slideNext.addEventListener('click', function() { if (currentIndex < 2){ moveSlide1(currentIndex + 1); console.log(currentIndex); } else { moveSlide1(0); } }) slidePrev.addEventListener('click', function() { if (currentIndex > 0){ moveSlide1(currentIndex - 1); console.log(currentIndex); } else { moveSlide1(2); } })
- 하지만 (1) 보여주고 싶은 카드 개수가 더 많았고, (2) 여러 디스플레이 상황에서도 적절한 슬라이딩 폭은 한 카드의 폭만큼이어야 했고, (3) 맨 끝의 카드까지 슬라이딩을 하더라도 이어서 처음 카드를 가져올 수 있도록 무한히 이어지는 기능을 구현하길 바랐다.
- 이런 필요들을 딱 해결해주는 가이드 영상을 만났다 (https://youtu.be/7rTW0mndIy
위의 영상을 참고해서 새로 고친 슬라이딩 코드는 아래와 같다.
// 화면 너비//
var windowWidth = $( window ).width();
let slideNext = document.querySelector(".slide-next");
let slidePrev = document.querySelector(".slide-prev");
let qnaBox = document.querySelector(".qna-showlist");
let card = document.querySelectorAll(".qna-showlist li");
let currentIndex = 0;
let cardCount = card.length;
let cardWidth = 340;
let cardMargin = 40;
makeClone();
function makeClone() {
for (var i = 0; i < cardCount; i++) {
var cloneCard = card[i].cloneNode(true);
cloneCard.classList.add('clone');
qnaBox.appendChild(cloneCard);
}
for (var i =cardCount -1; i>=0; i--) {
var cloneCard = card[i].cloneNode(true);
cloneCard.classList.add('clone');
qnaBox.prepend(cloneCard);
}
updateWidth();
setInitialPos();
setTimeout(function(){
qnaBox.classList.add('animated');
},100)
}
function updateWidth() {
var currentCards = document.querySelectorAll(".qna-showlist li");
var newCardCount = currentCards.length;
var newWidth = (cardWidth + cardMargin) * newCardCount - cardMargin + 'px';
qnaBox.style.width = newWidth;
}
function setInitialPos() {
var initialTranslateValue = -(cardWidth + cardMargin)*cardCount;
qnaBox.style.transform = 'translateX(' + initialTranslateValue+'px)';
}
slideNext.addEventListener('click', function(){
moveSlide(currentIndex + 1)
})
slidePrev.addEventListener('click', function(){
moveSlide(currentIndex - 1)
})
function moveSlide(num) {
qnaBox.style.left = -num * (cardWidth + cardMargin) + 'px';
currentIndex = num;
console.log(currentIndex, cardCount);
if (currentIndex == cardCount || currentIndex == -cardCount) {
setTimeout(function(){
qnaBox.classList.remove('animated');
qnaBox.style.left = '0px';
currentIndex = 0;
},500);
setTimeout(function(){
qnaBox.classList.add('animated');
},600)
}
}
- fixed 된 요소를 화면 정중앙에 배치시키기
- 로그인 팝업창을 position:fixed 로 만들었는데, 반응형으로 매번 사이즈를 달리하려고 했더니 너무 복잡했다.
- 그래서 그냥 작더라도 가운데 딱 레이아웃 고정되어서 있도록 만들기로 마음을 바꿨다...ㅎㅎ
- 그 과정에서 참조한 "fixed 요소를 화면 정중앙에 배치시키기"는 아래처럼 구현했다.
-
position: fixed; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); -moz-transform: translate(-50%, -50%); -o-transform: translate(-50%, -50%); transform: translate(-50%, -50%);
# To-do List
- 이제 막 ajax로 카드에 쓰일 내용 부분에 데이터를 받아와서 temp_html로 띄우는 것까지 성공했다. 다만, 카드슬라이드 기능을 적어놓은 slide.js파일이 temp_html에 적용이 되지 않았다. 우선은 ajax로 불러오는 영역에 바로 이어서 slide.js파일에 적어놓었던 코드들을 복사-붙여넣기 해보았고, 일단 작동은 된다. 그렇지만 이 상태로는 html 파일이 깔끔하지 않다. 따로 js파일로 뺀 다음 적용시킬 수 있는 방법이 있는지 알아보아야겠다.