메인페이지 nav바 추가
상세페이지 댓글 (등록,수정,삭제)
프로젝트를 빌드업 하면서 페이지들이 늘어났고 로그인, 회원가입, 마이페이지가 추가로 생기게 되어 깔끔하게 정리할 수 있는 곳이 필요했다..!
햄버거 아이콘을 눌렀을 때 나타나고 X표시하면 닫을 수 있도록 자바스크립트 코드를 구현하였다..!
처음에는 display:block , display: none 을 이용해 자바스크립트 코드를 짰다.
구현을 해보니 너무 갑자기 사라지고 생기는 느낌이 들어 transform : translateX와 transition을 이용하여 class를 추가하고 지우는 형식으로 변경하였다.
완성된 HTML
const hamburgerMenu = document.getElementById("hamburger-menu");
document.getElementById("menu-button").addEventListener("click", () => {
if (hamburgerMenu.classList.contains("hamburger-menu-open")) {
hamburgerMenu.classList.remove("hamburger-menu-open");
} else {
hamburgerMenu.classList.add("hamburger-menu-open");
}
});
document.getElementById("menu-close-button").addEventListener("click", () => {
if (hamburgerMenu.classList.contains("hamburger-menu-open")) {
hamburgerMenu.classList.remove("hamburger-menu-open");
} else {
hamburgerMenu.classList.add("hamburger-menu-open");
}
});
css
.hamburger-menu {
width: 300px;
height: 100%;
margin: 0 auto;
background-color: rgb(24, 24, 24);
position: fixed;
left: 0;
top: 0;
overflow:hidden; // 영역밖으로 나가는 것 보이지 않게 처리
transform: translateX(-100%); // x값 이동하여 보이지 않는 것처럼 처리
transition: transform 0.3s ease;// 변경이 될 때 시간을 주어 애니메이션이 생성된 것처럼 처리
}
// 햄버거 이모티콘을 클릭하면 x위치가 원위치로 돌아와 만들어둔 nav바가 보인다.
.hamburger-menu-open {
transform: translateX(0%);
}
처음에는 firebase로 데이터를 따로 보관해 누가 켜도 볼 수 있게 처리하고 싶었다.
하지만 작성법이 잘 생각나지 않는 상태에서 firebase까지 사용하려고 하니 쉽지 않아 우선 localStorage로 먼저 구현 후 다시 firebase를 써복려고 한다.
구현한 JavaScript
// 댓글기능
// 작성, 저장, 업로드, 수정, 삭제
document.addEventListener("DOMContentLoaded", () => {
let reviewCards = document.getElementById("review-cards"); // 댓글내용담길곳
let userId = document.getElementById("user-name"); // 유저아이디
let reviewComment = document.getElementById("review-comment"); // 댓글내용
const reviewForm = document.getElementById("review-form"); // 댓글다는곳
// 저장되어있던 댓글 가져오기
function uploadComment() {
const comments = JSON.parse(localStorage.getItem("comments"));
reviewCards.innerHTML = ""; //초기화
comments.forEach(({ name, review }, index) => {
// 카드목록, 제목, 내용 생성
const reviewLi = document.createElement("li");
reviewLi.className = "review-card";
reviewLi.dataset.index = index;
const reviewCardContent = `
<div class="review-card-id">${name}</div>
<div class="review-card-content">${review}</div>
<button class="review-modify-button">수정</button>
<button class="review-delete-button">삭제</button>
`;
reviewLi.innerHTML = reviewCardContent;
reviewCards.appendChild(reviewLi);
});
document.querySelectorAll(".review-delete-button").forEach((button) => {
button.addEventListener("click", deleteReview);
});
}
// 댓글내용 저장
function addComment(name, review) {
const comments = JSON.parse(localStorage.getItem("comments")) || [];
comments.push({ name, review });
localStorage.setItem("comments", JSON.stringify(comments));
}
// 제출 시 내용 업데이트 + 저장
reviewForm.addEventListener("submit", (event) => {
event.preventDefault();
const name = userId.value;
const review = reviewComment.value;
// 기존저장배열 + 새로운 배열 로컬에 저장(로컬저장시 문자열반환)
if (name && review) {
addComment(name, review);
//초기화
userId.value = "";
reviewComment.value = "";
uploadComment();
}
});
// 댓글 삭제
function deleteReview(event) {
const reviewLi = event.target.closest(".review-card");
const index = reviewLi.dataset.index;
const comments = JSON.parse(localStorage.getItem("comments")) || [];
comments.splice(index, 1);
localStorage.setItem("comments", JSON.stringify(comments));
uploadComment();
}
uploadComment();
});
localStorage 사용법