HTML/CSS 5.2 · 5부. 실무
폼 꾸미기
브라우저가 그리는 것을 어디까지 바꿀 수 있는지 봅니다.
개념 설명
브라우저가 그리는 것을 고치기
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·radio | accent-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로 색만 바꾸는 것이 안전합니다.