LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLAB Coreteam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

DevLogSEO Jing

Day 11 - 프레젠테이션 확대 기능, FullscreenView 개선

2026년 3월 25일·5분 읽기

PC에서 글자가 너무 작다

10일차에 모바일 프레젠테이션을 안정화했는데, PC로 보니 또 다른 문제가 눈에 들어왔다. 화면이 넓어서 슬라이드가 가로로 꽉 찬 대신, 폰트가 원본 아티클 크기 그대로라 글자가 작아보였다. 발표 자료로 쓰기엔 적합하지 않은 상태였다.

해결책은 간단하다. CSS의 zoom 속성으로 슬라이드 콘텐츠 전체를 확대하고, 확대 배율에 맞춰 슬라이드 분할 계산도 재조정하면 된다.


확대/축소 컨트롤 추가

하단 바 오른쪽에 −, 배율 표시, + 버튼 세 개를 추가했다. 기본값은 2×, 범위는 1× ~ 3×, 단계는 0.2씩이다.

배율이 바뀌면 슬라이드를 처음부터 다시 계산해야 하므로 setCurrentSlide(0)을 함께 호출한다. 분할 계산 시 가용 높이와 너비를 scale로 나눠서 넘기면, zoom으로 확대된 공간에서 정확하게 분할이 이루어진다.

ts
const scale = isMobile ? 1 : pcScale;
setSlides(extractSlides(articleRef.current, available / scale, slideW / scale));

슬라이드 콘텐츠 div에는 style={{ zoom: pcScale }}을 적용해서 렌더된 결과가 실제로 확대되어 보이도록 했다. 모바일에서는 zoom을 적용하지 않는다.


모바일 orientation 판단 로직 개선

기존 로직은 window.matchMedia("(max-width: 768px)")으로 모바일 여부를 판단했다. 그런데 이 방식은 화면이 이미 가로 방향일 때 너비가 768px를 넘어버려서 모바일로 인식을 못 하는 문제가 있었다.

물리적 짧은 변을 기준으로 바꿨다. Math.min(width, height)이 768px 이하면 모바일이고, 그 중 세로 상태(height > width)일 때만 90도 회전이 필요하다는 needsRotation 플래그를 분리했다.

ts
const short = Math.min(window.innerWidth, window.innerHeight);
const isMobile = short <= 768;
const needsRotation = isMobile && window.innerHeight > window.innerWidth;

이후 슬라이드 높이 계산, 컨테이너 transform, 코드 뷰어 회전 모두 isMobile이 아닌 needsRotation을 기준으로 분기하도록 수정했다.


FullscreenView 컴포넌트 분리

전체화면 코드 뷰어(FullscreenView)가 code-block.tsx 안에 비공개 함수로 있었다. 프레젠테이션 뷰에서 "코드 전체 보기" 버튼을 눌렀을 때도 같은 뷰어를 재사용하고 싶었는데, 외부에서 접근할 수가 없는 상태였다.

FullscreenView에 export를 붙이고 packages/ui/src/index.ts에서 재내보냈다. 프레젠테이션 뷰에서는 기존에 직접 만들어 쓰던 전체화면 코드 렌더러를 제거하고, FullscreenView로 교체했다.

이 과정에서 PC에서는 회전이 필요 없는데 항상 회전 스타일이 적용되던 버그도 잡았다. rotate prop을 추가해서 명시적으로 제어할 수 있게 했고, prop이 없으면 기존처럼 내부에서 자동 판단한다.


FullscreenView PC 스타일 개선

코드 뷰어를 PC에서 열어보니 모바일 전용으로 설계되어 있어서 가독성이 낮았다. wide 화면에서 줄이 너무 길어지고, 폰트도 작은 편이었다.

pre 태그에 반응형 스타일을 추가했다. 모바일에서는 기존 그대로이고, md 이상에서는 좌우 패딩을 25dvw로 넓히고 폰트를 text-2xl로 키웠다. 코드가 화면 좌우 여백 안쪽에 자리잡아서 읽기 편해졌다.

