AD JB Toolbox 01

CSS 강좌 / 링크 꾸미는 방법

CSS로 링크를 꾸밀 때는 평소에도 링크임을 알아볼 수 있는 표시를 남기고, 방문 여부·마우스·키보드 상태를 각각 설정합니다. 기본 밑줄을 유지하고 :link·:visited·:hover·:active의 색상과 :focus-visible의 윤곽선을 구분하면 이동할 수 있는 대상과 현재 조작 중인 대상을 확인하기 쉽습니다.

링크의 기본 모양을 먼저 정하기

a {
  text-decoration: underline;
  text-underline-offset: 0.15em;
}

링크는 href가 있는 a 요소로 만듭니다. 글자를 파란색으로 칠하는 것만으로는 실제 링크가 되지 않습니다. 밑줄은 색을 구분하기 어려운 독자에게도 이동 가능한 부분을 알려 줍니다. text-underline-offset은 글자와 밑줄의 간격을 조절합니다. 여기서 em은 링크의 글자 크기를 기준으로 합니다.

“클릭”처럼 목적지를 알 수 없는 문구보다 “방문 안내”처럼 연결 내용을 설명하는 이름을 사용하세요. 일반 링크를 버튼처럼 보이게 만들기 전에 탐색인지 동작인지 구분해야 합니다. 다른 문서로 이동하는 요소는 링크, 현재 화면에서 동작을 실행하는 요소는 보통 button이 적합합니다.

네 가지 색상 상태와 규칙 순서

