오늘로서 5일간 진행한 클론코딩 프로젝트를 끝마쳤습니다
프로젝트에 대한 전반적인 소감은 여기에
(https://github.com/nazzzo/nazzzo.github.io)
이번 포스트에는 기능 구현에 중점을 둔 부분들을 모아서
자바스크립트 코드와 함께 아래에 정리합니다
팝업창 하단의 '오늘 하루 그만보기'에 체크를 하면
그 시점의 날짜정보가 로컬 스토리지에 저장됩니다
로컬 스토리지에 저장된 시간 데이터와 현재 시간이 다를 경우
사이트를 새로고침해도 팝업창이 다시 열리지 않습니다
날짜 정보를 확인하기 위해 getDate()
메서드를 사용했습니다
const loadDay = new Date();
// 주어진 날짜의 현지 시간 기준 일을 반환합니다
const thisMinutes = loadDay.getMinutes()
const thisDay = loadDay.getDate();
console.log(thisMinutes)
const v_btn = document.querySelector(".v1")
const v_txt = document.querySelector(".v2")
v_btn.addEventListener ("click", function (e){
v_btn.classList.toggle("v_checked")
localStorage.setItem('today', thisDay);
localStorage.setItem('Minutes', thisMinutes);
})
v_txt.addEventListener ("click", function (e){
v_btn.classList.toggle("v_checked")
localStorage.setItem('today', thisDay);
localStorage.setItem('Minutes', thisMinutes);
})
// 날짜 정보를 로컬 스토리지에 저장합니다
const x_btn = document.querySelector(".x_btn")
const conf_btn = document.querySelector(".conf_btn")
const layer = document.querySelector(".layer_bg")
const popup = document.querySelector(".layer_popup")
x_btn.addEventListener("click", function (e) {
layer.className="layer_off"
popup.className="layer_off"
})
conf_btn.addEventListener("click", function (e) {
layer.className="layer_off"
popup.className="layer_off"
})
// 오늘 하루 다시 보지 않기
// if (localStorage.getItem('today') == thisDay) {
// layer.className="layer_off"
// popup.className="layer_off"
// }
// 1분간 다시 보지 않기
if (localStorage.getItem('Minutes') == thisMinutes) {
layer.className="layer_off"
popup.className="layer_off"
}
setTimeout
설정으로 아이템의 이벤트 발동 시점을 조금씩 다르게 조정했습니다(스크롤을 감지할 때 pageYOFfest
이나 scrollY
를 쓰면서 다소 불편함과 버그를 경험했기 때문에
다음 번에 비슷한 이벤트를 만들어야 한다면 Intersection Observer API
를 활용해야 할 것 같습니다)
const itemBox = document.querySelectorAll("#box_item1, #item_box2 > div")
for (let i = 0; i < itemBox.length; i++) {
document.addEventListener("scroll", function (e) {
if (window.pageYOffset > 500) {
setTimeout(function () {
itemBox[i].style.opacity = "1";
itemBox[i].style.transition = "all 0.8s ease-out";
itemBox[i].style.bottom = "0px";
}, 100 * (i + (i + 2)));
} else if (window.pageYOffset < 100) {
itemBox[i].style.opacity = "0";
itemBox[i].style.transition = "all 0.3s ease-out";
itemBox[i].style.bottom = "-50px";
}
});
}
슬라이드 효과를 무한 반복시키려면
화면 밖으로 넘어간 마지막 아이템의 좌표를
좌측의 0번 인덱스로 이동시켜야 합니다
class="on" : 화면에 비출 부분
class="off" : 좌측 밖으로 보낼 슬라이드
class="out" : 우측 밖으로 보낼 슬라이드
// 슬라이더 메뉴
const items = document.querySelectorAll("#slide > ul")
const prevBtn = document.querySelector(".prev_btn > button")
const nextBtn = document.querySelector(".next_btn > button")
let intervalId = 0
let count = 0
function findIndex() {
for (let i = 0; i < items.length; i++) {
if (items[i].getAttribute("class") === "on") return i
}
}
function slide() {
let prev = count === 0 ? (items.length - 1) : (count - 1)
items[count].className = "on"
items[prev].className = "off"
for (let i = 0; i < items.length; i++) {
if (count !== i && prev !== i) {
items[i].className = "out"
}
}
if (++count === 3) count = 0
}
slide()
function prevHandler(e) {
const current = findIndex()
const index = current === 0 ? (items.length - 1) : (current - 1)
items[current].className = "out"
items[index].className = "on"
for (let i = 0; i < items.length; i++) {
if (current !== i && index !== i) {
items[i].className = "off"
const slide = document.querySelector("slide")
count = index
}
}
}
function nextHandler(e) {
const current = findIndex()
const index = current === items.length - 1 ? 0 : current + 1
items[current].className = "off"
items[index].className = "on"
for (let i = 0; i < items.length; i++) {
if (current !== i && index !== i) {
items[i].className = "out"
}
count = index
}
}
prevBtn.addEventListener("click", prevHandler)
nextBtn.addEventListener("click", nextHandler)
#slideWrap {
position: relative;
width: 1440px;
margin: 0 auto;
overflow: hidden;
}
#slide {
width: 1440px;
height: 780px;
margin: 0 auto;
display: flex;
flex-wrap: nowrap;
transition: all 0.5s ease-out;
}
#slide > ul {
position: absolute;
transform: translateX(1440px);
z-index: 3;
}
#slide > ul.on {
transition: all 0.2s ease-out;
transform: translateX(0px);
z-index: 3;
}
#slide > ul.off {
transition: all 0.2s ease-out;
transform: translateX(-1440px);
z-index: 2;
}
#slide > ul.out {
transition: all 0.2s ease-out;
transform: translateX(1440px);
z-index: 1;
}