닫기 버튼도 개선했다. 이전에는 하단 바에 텍스트만 있었는데, 명시적인 버튼 요소로 바꾸고 onMouseDown/onTouchStart에 stopPropagation을 추가해서 롱프레스 로직이 닫기 버튼에서 트리거되지 않도록 했다.


코드블록 전체보기 버튼 노출 범위 확대

코드블록의 "전체보기" 아이콘 버튼이 md:hidden으로 모바일에서만 표시되고 있었다. PC에서도 프레젠테이션 모드 진입 전에 코드 뷰어를 열고 싶은 경우가 있어서 md:hidden을 제거해 항상 노출되도록 변경했다.

Post Q&A

오케이징에게 물어보기

Day 11 - 프레젠테이션 확대 기능, FullscreenView 개선 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!

0/500

포스트 목록

/SEOJing/devLog
파일 14개, 폴더 1개
Day 1 - 디자인 컨셉과 디자인 시스템Day 2 - 블로그 스켈레톤과 MDX 파싱Day 3 - MDX 이슈, 반응형, 다크모드Day 4 - 배포와 CI/CDDay 5 - shiki 제거, MDX 모듈화, 그리고 대량 포스팅Day 6 - 스터디 자료 작성과 데스크탑 비율 수정Day 7 - Front Matter CMS와 관련 게시물 탐색기Day 8 - 아티클 퀴즈와 스터디 자료Day 9 - 프레젠테이션 모드, 코드블럭 개선, 테스팅Day 10 - 프레젠테이션 모드 안정화Day 11 - 프레젠테이션 확대 기능, FullscreenView 개선Day 12 - 테스트 커버리지 개선, 모바일 프레젠테이션 버그 2건 수정기술 블로그를 직접 제작하게 된 이유왜 자꾸 프로젝트가 중단되는지

같은 섹션의 대표 이미지

24 posts · latest first
SEO Jing26. 04. 01.

Day 12 - 테스트 커버리지 개선, 모바일 프레젠테이션 버그 2건.

SEO Jing 개발 열두째 날. code-block 테스트 14개 추가로 커버리지 대폭 개선, 모바일 프레젠테이션에서 FullscreenView 방향 전환 문제와 스크롤 멈춤 버그 수정.

26. 04. 01.SEOJing
SEO Jing26. 03. 25.

Day 11 - 프레젠테이션 확대 기능,.

SEO Jing 개발 열한째 날. PC 프레젠테이션 확대/축소 컨트롤 추가, 모바일 orientation 판단 로직 개선, FullscreenView를 독립 컴포넌트로 분리 및 PC 대응.

26. 03. 25.SEOJing
SEO Jing26. 03. 23.

Day 10 - 프레젠테이션 모드 안정화.

SEO Jing 개발 열째 날. 프레젠테이션 모드의 모바일 UX 문제들을 전면 수정. 퀴즈·코드블록·이미지·포스트목록 처리 개선, 롱프레스 UX 및 하단 바 레이아웃 안정화. 모바일 뷰포트·리스트 분할 문제 수정, 채움 비율 보수적으로 조정, 포스트 탐색기 자연 정렬 적용.

26. 03. 23.SEOJing
SEO Jing26. 03. 22.

Day 9 - 프레젠테이션 모드, 코드블럭 개선, 테스팅.

SEO Jing 개발 아홉째 날. 프레젠테이션 기능 추가, 퀴즈 구조 변경, 모바일 반응형, 코드블럭 사용성, 테스팅 도입.

26. 03. 22.SEOJing
SEO Jing26. 03. 21.

Day 8 - 아티클 퀴즈와 스터디 자료.

SEO Jing 개발 여덟째 날. 아티클 퀴즈 디자인시스템 구현과 스터디 대면 자료 작성.

26. 03. 21.SEOJing
SEO Jing26. 03. 20.

