CSS 폼 생성기

결과

폼은 대부분의 사이트에서 가장 많이 만지는 부분이자 많은 곳에서 가장 덜 다듬어진 부분입니다. 이 생성기는 일관된 시각 스타일로 완전한 스타일링 폼의 CSS를 출력합니다: 반응형 폼 그리드, 레이블 + 입력 쌍, 텍스트영역, 셀렉트, 그리고 또렷한 포커스 상태를 포함합니다. 액센트 색상, 모서리 반경, 간격을 설정한 뒤 스타일시트를 복사하세요. CSS는 네이티브 폼 시맨틱을 유지하므로 검증, 키보드 사용, 스크린 리더가 모두 동작합니다.

생성기 사용 방법

  1. 1

    액센트 색상 설정

    액센트 색상이 모든 필드의 포커스 링과 테두리 색상을 결정합니다.

  2. 2

    모서리 반경 선택

    반경은 입력, 텍스트영역, 셀렉트에 적용되어 모두 같은 모양을 공유합니다.

  3. 3

    간격 설정

    간격은 폼 그리드에서 필드 사이의 세로 공간을 조절합니다.

  4. 4

    CSS 복사

    HTML을 건드리지 않고 붙여넣고 변형할 수 있는 완전한 스타일시트.

기본 폼

<form class="form">
  <label class="field">
    <span class="field-label">Email</span>
    <input type="email" required>
    <span class="field-error">Please enter a valid email.</span>
  </label>

  <label class="field">
    <span class="field-label">Password</span>
    <input type="password" minlength="8" required>
  </label>

  <button type="submit" class="button">Sign up</button>
</form>
.field {
  display: block;
  margin-bottom: 1.25rem;
}
.field-label {
  display: block;
  font-weight: 500;
  margin-bottom: .25rem;
}
.field input {
  width: 100%;
  padding: .5rem .75rem;
  font: inherit;
  border: 1px solid #d1d5db;
  border-radius: 6px;
  background: #fff;
  transition: border-color 120ms, box-shadow 120ms;
}
.field input:focus-visible {
  outline: none;
  border-color: #2563eb;
  box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);
}
.field input:invalid:not(:placeholder-shown) {
  border-color: #dc2626;
}
.field-error { display: none; color: #dc2626; font-size: .875rem; margin-top: .25rem; }
.field input:invalid:not(:placeholder-shown) ~ .field-error { display: block; }

흔한 네 가지 스타일

스타일 무엇인가 적합한 곳
외곽선 입력 둘레의 테두리, 투명 배경 데스크톱 폼, 밀집 레이아웃
밑줄 아래쪽 테두리만 미니멀 / 에디토리얼 UI
채움 회색 배경, 테두리 없음 Material Design 영향 UI
플로팅 레이블 레이블이 안에 있다가 focus/값에 위로 애니메이션 모바일 우선, 랜딩 페이지

플로팅 레이블이 가장 예쁘지만 빈 상태 감지를 위해 추가 마크업이나 JavaScript가 필요합니다. 외곽선이 가장 범용적입니다.

접근성 체크리스트

  • 모든 입력에 보이는 레이블. placeholder를 유일한 레이블로 쓰지 마세요, focus 시 사라지고 대비에 실패합니다.
  • <label for> 또는 감싸는 <label>. 둘 다 유효하며, 감싸는 쪽이 약간 더 쉽습니다.
  • 포커스 표시. 대체 없이 outline: none을 절대 쓰지 마세요. 키보드 사용자에게 필요합니다.
  • 오류 메시지: 입력에 aria-describedby로 연결하세요. 오류를 색으로만 표시하지 마세요, 텍스트 메시지나 아이콘을 포함하세요.
  • 필수 필드: required 속성을 쓰세요. 시각 사용자를 위해 레이블에 시각 표시(별표)를 추가하세요.
  • 입력 타입: type="email", type="tel", type="url", type="number"를 쓰세요. 모바일 키보드가 적응합니다.
  • autocomplete 속성: autocomplete="email", autocomplete="current-password" 등. 사용자의 입력을 많이 줄여줍니다.

네이티브 검증 상태

CSS에는 폼 유효성을 위한 의사 클래스가 있습니다:

  • :required / :optional
  • :valid / :invalid
  • :in-range / :out-of-range (min/max가 있는 숫자 입력용)
  • :placeholder-shown (비어 있음, placeholder 보임)
  • :user-invalid (유효하지 않고 그리고 사용자가 상호작용함, 오류 스타일에 맞는 것)

:user-invalid 의사 클래스는 사용자가 무언가 한 뒤에만 오류를 보여주는 가장 깔끔한 방법으로, 상호작용 전 빨간 테두리를 피합니다. 2023년 무렵 모든 주요 브라우저에 지원이 들어왔습니다.

비활성화 상태

.field input:disabled {
  background: #f3f4f6;
  color: #9ca3af;
  cursor: not-allowed;
}

비활성화된 입력은 포커스도 제출도 되지 않습니다. 스크린 리더용으로 포커스 가능하게 하려면 readonly를 쓰세요, 폼이 값을 제출하지만 사용자는 편집할 수 없습니다.

자주 묻는 질문

아니요. placeholder는 사용자가 입력하는 즉시 사라지므로 레이블 역할을 할 수 없습니다. 또한 placeholder 텍스트는 보통 대비가 낮아 WCAG에 실패합니다. 보이는 레이블에 형식 힌트용 선택적 placeholder를 더하세요.

:invalid가 빈 필수 필드에 즉시 적용되기 때문입니다. (상호작용 인식) :user-invalid를 쓰거나, 구형 브라우저에서는 :invalid:not(:placeholder-shown)을 우회책으로 조합하세요.

appearance: none을 설정하고 기본 화살표를 제거한 뒤, 배경 이미지나 의사 요소 화살표가 있는 감싸는 span으로 직접 추가하세요. 안의 옵션 목록은 OS 스타일로 남고 CSS로 커스터마이즈할 수 없습니다.

둘 다요. HTML 검증(required, type, pattern)은 JavaScript 없이 단순한 경우를 잡습니다. JavaScript는 복잡한 규칙(비밀번호 강도, 필드 간 의존성)을 처리합니다. 항상 서버 검증도 하세요, 클라이언트 검증은 UX용이지 보안용이 아닙니다.

관련 도구