링크와 버튼이 작동하지 않을 때 원인과 해결법
Finipage 가이드 · HTML 파일을 코드 없이 고치는 편집기. Finipage 열기
페이지는 다 된 것 같은데 "문의하기" 버튼을 눌러도 반응이 없고, 메뉴의 "서비스"를 누르면 서비스 섹션이 아니라 맨 위로 올라가고, 노트북에서 전화번호를 누르면 오류 창이 뜹니다. 링크 문제는 대개 알 수 없는 원인에서 나오지 않습니다. 거의 전부가 몇 가지 정해진 유형이고, 링크마다 href를 읽어 보고 브라우저가 그것을 어떻게 해석하는지만 알면 찾아낼 수 있습니다.
상대 주소와 절대 주소
href로 목적지를 가리키는 방법은 세 가지이고, 이것을 섞어 쓰는 것이 "내 컴퓨터에서는 되는데 올리면 안 되는" 링크, 또는 그 반대 경우의 가장 흔한 원인입니다.
| 이렇게 쓰면 | 브라우저가 가는 곳 |
|---|---|
https://other-site.com/page | 적힌 주소 그대로. 절대 주소입니다. |
contact.html | 지금 페이지와 같은 폴더의 파일. 상대 주소입니다. |
../contact.html | 한 단계 위 폴더의 파일. 상대 주소입니다. |
/contact.html | 지금 사이트의 맨 위(루트). 루트 기준 주소입니다. |
되풀이해서 나오는 실수는 세 가지입니다.
https://를 빠뜨림:href="www.instagram.com/yourshop"은 외부 링크가 아닙니다. 브라우저는 이것을 상대 경로로 읽어yoursite.com/www.instagram.com/yourshop으로 가고, 결과는 "404 Not Found"입니다. 외부 링크 앞에는 반드시https://를 붙이십시오.- 루트 기준 주소를 파일로 열어 시험함:
index.html을 더블클릭하면 페이지가 내 디스크에서 열리고, 이때/contact.html은 프로젝트 폴더가 아니라 드라이브의 맨 위를 뜻합니다. 같은 링크가 인터넷에 올리면 잘 될 수도 있습니다.contact.html같은 상대 주소는 양쪽 모두에서 동작합니다. - 하위 경로에 올린 사이트에서 루트 기준 주소를 씀: 사이트가
username.github.io/project/처럼 하위 경로에 있다면/contact.html은 프로젝트 밖의username.github.io/contact.html을 가리킵니다. 이것도 상대 주소로 쓰면 피할 수 있습니다.
섹션 이동 링크가 엉뚱한 곳으로 갈 때
한 페이지짜리 사이트의 메뉴는 보통 <a href="#services"> 같은 앵커 링크입니다. 누르면 id가 services인 요소로 화면이 이동합니다. 반응이 없거나 맨 위로 올라간다면 다음을 차례로 확인하십시오.
- 그 id가 실제로 있는지: HTML에서
id="services"를 검색합니다. 섹션 이름을 바꿨거나 지웠거나, 템플릿에서는id="service"였다면 링크가 도착할 곳이 없습니다. - 철자가 대소문자까지 똑같은지:
#Services와id="services"는 서로 다릅니다. id에는 띄어쓰기를 넣지 말고id="contact-form"처럼 하이픈을 쓰십시오. - 같은 id가 한 번만 쓰였는지: 섹션을 복제했다면 같은 id가 두 군데 붙어 있을 수 있고, 그러면 브라우저는 첫 번째로 갑니다.
- 링크가
#하나뿐이지 않은지: 뒤에 아무것도 없는href="#"은 "이 페이지 맨 위"라는 뜻입니다. 템플릿이 아직 채우지 않은 링크 자리에 넣어 두는 값입니다.
id="문의"처럼 한글 id도 HTML 문법상 문제는 없지만, 주소를 공유하면 주소창에서 긴 인코딩 문자열로 바뀝니다. 짧은 영문 id가 다루기 편합니다.
이동은 되는데 섹션 제목이 상단 고정 메뉴에 가려진다면 스타일 문제입니다. 도착할 섹션에 CSS scroll-margin-top을 주면 메뉴 높이만큼 여유가 생깁니다.
새 탭, 전화번호, 메일 주소
새 탭으로 열기
target="_blank"를 붙이면 링크가 새 탭에서 열립니다. 예전에는 이렇게 열린 페이지가 window.opener로 원래 페이지에 접근할 수 있어서, rel="noopener"를 함께 쓰라는 권고가 생겼습니다.
<a href="https://blog.naver.com/yourshop" target="_blank" rel="noopener">블로그</a>
MDN에 따르면 지금 브라우저는 target="_blank"만 있어도 noopener가 붙은 것처럼 동작합니다. 그래도 명시해 두면 손해가 없고 오래된 브라우저까지 대비할 수 있습니다. 외부 사이트는 새 탭으로 열어도 좋지만, 내 사이트 안의 링크는 같은 탭에서 여는 편이 낫습니다. 같은 사이트 탭이 여러 개 쌓이면 방문자가 헷갈립니다.
전화 링크와 메일 링크
tel: 링크를 쓰면 휴대폰 방문자가 한 번 눌러 바로 전화를 걸 수 있습니다. 국제 형식으로 쓰는 것이 가장 확실합니다. 더하기 기호, 국가번호, 그리고 맨 앞 0을 뺀 번호 순서입니다. 한국의 국가번호는 82입니다.
| 국내 표기 | 링크 |
|---|---|
| 02-1234-5678 (서울 유선) | tel:+82-2-1234-5678 |
| 010-1234-5678 (휴대폰) | tel:+82-10-1234-5678 |
| 1588-1234 (대표번호) | tel:1588-1234 |
하이픈은 넣어도 되고 무시됩니다. 띄어쓰기와 괄호는 빼는 편이 좋습니다. 화면에 보이는 글자는 익숙한 국내 표기 그대로 두면 됩니다. tel:02-1234-5678 같은 국내 형식도 한국에서 쓰는 휴대폰에서는 대개 제대로 걸리지만, 국제 형식은 어디서나 통합니다. 1588 같은 대표번호는 국내에서만 걸 수 있습니다. 컴퓨터에서 tel: 링크를 누르면 설치된 통화 앱이 열리거나 아무 일도 일어나지 않으므로, 번호를 링크 안에만 숨겨 두지 말고 글자로도 보여 주십시오.
mailto: 링크는 방문자의 메일 프로그램을 엽니다.
<a href="mailto:hello@yourcompany.co.kr?subject=%EA%B2%AC%EC%A0%81%20%EB%AC%B8%EC%9D%98">메일 보내기</a>
제목의 띄어쓰기는 %20으로 써야 하고, 한글 제목은 위처럼 퍼센트 인코딩해 두는 것이 안전합니다(예시는 "견적 문의"). 공용 컴퓨터나 회사 컴퓨터에는 메일 프로그램이 설정되지 않은 경우가 많아, 눌러도 눈에 보이는 반응이 없을 수 있습니다. 주소를 글자로도 보여 주어 복사할 수 있게 하십시오.
진짜 버튼 요소일 때
버튼처럼 보이는 것은 HTML에서 두 가지 중 하나입니다. 버튼 모양으로 꾸민 <a>는 링크라서 스크립트 없이도 href로 이동합니다. 반면 <button> 요소는 그 자체로는 아무 일도 하지 않습니다. 자바스크립트가 반응을 붙여 주거나, <form> 안에 있어야 기본 동작인 폼 제출을 합니다.
그래서 템플릿의 "시작하기"가 <button>이고 그것을 처리하던 스크립트가 지워졌거나 처음부터 없었다면, 눌러도 반응이 없습니다. 다른 페이지나 섹션으로 보내는 것이 목적이라면 링크로 바꾸십시오. <a href="#contact" class="btn">처럼 쓰고 class를 그대로 두면 모양도 유지됩니다. 폼 안의 버튼이라면 정적 페이지는 혼자서 폼 제출을 받을 수 없으므로 정적 페이지에 문의 폼 달기를 보십시오.
HTML을 읽는 김에 example.com, href="#", javascript:void(0)도 검색해 보십시오. 모두 실제 목적지를 받지 못한 링크입니다.
서버에서는 파일 이름의 대소문자를 구분합니다
Windows와 macOS는 보통 About.html과 about.html을 같은 파일로 취급합니다. 대부분의 웹 서버는 그렇지 않습니다. 실제 파일 이름이 about.html인데 링크가 About.html이면, 내 컴퓨터에서는 열려도 올린 뒤에는 404가 납니다. 폴더와 이미지도 같습니다. Images/Logo.PNG와 images/logo.png는 다른 주소입니다. 가장 간단한 규칙은 파일 이름을 소문자와 하이픈으로만, 띄어쓰기 없이 짓고, 링크를 그 이름과 정확히 맞추는 것입니다. 이미지에서 생기는 같은 문제는 HTML 파일에서 이미지가 안 보일 때에 정리했습니다.
공개 전에 링크를 전부 점검하는 법
- 임시 주소라도 먼저 인터넷에 올린 뒤 그곳에서 시험합니다. 파일로 열어 시험하면 루트 기준 주소 문제와 대소문자 문제가 드러나지 않습니다.
- 머리글, 본문, 바닥글의 링크를 하나씩 전부 눌러 봅니다. 섹션 링크는 맞는 섹션이 화면 위쪽에 오는지 확인합니다.
- 휴대폰으로 전화번호와 메일 링크를 눌러 봅니다. 전화 앱에 맞는 번호가 뜨는지 확인합니다.
- 텍스트 편집기로 HTML을 열어
href="#",example.com,http://(대개https://여야 합니다), 템플릿 제작자 도메인을 검색합니다. - 페이지가 많다면 W3C Link Checker 같은 자동 점검 도구로 공개된 페이지를 훑어 끊어진 링크 목록을 받을 수 있습니다.
Finipage에서 링크 고치기
Finipage로 편집한다면 링크나 버튼을 클릭하고 오른쪽 속성 패널의 링크 칸에서 주소를 바꾸면 됩니다. 이 칸에는 입력한 주소가 그대로 들어갑니다. https://로 시작하는 웹 주소, #services 같은 섹션 주소, 위에서 설명한 형식의 tel: · mailto: 링크 모두 됩니다. 이 글에서 다룬 문제 대부분은 이것으로 고칠 수 있습니다. <button>을 <a>로 바꾸는 일은 요소 자체를 바꾸는 것이라 메모장이나 VS Code 같은 텍스트 편집기에서 HTML을 직접 고칩니다. 또 Finipage는 편집 중에 페이지의 자바스크립트를 실행하지 않으므로, 스크립트로 동작하는 버튼은 브라우저에서는 잘 되더라도 편집기 안에서는 반응하지 않습니다.
링크 정리가 끝나면 주소를 알리기 전에 랜딩 페이지 공개 전 점검표의 나머지 항목도 확인하십시오.
내 파일로 바로 해 보려면 Finipage 편집기를 여세요. 브라우저에서 돌아가고 파일은 내 기기 밖으로 나가지 않습니다.