선택자 적용되는 상황 예제에서 보이는 변화
a:link 방문하지 않은 목적지를 가진 링크 파란색 #1756a9
a:visited 브라우저가 방문한 것으로 취급하는 목적지 보라색 #6b438c
a:hover 포인터가 링크 위에 있음 붉은색 #b53239
a:active 링크를 활성화하는 동안, 예: 마우스를 누르는 중 진한 붉은색 #8a2630
a:link { color: #1756a9; }
a:visited { color: #6b438c; }
a:hover { color: #b53239; }
a:active { color: #8a2630; }

여러 상태가 동시에 맞을 수 있습니다. 방문한 링크 위에 마우스를 올리면 visited와 hover가 겹칩니다. 위 예제처럼 선택자 우선순위가 같고 같은 속성을 지정했다면 뒤에 있는 규칙이 적용됩니다. 따라서 link → visited → hover → active 순서를 쓰면 방문 여부와 관계없이 마우스를 올린 색과 누르는 색을 확인하기 쉽습니다. 각 상태의 선택 조건은 상태를 선택하는 가상 클래스에서 다른 조건 선택자와 함께 비교합니다.

이 순서가 모든 규칙을 이기는 것은 아닙니다. 더 구체적인 선택자나 다른 캐스케이드 조건이 있으면 결과가 달라집니다. 색이 바뀌지 않을 때는 개발자 도구에서 어떤 color 선언이 적용되는지 확인하세요. :active는 선택한 메뉴를 계속 표시하는 상태가 아닙니다. 현재 페이지 메뉴 표시가 필요하면 별도 클래스나 aria-current 같은 의미 표시를 함께 검토합니다.

키보드 포커스는 눈에 보이게 남깁니다

a:focus-visible {
  outline: 3px solid #e58c1f;
  outline-offset: 3px;
}

포커스는 키보드 입력을 받을 대상을 뜻합니다. Tab으로 링크에 이동했을 때 현재 위치가 보이지 않으면 사용자가 어디에서 Enter를 눌러야 할지 알기 어렵습니다. :focus-visible은 브라우저가 포커스 표시가 필요하다고 판단하는 상황에 적용됩니다. 보통 키보드 이동에서 나타나지만 모든 클릭·입력 상황을 단순히 두 종류로 나누는 것은 아닙니다. 링크와 같은 초점 원리를 입력 요소에 적용할 때는 입력창의 초점과 오류 상태를 구분하세요.

outline은 요소 주변에 윤곽선을 그립니다. outline-offset은 요소와 선 사이의 간격입니다. 원래 포커스 표시를 outline: none으로 없애고 대체 표시를 제공하지 않는 방식은 피하세요. 예제는 밑줄과 윤곽선을 동시에 유지합니다. 동작 조건은 MDN의 :focus-visible 설명을 참고하세요.

두 파일로 실행하는 전체 예제

같은 폴더에 links.html과 visit.html을 만듭니다. 첫 코드는 links.html, 다음 코드는 visit.html에 UTF-8로 저장합니다. 첫 번째 링크는 실제 별도 파일로 이동하고, 두 번째 링크는 현재 페이지 안의 운영 시간 제목으로 이동합니다.

<!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>링크 상태 실습</title>
  <style>
    body { margin: 24px; font: 1rem/1.7 sans-serif; color: #333; }
    main { max-width: 65ch; }
    a { text-decoration: underline; text-underline-offset: 0.15em; }
    a:link { color: #1756a9; }
    a:visited { color: #6b438c; }
    a:hover { color: #b53239; }
    a:active { color: #8a2630; }
    a:focus-visible { outline: 3px solid #e58c1f; outline-offset: 3px; }
    nav li + li { margin-block-start: 0.7em; }
  </style>
</head>
<body>
  <main>
    <h1>작은 정원 방문 안내</h1>
    <nav aria-label="안내 링크"><ul>
      <li><a href="visit.html">별도 페이지의 방문 안내</a></li>
      <li><a href="#hours">이 페이지의 운영 시간</a></li>
    </ul></nav>
    <h2 id="hours">운영 시간</h2>
    <p>오전에는 식물 관리 작업을 합니다. 이 예제에서 시간은 가상 안내문이며 실제 시설 정보가 아닙니다.</p>
    <p>링크 위에 마우스를 올리거나 키보드 Tab으로 이동해 색상과 윤곽선을 확인하세요.</p>
  </main>
</body>
</html>
<!doctype html>
<html lang="ko"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>방문 안내</title></head>
<body><h1>방문 안내 페이지</h1><p>첫 번째 링크가 여는 별도 문서입니다.</p><p><a href="links.html">링크 실습으로 돌아가기</a></p></body></html>

마우스와 키보드로 결과 확인하기

  1. links.html을 열고 첫 번째 링크 위에 마우스를 올립니다. 붉은색으로 바뀌는지 확인하세요. 마우스 버튼을 누른 채 유지하면 진한 붉은색을 볼 수 있습니다. 놓는 순간 페이지가 이동하므로 클릭이 끝난 뒤에는 active 색이 계속 남지 않습니다.
  2. 첫 링크를 열고 브라우저 뒤로 가기로 돌아옵니다. 포인터를 링크 밖으로 옮긴 뒤 방문 색을 확인하세요. 새 프로필·비공개 창·방문 기록 삭제 상태에서는 결과가 달라질 수 있고, 이미 방문한 주소는 처음부터 방문 상태일 수 있습니다.
  3. 포인터를 링크 밖에 두고 Tab으로 첫 링크에 이동합니다. 주황색 윤곽선이 나타나는지 확인하고, 다시 Tab으로 다음 링크에 이동합니다. Shift+Tab은 반대 순서로 이동합니다.
  4. 첫 번째 링크에 포커스를 둔 채 Enter를 누릅니다. visit.html이 열리는지 확인하세요. 돌아온 뒤 두 번째 링크를 Enter로 활성화하면 운영 시간 제목으로 이동해야 합니다.

visited의 표시에는 개인정보 보호를 위한 제한이 있습니다. color 같은 일부 색상 속성은 사용할 수 있지만, 방문 여부를 알아내려고 크기·이미지 등을 자유롭게 바꿀 수는 없습니다. 브라우저는 getComputedStyle() 등에서 방문한 색을 그대로 알려 주지 않을 수 있으므로 계산된 스타일 값만으로 방문 이력을 판정하지 마세요. 세부 제한은 MDN의 :visited와 개인정보 보호 설명에 설명되어 있습니다.

상태 변화가 보이지 않을 때

  • 링크 이동이 안 되면 href의 파일명과 visit.html의 위치를 확인합니다. 두 파일을 같은 폴더에 두었는지부터 점검하세요.
  • 방문 색 대신 호버 색만 보이면 포인터를 링크 밖으로 옮깁니다. 개발자 도구에서 강제로 hover를 켰다면 해제합니다.
  • 키보드 이동이 안 되면 href가 있는 실제 링크인지 확인합니다. 브라우저·운영체제의 키보드 탐색 설정도 영향을 줄 수 있습니다.
  • 포커스 선이 잘리면 부모 요소의 overflow와 주변 공간을 확인합니다. 모바일 터치에서는 hover가 데스크톱과 다르게 동작할 수 있으므로 필수 정보를 호버에서만 보여 주지 않습니다.

규칙 순서를 바꾸는 실습을 마치면 원래 순서로 되돌려 두세요. 개발자 도구에서 임시로 수정한 CSS는 새로고침하면 파일에 저장된 값으로 돌아가지만, 방문 기록은 새로고침만으로 초기화되지 않습니다.

같은 카테고리의 다른 글
CSS 강좌 / 모바일·큰 화면·확대 보기에서 레이아웃 점검하기

CSS 강좌 / 모바일·큰 화면·확대 보기에서 레이아웃 점검하기

점검용 페이지에서 화면 폭, 확대, 긴 문자열과 키보드 조작을 확인합니다. 가로 넘침과 글자 잘림을 재현하고 원인 확인부터 수정·재점검까지 실습합니다.

CSS 강좌 / 표 꾸미기 / 테두리

CSS 강좌 / 표 꾸미기 / 테두리

테두리는 border 속성으로 만듭니다. table, th, td 요소에 적용할 수 있습니다. tr 요소에는 적용되지 않습니다.

CSS 강좌 / 테두리, 둥근 모서리, 그림자 만들기

CSS 강좌 / 테두리, 둥근 모서리, 그림자 만들기

테두리와 윤곽선의 차이, 둥근 모서리, 그림자의 이동·흐림·퍼짐을 설명합니다. 원·타원과 부모 영역에서 그림자가 잘리는 상황을 실제 예제로 비교합니다.

CSS / Tutorial / 마우스 호버 효과 / 텍스트 나오게 하는 방법

CSS / Tutorial / 마우스 호버 효과 / 텍스트 나오게 하는 방법

CSS로 특정 요소에 마우스를 올렸을 때 보이지 않던 특정 요소가 보이게 할 수 있습니다. 아래는 문단에 마우스를 올렸을 때 div 요소가 나오게 하는 예제입니다. div 요소 안에 텍스트가 있지만, 텍스트가 아닌 이미지 등 다른 것도 가능합니다.

CSS 강좌 / 큰 스타일시트 정리하기: 파일 구성·중첩·레이어

CSS 강좌 / 큰 스타일시트 정리하기: 파일 구성·중첩·레이어

역할별 CSS 파일 연결과 네이티브 중첩, 캐스케이드 레이어를 실행 가능한 작은 프로젝트로 익힙니다. 선택자 충돌을 비교하고 원래 설정으로 복원하는 실습을 제공합니다.

CSS 강좌 / position의 값이 fixed일 때 가운데 정렬하는 방법

CSS 강좌 / position의 값이 fixed일 때 가운데 정렬하는 방법

position의 fixed를 이용하여 요소의 위치를 고정시킬 수 있습니다. 예를 들어 상단에 고정되는 메뉴바를 만들 때 사용합니다. 그런데, fixed를 하면 요소가 한쪽으로 치우칩니다. 만약 가운데에 위치시키고 싶다면 어떻게 할까요? transform 속성으로 해결할 수 있습니다.

CSS 강좌 / 상속(inheritance)

CSS 강좌 / 상속(inheritance)

CSS 속성은 상속하는 속성과 상속하지 않는 속성이 있습니다. 상속하는 속성은 자식 요소에 영향을 미칩니다. 상속하지 않는 속성은 자식 요소에 영향을 미치지 않습니다.

CSS 강좌 / @keyframes 애니메이션과 움직임 줄이기

CSS 강좌 / @keyframes 애니메이션과 움직임 줄이기

키프레임의 중간 상태와 재생 시간·지연·방향·횟수·종료 상태를 비교합니다. 일시 정지와 움직임 감소 설정까지 전체 예제로 확인합니다.

CSS 강좌 / 박스 모델과 margin, padding, border 이해하기

CSS 강좌 / 박스 모델과 margin, padding, border 이해하기

콘텐츠·padding·border·margin의 위치와 너비 계산을 도해와 실행 예제로 설명합니다. 여백 축약 규칙과 세로 margin 합치기를 비교하고 개발자 도구에서 실제 크기를 확인합니다.

CSS / Tutorial / 인용문(Blockquote) 꾸미는 방법

CSS / Tutorial / 인용문(Blockquote) 꾸미는 방법

blockquote 요소의 기본 모양은 양쪽에 여백이 있는 것입니다. 그대로 사용하기보다는 여러 가지 모양으로 꾸미는 것이 일반적입니다. 다음은 아래와 같은 인용문을 꾸미는 몇 가지 예제입니다.