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 강좌 / 넘치는 콘텐츠와 긴 문자열 처리하기

같은 내용에 visible·hidden·auto·scroll을 적용해 넘침 처리를 비교합니다. 긴 URL 줄바꿈과 실제 말줄임표 예제를 실행하고, 원문 보존과 키보드 스크롤을 함께 확인합니다.

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

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

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

CSS 강좌 / 문법: 선택자·선언·주석과 오류 처리

CSS 강좌 / 문법: 선택자·선언·주석과 오류 처리

CSS의 선택자·선언·구분 기호·주석을 예제로 설명합니다. 잘못된 속성값과 세미콜론 누락을 비교하고, 실행 가능한 예제와 오류 수정 실습으로 브라우저가 적용한 결과를 확인합니다.

CSS 강좌 / z-index와 쌓임 맥락 이해하기

CSS 강좌 / z-index와 쌓임 맥락 이해하기

z-index의 적용 조건과 부모 쌓임 맥락을 실제로 겹치는 예제로 이해합니다. 자식과 부모의 숫자 변경을 비교하고, overflow 잘림과 겹침 순서를 구분해 문제를 해결합니다.

CSS / Tutorial / 마우스 호버 효과 / 서서히 길어지는 선 만드는 방법

CSS / Tutorial / 마우스 호버 효과 / 서서히 길어지는 선 만드는 방법

마우스를 올리면 선이 그려지는 효과를 만들어봅니다. 다음과 같이 사각형을 만듭니다. :before를 이용하여 선이 시작하는 위치를 정합니다. position 속성으로 선 위에 선을 그릴 수 있도록 설정합니다.

CSS 강좌 / 글꼴, 글자 크기, 굵기, 줄 간격 설정하기

CSS 강좌 / 글꼴, 글자 크기, 굵기, 줄 간격 설정하기

글꼴·글자 크기·굵기·줄 간격을 설정하고 실제 사용된 글꼴을 확인하는 방법을 설명합니다. 단위 없는 line-height와 em 값의 상속 차이를 실행 가능한 예제로 비교합니다.

CSS 강좌 / 표 꾸미기 / 정렬

CSS 강좌 / 표 꾸미기 / 정렬

표와 관련된 정렬에는 표 정렬, 셀 안의 내용 가로 정렬, 셀 안의 내용 세로 정렬이 있습니다. 기본 모양은 다음과 같습니다. 표(table) : 왼쪽 정렬 제목 셀(th) 안의 내용 가로 정렬 : 가운데 정렬 내용 셀(td) 안의 내용 세로 정렬 : 왼쪽 정렬 셀 안의 내용 세로 정렬 : 가운데 정렬

CSS 강좌 / 상속(inheritance)

CSS 강좌 / 상속(inheritance)

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

CSS 강좌 / ::before와 ::after로 가상 요소 꾸미기

CSS 강좌 / ::before와 ::after로 가상 요소 꾸미기

::before와 ::after로 HTML을 늘리지 않고 장식용 점과 선을 추가합니다. content·display·currentColor의 역할, 실제 적용 전후 화면, 전체 코드와 가상 요소가 안 보일 때의 점검 방법을 설명합니다.

CSS 강좌 / ul, ol 가운데 정렬하는 방법

CSS 강좌 / ul, ol 가운데 정렬하는 방법

목록 자체가 아니라 목록 안의 내용만 가운데 정렬할 때는 text-align 속성을 사용합니다. 목록 요소 자체를 가운데 정렬할 때는 margin 속성을 사용합니다. 만약 요소의 내용에 맞게 자동으로 크기가 정해지게 하고 싶으면 display 속성을 사용합니다.