Day 7 - Front Matter CMS와 관련 게시물.

SEO Jing 개발 일곱째 날. Front Matter CMS 설치와 관련 게시물 이동 탐색기 구현.

26. 03. 20.SEOJing
SEO Jing26. 03. 18.

Day 6 - 스터디 자료 작성과 데스크탑 비율 수정.

SEO Jing 개발 여섯째 날. 데스크탑 비율 수정과 씨랩 스터디 사전 진단 자료 작성.

26. 03. 18.SEOJing
SEO Jing26. 03. 17.

Day 5 - shiki 제거, MDX 모듈화, 그리고.

SEO Jing 개발 다섯째 날. shiki를 rehype-prism-plus로 교체하고, gray-matter 직접 구현, MDX 모듈화, 페이지 내 검색, 테이블 디자인시스템까지.

26. 03. 17.SEOJing
SEO Jing26. 03. 16.

Day 4 - 배포와 CI/CD.

SEO Jing 개발 넷째 날. lint, codecov, Cloudflare 배포, fs 런타임 이슈.

26. 03. 16.SEOJing
SEO Jing26. 03. 15.

엄청난 피드백.

CLI 코드 리뷰에서 받은 피드백과 전체 코드 수정 계획을 정리했다.

26. 03. 15.SEOJing
SEO Jing26. 03. 15.

생각보다 어려웠던 댓글, 완독 로컬스토리지.

localStorage만으로 글 읽기 추적, 스크롤 진행률, 댓글 감지를 구현한 과정을 정리했다.

26. 03. 15.SEOJing
SEO Jing26. 03. 15.

MDX 관련 이슈 노트.

블로그 디테일 페이지에서 MDX를 렌더링하기 위해 검토한 라이브러리들과 최종 선택 과정.

26. 03. 15.SEOJing
SEO Jing26. 03. 15.

Day 3 - MDX 이슈, 반응형, 다크모드.

SEO Jing 개발 셋째 날. MDX 라이브러리 이슈, 반응형, 코드블럭, 댓글, 다크모드, 코드 리뷰.

26. 03. 15.SEOJing
SEO Jing26. 03. 14.

디자인 시스템을 구축할 때 주의할 점.

디자인 시스템 구현 시 파일 구조, 디자인 토큰, 유의 사항을 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

폰트는 왜 메인 페이지에서만 적용이 안되고 있었을까?.

Tailwind v4 환경에서 폰트가 메인 페이지에서만 적용되지 않던 원인과 Hydration Mismatch 이슈를 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

MDX DOM 트리 파싱하기.

MDX 파일의 경로 탐색 로직과 콘텐츠 트리 생성 과정을 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

결국 Node.js 까지 와버렸다.

MDX 파일 구조를 JSON으로 변환하기 위해 Node.js의 fs 모듈을 배워봤다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

Day 2 - 블로그 스켈레톤과 MDX 파싱.

SEO Jing 개발 둘째 날. 디자인 시스템 확장, 블로그 스켈레톤, 폰트 이슈 해결.

26. 03. 14.SEOJing
SEO Jing26. 03. 13.

전체적인 플로우.

SEO Jing 프로젝트의 기술 스택 선정과 전체적인 개발 플로우 정리.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

Storybook으로 디자인 시스템 테스팅하기.

Storybook의 사용법과 디자인 시스템 개발에서의 장점을 정리했다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

MDX가 뭘까?.

MDX의 개념과 블로그에서 활용하는 이유를 정리했다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

Day 1 - 디자인 컨셉과 디자인 시스템.

SEO Jing 개발 첫째 날. 디자인 컨셉 설정과 디자인 시스템 구축을 시작했다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

기술 블로그를 직접 제작하게 된 이유.

SEO Jing을 개발하게 된 이유입니다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

왜 자꾸 프로젝트가 중단되는지.

프로젝트가 중단되는 이유에 대한 자기 회고입니다.

26. 03. 13.SEOJing