본문 바로가기
명함 만들기 캐릭터 모음 16가지 디자인 · PNG / SVG / PDF

프로필 편집

이미 있는 값을 고치는 화면 — 빈 칸이 아니라 지금 값이 들어 있어야 하고, 무엇이 못 바뀌는지도 보여야 한다.

폼 · 패턴

실제 미리보기

출처

<form class="dc-pfe" action="#">
  <header class="dc-pfe__bar">
    <button class="dc-pfe__back" type="button">
      <span aria-hidden="true">‹</span><span class="dc-sr">취소하고 뒤로</span>
    </button>
    <h1 class="dc-pfe__bartitle">프로필 편집</h1>
  </header>
  <div class="dc-pfe__body">
    <div class="dc-pfe__avatar">
      <span class="dc-pfe__face" aria-hidden="true">민</span>
      <button class="dc-pfe__cam" type="button">
        <span aria-hidden="true">+</span><span class="dc-sr">사진 바꾸기</span>
      </button>
    </div>
    <p class="dc-pfe__avatarhint">얼굴이 보이는 사진이면 사장님이 더 빨리 연락합니다.</p>
    <div class="dc-pfe__field">
      <label class="dc-pfe__label" for="dc-pfe-name">이름</label>
      <input class="dc-pfe__input" id="dc-pfe-name" type="text" autocomplete="name" value="김민수" />
    </div>
    <div class="dc-pfe__field">
      <label class="dc-pfe__label" for="dc-pfe-nick">닉네임</label>
      <input class="dc-pfe__input" id="dc-pfe-nick" type="text" value="민수" aria-describedby="dc-pfe-nickhint" />
      <p class="dc-pfe__hint" id="dc-pfe-nickhint">다른 사람에게 보이는 이름입니다.</p>
    </div>
    <div class="dc-pfe__field">
      <label class="dc-pfe__label" for="dc-pfe-bio">소개</label>
      <textarea class="dc-pfe__area" id="dc-pfe-bio" rows="3" maxlength="80" aria-describedby="dc-pfe-cnt">용접 3년, 평택에서 일합니다. 주말도 가능합니다.</textarea>
      <p class="dc-pfe__count" id="dc-pfe-cnt">28 / 80자</p>
    </div>
    <div class="dc-pfe__locked">
      <span class="dc-pfe__lockk">휴대폰 번호</span>
      <span class="dc-pfe__lockv">010-1234-5678</span>
      <button class="dc-pfe__change" type="button">변경<span class="dc-sr"> — 휴대폰 번호</span></button>
    </div>
  </div>
  <div class="dc-pfe__bottom">
    <button class="dc-pfe__go" type="submit">저장</button>
  </div>
