HTML/CSS 5.2 · 5부. 실무

폼 꾸미기

브라우저가 그리는 것을 어디까지 바꿀 수 있는지 봅니다.

예상 학습 시간 16분 예제를 고치면 화면이 그대로 다시 그려집니다 난이도 중급
개념 설명

브라우저가 그리는 것을 고치기

1.6 에서 만든 폼은 브라우저 기본 모양이었습니다. 그 모양은 엔진마다 다릅니다 — 같은 select 가 크롬과 파이어폭스에서 다르게 보입니다.

어디까지 바꿀 수 있고 어디부터는 그대로 두는 편이 나은지 정리합니다.

최소 예제 · 편집 가능

입력 칸 꾸미기

<form class="form">
  <p>
    <label for="name">이름</label>
    <input id="name" name="name">
  </p>
  <p>
    <label for="memo">남길 말</label>
    <textarea id="memo" name="memo" rows="3"></textarea>
  </p>
  <p><button class="submit">보내기</button></p>
</form>
.form label {
  display: block;      /* 라벨을 칸 위로 올립니다 */
  margin-bottom: 4px;
  font-size: 0.9rem;
  color: #3b4252;
}

input, textarea {
  width: 100%;
  box-sizing: border-box;
  /* 폼 요소는 글꼴을 물려받지 않습니다. 직접 적어야 합니다. */
  font: inherit;
  padding: 8px 10px;
  border: 1px solid #ccc;
  border-radius: 8px;
}

input:focus, textarea:focus {
  outline: 2px solid #6e56cf;
  outline-offset: 1px;
  border-color: #6e56cf;
}

.submit {
  font: inherit;
  background: #6e56cf;
  color: #fff;
  border: 0;
  border-radius: 8px;
  padding: 10px 20px;
  cursor: pointer;
}

font: inherit 이 중요합니다. 폼 요소는 글꼴을 물려받지 않아, 적지 않으면 본문과 다른 글꼴로 나옵니다. 2.8 에서 상속되지 않는 것들을 다뤘는데 폼 요소는 그중에서도 예외적인 자리입니다.

최소 예제 · 편집 가능

상태를 표시하기

1.6 에서 required 를 배웠습니다. 그 상태를 CSS 로 가려낼 수 있습니다.

<p>전자 메일 칸에 아무 글자나 넣어 보십시오</p>
<p>
  <label class="req" for="em">전자 메일</label>
  <input id="em" type="email" required>
</p>
<p>
  <label for="off">고칠 수 없는 칸</label>
  <input id="off" value="고정 값" disabled>
</p>
label { display: block; margin-bottom: 4px; }
input { font: inherit; padding: 8px; border: 1px solid #ccc; border-radius: 6px; }

/* 필수 표시를 마크업 없이 붙입니다(2.3) */
.req::after { content: " *"; color: #c92a2a; }

/* 값이 있는데 모양이 맞지 않을 때만 빨갛게 */
input:not(:placeholder-shown):invalid {
  border-color: #c92a2a;
  background: #fff5f5;
}

/* 고칠 수 없는 칸 */
input:disabled { background: #f1f3f5; color: #868e96; cursor: not-allowed; }

:invalid 만 적으면 안 됩니다. 화면을 열자마자 빈 칸이 모두 빨개집니다. 아직 아무것도 적지 않은 사람에게 오류를 알리는 셈입니다. :not(:placeholder-shown) 을 함께 적어 무언가 적은 뒤에만 표시하십시오.

상세 사용법

어디까지 바꿀 수 있는가

요소CSS 로
input[type=text]·textarea·button거의 다 됩니다.
select바깥 상자는 되지만 펼쳐지는 목록은 안 됩니다.
checkbox·radioaccent-color 로 색만 바꾸는 것이 안전합니다.
date·file·range엔진마다 크게 다릅니다. 기본에 맡기는 편이 낫습니다.
style.css
/* 한 줄로 확인 상자와 선택 단추의 색을 맞춥니다 */
input[type="checkbox"], input[type="radio"] {
  accent-color: #6e56cf;
}

확인 상자를 처음부터 다시 그리는 방법도 있지만 키보드 조작과 화면 읽기 프로그램까지 직접 챙겨야 합니다. 색만 바꾸는 것으로 충분한 경우가 많습니다.

흔한 실수

세 가지

  • font: inherit 를 빠뜨립니다. 입력 칸만 다른 글꼴로 나옵니다. 화면 전체의 글꼴을 맞췄는데 폼만 어긋나면 이것입니다.
  • :invalid 를 그냥 적습니다. 아무것도 적지 않은 칸이 처음부터 빨개집니다.
  • 초점 표시를 지웁니다. 폼은 키보드로 다니는 일이 가장 잦은 자리입니다 (5.1).
실습 문제

직접 해보기

1. 로그인 폼 꾸미기 난이도 중

전자 메일과 비밀번호 칸을 가진 폼을 꾸미십시오. 라벨은 칸 위에, 초점이 가면 테두리가 브랜드 색이 되게 하고, 단추는 폭 전체를 차지하게 하십시오.

라벨을 위로 올리는 것은 display: block 입니다. 폼 요소에는 font: inherit 를 잊지 마십시오.
:root { --brand: #6e56cf; } .form label { display: block; margin-bottom: 4px; } .form input { width: 100%; box-sizing: border-box; font: inherit; padding: 10px; border: 1px solid #ccc; border-radius: 8px; margin-bottom: 12px; } .form input:focus { border-color: var(--brand); outline: 2px solid var(--brand); outline-offset: 1px; } .form button { width: 100%; font: inherit; background: var(--brand); color: #fff; border: 0; border-radius: 8px; padding: 12px; cursor: pointer; }
요약

정리

  • 폼 요소는 글꼴을 물려받지 않습니다. font: inherit 를 적습니다.
  • :invalid:not(:placeholder-shown) 과 함께 사용합니다.
  • select·date 는 엔진마다 다릅니다. 기본에 맡기는 편이 낫습니다.
  • 확인 상자는 accent-color 로 색만 바꾸는 것이 안전합니다.