안녕하세요 웹 YB 임지수입니다!
이번 1주차 과제를 하면서 생긴 의문을 해결하고 싶어 찾아보다가 관련 내용을 정리해 보았습니다.
위 영상에서 각 메뉴를 클릭할 때마다 #all, #soong, #food 가 주소 뒤에 붙는 거 보이시나요?
깔끔한 URL을 유지하고 싶었는데 은근히 거슬리더라구요ㅎㅎ😅
저는 스크롤 이동을 위해 HTML의 href="#id" 형식을 사용했는데 이 방식 때문에 메뉴 클릭 시 해당 id가 URL 뒤에 그대로 드러나는 현상이 생겼습니다..
그래서 혹시 JavaScript 없이 HTML/CSS만으로 이 문제를 해결할 수는 없을까? 싶었지만...
결론부터 말씀드리자면 HTML/CSS만으로 주소창에서 #id 값을 숨기는 방법은 찾지 못했습니다🤯
결국 이 문제를 해결하기 위해서는 JavaScript의 개입이 불가피하다는 결론에 도달하게 되었습니다!
❓ 이유는 뭘까요?
HTML의 <a href="#id"> 형식은 브라우저의 기본 동작입니다.
→ 클릭하면 해당 id로 스크롤 이동
→ 주소창에 #id가 붙는다
이건 브라우저가 내부적으로 처리하는 동작이라 CSS로는 제거할 수가 없습니다.
즉, #id가 붙는 건 자연스러운 동작이고 우리가 별도로 막지 않으면 계속 붙게 됩니다.
💡 그럼 어떻게 해결할까요?
👉 preventDefault() + scrollIntoView() + history.replaceState() 사용하기!
<!-- 메뉴 -->
<section class="navigation">
<div class="menu-title">메뉴</div>
<ul class="menu-list">
<li><a href="#all" data-target="all">전체</a></li>
<li><a href="#soong" data-target="soong">숭이들</a></li>
<li><a href="#food" data-target="food">음식</a></li>
</ul>
</section>
<!-- ... -->
<section id="all" class="box-section"></section>
<section id="soong" class="box-section"></section>
<section id="food" class="box-section"></section>
<!-- ... -->
<script>
document.querySelectorAll(".menu-list a").forEach((link) => {
link.addEventListener("click", function (e) {
e.preventDefault();
const targetId = this.dataset.target;
const targetElement = document.getElementById(targetId);
if (targetElement) {
targetElement.scrollIntoView({ behavior: "smooth" });
window.history.replaceState(null, "", window.location.pathname);
}
});
});
</script>
📍 각각의 역할을 살펴보면
preventDefault()
링크 클릭 시 기본 이동 동작을 막아줍니다.
페이지가 순간 이동하거나 주소에 #id가 붙는 것을 방지할 수 있습니다.
scrollIntoView()
JavaScript로 특정 요소의 위치로 부드럽게 스크롤 이동시켜 줍니다.
사용자에게 더 자연스러운 스크롤 경험을 제공합니다.
history.replaceState()
주소창에 붙은 #id 해시 값을 제거하거나 변경할 때 사용합니다.
특히 브라우저 히스토리에 기록을 남기지 않기 때문에 뒤로 가기 버튼을 눌렀을 때도 깔끔하게 동작합니다.
📢 정리하면!
- preventDefault() → 기본 동작 막기
- scrollIntoView() → 자연스러운 스크롤 이동
- history.replaceState() → 주소창에 해시(#) 제거
이 세 가지를 조합하면 스크롤 이동은 그대로 유지하면서도 주소창은 깔끔하게 유지할 수 있습니다!
✨ 결과 화면
이제 주소 뒤에 #id 값이 안 붙는 거 보이시나요!!!
JS를 사용해서 해결한 거긴 하지만 깔끔해진 URL을 보게 돼서 만족스럽네요😄😄
'1주차' 카테고리의 다른 글
웹 스토리지 (Web Storage) (0) | 2025.04.11 |
---|---|
🧐 브라우저에 www.google.com을 입력하면 어떤 일이 일어날까? (0) | 2025.04.10 |
자바스크립트 이벤트 루프 (1) | 2025.04.10 |
웹접근성과 웹 표준 [시맨틱 태그, SEO] (0) | 2025.04.10 |
웹 브라우저의 작동 원리 (0) | 2025.04.09 |