</form>
.dc-pfe { display:flex; flex-direction:column; height:660px; overflow:hidden; background:var(--dc-bg); border:1px solid var(--dc-line); border-radius:var(--dc-r-md); font-family:var(--dc-font); }
.dc-pfe__bar { flex:0 0 auto; display:flex; align-items:center; gap:var(--dc-1); padding:calc(var(--dc-safe-top) + var(--dc-2)) var(--dc-2) var(--dc-2); background:var(--dc-surface); border-bottom:1px solid var(--dc-line); }
.dc-pfe__back { flex:0 0 auto; display:grid; place-items:center; width:44px; height:44px; border:0; border-radius:var(--dc-r-full); background:transparent; color:var(--dc-text); font-size:22px; line-height:1; }
.dc-pfe__back:active { background:var(--dc-sunken); }
.dc-pfe__bartitle { margin:0; font-size:16px; font-weight:700; color:var(--dc-text); }
.dc-pfe__body { flex:1 1 auto; min-height:0; overflow-y:auto; display:flex; flex-direction:column; gap:var(--dc-4); padding:var(--dc-5) var(--dc-4); }
.dc-pfe__avatar { position:relative; align-self:center; width:88px; height:88px; }
.dc-pfe__face { display:grid; place-items:center; width:88px; height:88px; border-radius:var(--dc-r-full); background:var(--dc-brand-soft); color:var(--dc-brand-text); font-size:30px; font-weight:800; }
.dc-pfe__cam { position:absolute; right:-6px; bottom:-6px; display:grid; place-items:center; width:44px; height:44px; border:2px solid var(--dc-surface); border-radius:var(--dc-r-full); background:var(--dc-brand); color:var(--dc-text-on); font-size:18px; line-height:1; }
.dc-pfe__cam:active { background:var(--dc-brand-hi); }
.dc-pfe__avatarhint { margin:0; font-size:12px; color:var(--dc-text-mute); text-align:center; }
.dc-pfe__field { display:flex; flex-direction:column; gap:var(--dc-2); }
.dc-pfe__label { font-size:13px; font-weight:700; color:var(--dc-text-sub); }
.dc-pfe__input { width:100%; min-height:48px; padding:0 var(--dc-3); border:1px solid var(--dc-line-field); border-radius:var(--dc-r-sm); background:var(--dc-surface); color:var(--dc-text); font-family:inherit; font-size:16px; }
.dc-pfe__input:focus, .dc-pfe__area:focus { outline:none; border-color:var(--dc-brand); box-shadow:0 0 0 3px var(--dc-brand-soft); }
.dc-pfe__input.is-error { border-color:var(--dc-danger); background:var(--dc-danger-soft); }
.dc-pfe__area { width:100%; min-height:88px; padding:var(--dc-3); border:1px solid var(--dc-line-field); border-radius:var(--dc-r-sm); background:var(--dc-surface); color:var(--dc-text); font-family:inherit; font-size:16px; line-height:1.6; resize:vertical; }
.dc-pfe__hint { margin:0; font-size:12px; color:var(--dc-text-mute); }
.dc-pfe__err { margin:0; font-size:13px; font-weight:700; line-height:1.5; color:var(--dc-danger); }
.dc-pfe__count { margin:0; font-family:var(--dc-mono); font-size:12px; color:var(--dc-text-mute); text-align:right; }
.dc-pfe__locked { display:flex; align-items:center; gap:var(--dc-3); padding:var(--dc-2) var(--dc-3); border:1px solid var(--dc-line); border-radius:var(--dc-r-sm); background:var(--dc-sunken); }
.dc-pfe__lockk { flex:0 0 auto; font-size:13px; color:var(--dc-text-sub); }
.dc-pfe__lockv { flex:1 1 auto; min-width:0; font-size:14px; font-weight:700; color:var(--dc-text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dc-pfe__change { flex:0 0 auto; min-width:56px; min-height:44px; padding:0 var(--dc-2); border:1px solid var(--dc-line-field); border-radius:var(--dc-r-sm); background:var(--dc-surface); color:var(--dc-text); font-family:inherit; font-size:13px; font-weight:700; }
.dc-pfe__change:active { background:var(--dc-sunken); }
.dc-pfe__bottom { flex:0 0 auto; padding:var(--dc-3) var(--dc-4) calc(var(--dc-safe-bottom) + var(--dc-3)); background:var(--dc-surface); border-top:1px solid var(--dc-line); }
.dc-pfe__go { width:100%; min-height:52px; border:0; border-radius:var(--dc-r-sm); background:var(--dc-brand); color:var(--dc-text-on); font-family:inherit; font-size:16px; font-weight:700; }
.dc-pfe__go:active { background:var(--dc-brand-hi); }
.dc-pfe__go[disabled] { background:var(--dc-sunken); color:var(--dc-text-mute); }

이렇게 씁니다

  • 칸을 비워 두지 말고 현재 값을 채워 놓는다 — 편집은 작성이 아니다
  • 번호처럼 따로 확인해야 바뀌는 항목은 회색 칸에 값만 보여 주고 변경 버튼을 옆에 둔다
  • 글자 수 제한이 있으면 쓴 글자와 한도를 칸 아래에 항상 같이 보여 준다
  • 저장 버튼은 하단에 고정해 긴 화면에서도 손가락이 닿게 한다

주의할 점

  • 사진 바꾸기 같은 아이콘 버튼에는 dc-sr 로 이름을 넣는다 — + 만으로는 읽히지 않는다
  • 글자 수 칸은 aria-describedby 로 입력칸에 이어 준다. 옆에 두는 것만으로는 관계가 생기지 않는다
  • 못 바꾸는 항목을 disabled 로만 두면 왜 안 되는지 알 수 없다. 변경 버튼이나 설명을 같이 둔다

다음에 볼 것