티스토리 뷰
Top Button 구현하기
내가 짠 코드
...
const TopButton = (props) => {
const [button, setButton] = useState(false);
useEffect(() => {
const handleShowButton = () => {
window.scrollY > 750 && window.scrollY < 3590 // 메인페이지에서 footer까지 오면 사라짐
? setButton(true)
: setButton(false);
};
window.addEventListener('scroll', handleShowButton);
return () => {
window.removeEventListener('scroll', handleShowButton);
};
});
const handleScrollTop = () => {
window.scrollTo({
top: 0,
behavior: 'smooth',
});
setButton(false); // 스크롤 올라가면 버튼 숨기기
};
return (
<>
{/* button state에 따라 opacity변경 */}
<Button
className='hide'
onClick={handleScrollTop}
style={{ opacity: button ? '100%' : '0%' }}
>
...
팀원분이 짠 코드
const Button = styled.button`
display: block;
position: fixed;
width: 50px;
height: 50px;
right: 10%;
bottom: 8%;
background-color: white;
border: 3px solid ${({ theme }) => theme.colors.footerBg};
transition: 0.3s;
cursor: pointer;
z-index: 10;
opacity: ${({ button }) => (button ? '1' : '0')};
visibility: ${({ button }) => (button ? 'visible' : 'hidden')};
`;
const TopButton = () => {
const [button, setButton] = useState(false);
useEffect(() => {
const handleShowButton = () => {
window.scrollY > window.innerHeight ? setButton(true) : setButton(false);
};
window.addEventListener('scroll', handleShowButton);
return () => window.removeEventListener('scroll', handleShowButton);
}, []);
const handleScrollTop = () => {
window.scrollTo({
top: 0,
behavior: 'smooth',
});
};
return (
<Button className='hide' onClick={handleScrollTop} button={button}>
<FontAwesomeIcon icon={faChevronUp} size='xl' />
</Button>
);
};
하면서도 잘 모르면서 구글링해서 어찌저찌 스크롤이벤트를 이용해서 구현하고 opacity를 줘서 사라지게 구현했는데 팀원분이 수정하신 코드를 보고 많이 배웠다.
배운점
- 스크롤 위치를 하드 코딩하지 않고 window 객체를 이용해서 정해줌 => 불필요한 setState 함수를 사용하지 않아도 됨
- opacity는 0과 1로도 할 수 있음
- style을 컴포넌트에 직접적으로 넣지 않고 스타일드 컴포넌트 내에서 스타일을 설정해줌 (안돼서 그렇게 했는데 컴포넌트에 props를 전달해줘야 사용가능)
- 스타일드 컴포넌트 내에서 props를 가져다가 쓰는 예시
- opacity와 visibility를 두개 다 사용하는 이유를 다시 찾아봐야겠다.
Wide 컴포넌트 구현하기
html 구조
...
<section className='last'>
<div className='bgContainer'>
<div className='textContainer'>
<h4 className='title'>
내 발에 맞는 사이즈가 없으시다고요?
<br />
맞춤신발을 제작해 드립니다!
</h4>
...
내가 짠 코드
...
section.last {
width: 1920px;
margin: 170px 0 0 0;
color: #fff;
div.bgContainer {
height: 480px;
padding-left: 300px;
background-image: url('https://image.prospecs.com/front/images/renewal/smartfit/bg_smartfit_footer_top.png');
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
transform: translateX(-300px);
div.textContainer {
padding: 100px 0 0 20px;
h4.title {
margin-bottom: 30px;
font-size: 40px;
font-family: 'Spoqa Han Sans Neo', 'sans-serif';
font-weight: 400;
line-height: 50px;
}
...
팀원분이 짠 코드
...
section.last {
width: 100%;
margin: 170px 0 0 0;
color: #fff;
div.bgContainer {
height: 480px;
background-image: url('https://image.prospecs.com/front/images/renewal/smartfit/bg_smartfit_footer_top.png');
background-repeat: no-repeat;
background-position: center;
background-size: cover;
}
div.textContainer {
max-width: 1640px;
width: 100%;
padding: 100px 20px 0 20px;
margin: 0 auto;
...
전체 컨테이너 넓이를 1280px로 하자고 해서 코드를 저렇게 짜긴했는데 그래도 화면에 꽉차는 컴포넌트를 구현하려고 굳이 transform을 써가면서 하드코딩을 하는 것보다 부모컴포넌트를 100%로 주고 자식 컴포넌트에 max-width를 주는 게 더 좋겠다는 생각이 들었다.
운 좋게 프로젝트 때 만나면 좋겠다고 생각하던 분이 팀원이 되셔서 여러가지 보고 배우고 있다. 프로젝트 시작하면서 배운적 없던 라이브러리 사용을 제안해주셔서 새롭게 공부하고 많이 배웠는데, 피드백과 코드 수정하신 것에서도 많이 배울 수 있었다. 그동안은 리뷰를 들으면서 같은 과제를 수행해서 남의 코드를 보고 크게 배우는 점이 없었는데 프로젝트는 리뷰없이 스스로 진행하다보니 코드를 보고 배우는 점이 많은 것 같다. 다른 사람이 작성한 코드를 보면서 배우는게 많다고 하던데 이를 체감할 수 있는 기회였다. 프로젝트가 끝나면 모든 코드를 보는 시간을 가져야겠다.
728x90
'TIL' 카테고리의 다른 글
TIL 220915 새롭게 알게 된 CSS + etc. (0) | 2022.09.15 |
---|---|
TIL 220908 서버 설치하면서 발견한 오류들 (0) | 2022.09.09 |
TIL 220828 react-router-dom hook - useLocation(), useParams(), useHistory() (0) | 2022.08.28 |
TIL 220824 클린코드 - 경계다루기 (2) | 2022.08.25 |
TIL 220823 클린코드 + React에서 map에 key가 필요한 이유 (0) | 2022.08.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- html
- 스파르타코딩클럽
- 자바스크립트
- 코딩앙마
- 회고
- 비주얼스튜디오코드
- vscode
- 타입스크립트
- 드림코딩
- 제이쿼리
- Til
- CSS
- 리액트
- React
- Python
- 제로초
- 깃
- js
- 저스트코드
- Typescript
- scss
- TS
- git
- 김버그
- 코드잇
- javascript
- vue
- 파이썬
- 구름에듀
- map
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함