ProgressBar + Comment 구현
개발할 부분 선정 이유
ProgressBar
이야 이거 멋있다!
참고용으로 다른 분들의 블로그를 찾아볼때마다 눈에 들어오던것이었다. 사실 막 그닥 필요한 장치는 아니지만 막 어려워 보이지 않아서 만들어보기로 했다
Comment
블로그라면 있어야지!
기술블로그니까! 있어야지! 라는 마음으로 도입해보기로 했다.
ProgressBar
progressbar의 작동원리는 이렇다.
- 페이지 로드시 지금 스크롤과 뷰포트를 읽어와 퍼센트로 변환한다.
- 스크롤 리스너를 통해 스크롤이 발생할때마다 읽어온다.
- 읽어온 스크롤 퍼센트(?)에 따라 ProgressBar의 X를 Translate를 통해 변화시킨다.
전체 코드는 이렇다.
import { useEffect, useState } from "react";
const Progressbar = () => {
const [percentage, setPercentage] = useState(100);
const getScrollPercentage = () => {
const scroll = document.documentElement.scrollTop;
const scrollHeight = document.documentElement.scrollHeight;
const clientHeight = document.documentElement.clientHeight;
const viewport = scrollHeight - clientHeight;
const percentage = (scroll / viewport) * 100;
return setPercentage(percentage);
};
useEffect(() => {
getScrollPercentage();
window.addEventListener("scroll", getScrollPercentage);
return () => window.removeEventListener("scroll", getScrollPercentage);
}, []);
return (
<div className="fixed top-0 left-0 right-0">
<div
className="bg-red-500 h-1"
style={{ transform: `translateX(${percentage - 100}%)` }}
/>
</div>
);
};
export default Progressbar;
여기서 useEffect 부분을 보면 getScrollPercentage()가 한번 호출 되고 난 뒤 윈도우리스너를 등록하는데
이는 글이 너무 짧아서 스크롤이 발생하지 않는 경우 Progressbar가 0%에서 고정되어있는 현상을 해결하기 위해 작성되었다.
const getScrollPercentage = () => {
const scroll = document.documentElement.scrollTop;
const scrollHeight = document.documentElement.scrollHeight;
const clientHeight = document.documentElement.clientHeight;
const viewport = scrollHeight - clientHeight;
const percentage = (scroll / viewport) * 100;
return setPercentage(percentage);
};
이부분은 스크롤을 %로 구하는 부분이다. 스크롤을 viewport값으로 나눠서 퍼센트로 구하는 코드이다.
<div className="fixed top-0 left-0 right-0">
<div
className="bg-red-500 h-1"
style={{ transform: `translateX(${percentage - 100}%)` }}
/>
</div>
tailwindCss 를 사용했으며
fixed top-0 left-0 right-0는 progressbar를 최상단에 고정하는 부분이다.
bg-red-500 h-1는 progressbar를 빨간색으로 하고, 높이를 정하는 부분이다.
style={{transform: `translateX(${(percentage - 100)}%)`}}는 퍼센트에 따라서 길이를 변형시키는 코드이다.
percentage - 100 인 이유는 왼쪽부터 오른쪽으로 진행해야 하기 때문이다.
(궁금하면 그냥 percentage해봐라 뭔 소리인지 이해할것이다.)
이렇게 Next.js의 컴포넌트로 구현을 해두었다.
Comment
댓글은 DB를 만들어서 API를 통해 구현해도 되지만 간단한 사이드프로젝트이기때문에 DB구현부터 백앤드 구현은 좀 투머치라고 생각해서 이미 있는 방법들중 Giscus를 이용하기로 했다.
giscus를 이용하는 이유는 다음과 같다.
- 일단 공식 문서가 한글화되어있는 점에서 접근성이 편하다.
- 깃허브의 토론을 이용하기때문에 깃허브를 사용하는 사람이라면 접근성도, 보기도 좋다.
- Next.js용 페키지가 있다...(구현할거 없어서 짱 좋음)
간단하게 사용하는법을 적어두자면
giscus페이지
- 깃헙에서 Public으로 레파지토리를 하나 판다(블로그를 배포한다고 파둔 레파지토리가 Public이라면 그냥 그거 써도 된다.)
- 토론 탭을 활성화 시킨다.(세팅 들어가서 General에서 쭉 내리다 보면 있다.)
- giscus문서에 가서 필요한것들을 적는다.(문서 링크는 위쪽에 있다.)
- 나온 값들을 일단 킵해둔다.
- giscus 페키지를 설치한다. (React나 Next.js라면 yarn add @giscus/react or npm i @giscus/react) 를 통해 설치할수있다. 6.잘 쓴다.
다음은 전체 코드이다.
import Giscus from "@giscus/react";
const Comment = () => {
return (
<div className="border-t-[100px] border-transparent">
<Giscus
id="comments"
repo="내 레파지토리에욧!"
repoId="내 레파지토리 아이디에욧!"
category="General"
categoryId="문서에 기입할거 다 적으면 알아서 나와욧!"
mapping="pathname"
reactionsEnabled="1"
emitMetadata="0"
inputPosition="top"
theme="light"
lang="ko"
loading="lazy"
/>
</div>
);
};
export default Comment;
(진짜 뭐 없다...)
이렇게 구현된 것들은 지금 이 포스트를 보고있는 지금 만나볼수 있다.
그럼 오늘은 이만.. 자자..