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

알림 목록

며칠 만에 앱을 연 사람이 그동안 무슨 일이 있었는지 훑고, 읽은 것과 안 읽은 것을 가려야 하는 화면.

화면 예시

실제 미리보기

출처

<script>document.body.className="dc-bleed"</script>
<div class="dc-nt">
  <header class="dc-nt__top">
    <h1 class="dc-nt__title">알림</h1>
    <button class="dc-nt__read" type="button">모두 읽음</button>
    <button class="dc-nt__ico" type="button"><span aria-hidden="true">⚙</span><span class="dc-sr">알림 설정</span></button>
  </header>

  <div class="dc-nt__filters" role="group" aria-label="알림 종류 고르기">
    <button class="dc-nt__chip dc-nt__chip--on" type="button" aria-pressed="true">전체 <span class="dc-nt__chip-num">2</span></button>
    <button class="dc-nt__chip" type="button" aria-pressed="false">급여</button>
    <button class="dc-nt__chip" type="button" aria-pressed="false">계약</button>
    <button class="dc-nt__chip" type="button" aria-pressed="false">근무</button>
    <button class="dc-nt__chip" type="button" aria-pressed="false">공지</button>
  </div>

  <main class="dc-nt__body">
    <h2 class="dc-nt__day">오늘</h2>
    <ul class="dc-nt__list">
      <li>
        <a class="dc-nt__item dc-nt__item--new" href="#">
          <span class="dc-nt__ava dc-nt__ava--ok" aria-hidden="true">₩</span>
          <span class="dc-nt__txt">
            <span class="dc-nt__head"><span class="dc-nt__name">8월 급여명세서가 도착했어요</span><span class="dc-nt__time">14:20</span></span>
            <span class="dc-nt__msg">실지급 2,099,400원 · 9월 10일 입금 예정입니다. 공제 내역을 확인해 주세요.</span>
          </span>
          <span class="dc-nt__dot" aria-hidden="true"></span>
          <span class="dc-sr">읽지 않음</span>
        </a>
      </li>
      <li>
        <a class="dc-nt__item dc-nt__item--new" href="#">
          <span class="dc-nt__ava dc-nt__ava--brand" aria-hidden="true">✎</span>
          <span class="dc-nt__txt">
            <span class="dc-nt__head"><span class="dc-nt__name">근로계약서 서명 요청</span><span class="dc-nt__time">11:05</span></span>
            <span class="dc-nt__msg">미소식품 · 주방보조 · 시급 10,320원. 9월 14일까지 서명하면 됩니다.</span>
            <span class="dc-nt__act">지금 서명하기</span>
          </span>
          <span class="dc-nt__dot" aria-hidden="true"></span>
          <span class="dc-sr">읽지 않음</span>
        </a>
      </li>
      <li>
        <a class="dc-nt__item" href="#">
          <span class="dc-nt__ava dc-nt__ava--warn" aria-hidden="true">!</span>
          <span class="dc-nt__txt">
            <span class="dc-nt__head"><span class="dc-nt__name">목요일 연장근로 2시간이 빠졌어요</span><span class="dc-nt__time">09:42</span></span>
            <span class="dc-nt__msg">출퇴근 기록과 급여가 다릅니다. 상담사에게 보낼 수 있습니다.</span>
          </span>
        </a>
      </li>
    </ul>

    <h2 class="dc-nt__day">어제</h2>
    <ul class="dc-nt__list">
      <li>
        <a class="dc-nt__item" href="#">
          <span class="dc-nt__ava dc-nt__ava--info" aria-hidden="true">☏</span>
          <span class="dc-nt__txt">
            <span class="dc-nt__head"><span class="dc-nt__name">김현수 팀장이 메시지를 보냈어요</span><span class="dc-nt__time">어제 18:31</span></span>
            <span class="dc-nt__msg">“다음 주 월요일 오전 9시 출근으로 바뀌었어요.”</span>
          </span>
        </a>
      </li>
      <li>
        <a class="dc-nt__item" href="#">
          <span class="dc-nt__ava" aria-hidden="true">🛈</span>
          <span class="dc-nt__txt">
            <span class="dc-nt__head"><span class="dc-nt__name">추석 연휴 상담센터 운영 안내</span><span class="dc-nt__time">어제 10:00</span></span>
            <span class="dc-nt__msg">9월 24일부터 26일까지는 네팔어 상담이 오후에만 열립니다.</span>
          </span>
        </a>
      </li>
    </ul>
    <p class="dc-nt__end">30일이 지난 알림은 자동으로 지워집니다</p>
  </main>

  <nav class="dc-nt__tabs" aria-label="주요 메뉴">
    <a class="dc-nt__tab" href="#">
      <span class="dc-nt__tab-ico" aria-hidden="true">⌂</span>
      <span class="dc-nt__tab-lbl">홈</span>
    </a>
    <a class="dc-nt__tab" href="#">
      <span class="dc-nt__tab-ico" aria-hidden="true">▤</span>
      <span class="dc-nt__tab-lbl">명세서</span>
    </a>
    <a class="dc-nt__tab" href="#" aria-current="page">
      <span class="dc-nt__tab-ico" aria-hidden="true">◔<span class="dc-nt__badge">2</span></span>
      <span class="dc-nt__tab-lbl">알림</span>
      <span class="dc-sr">읽지 않은 알림 2건</span>
    </a>
    <a class="dc-nt__tab" href="#">
      <span class="dc-nt__tab-ico" aria-hidden="true">◉</span>
      <span class="dc-nt__tab-lbl">내 정보</span>
    </a>
  </nav>
</div>
.dc-nt { display:flex; flex-direction:column; height:100vh; overflow:hidden; background:var(--dc-bg); color:var(--dc-text); font-family:var(--dc-font); }
.dc-nt__top { 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) var(--dc-4); background:var(--dc-surface); }
.dc-nt__title { flex:1 1 auto; font-size:22px; font-weight:800; letter-spacing:-.03em; color:var(--dc-text); }
.dc-nt__read { display:inline-flex; align-items:center; min-height:44px; padding:0 var(--dc-3); border:0; border-radius:var(--dc-r-sm); background:transparent; color:var(--dc-brand-text); font-size:14px; font-weight:700; }
.dc-nt__read:active { background:var(--dc-sunken); }
.dc-nt__ico { display:grid; place-items:center; width:44px; height:44px; border:0; border-radius:var(--dc-r-full); background:transparent; color:var(--dc-text-sub); font-size:19px; line-height:1; }
.dc-nt__ico:active { background:var(--dc-sunken); }
.dc-nt__filters { flex:0 0 auto; display:flex; gap:var(--dc-2); padding:var(--dc-1) var(--dc-4) var(--dc-3); overflow-x:auto; background:var(--dc-surface); border-bottom:1px solid var(--dc-line); scrollbar-width:none; }
.dc-nt__filters::-webkit-scrollbar { display:none; }
.dc-nt__chip { flex:0 0 auto; display:inline-flex; align-items:center; gap:var(--dc-1); min-height:36px; padding:0 var(--dc-3); border:1px solid var(--dc-line-field); border-radius:var(--dc-r-full); background:var(--dc-surface); color:var(--dc-text-sub); font-family:inherit; font-size:13px; font-weight:700; white-space:nowrap; }
.dc-nt__chip--on { border-color:var(--dc-brand); background:var(--dc-brand-soft); color:var(--dc-brand-text); }
.dc-nt__chip-num { font-family:var(--dc-mono); font-size:12px; }
.dc-nt__body { flex:1 1 auto; min-height:0; overflow-y:auto; overscroll-behavior:contain; padding-bottom:var(--dc-5); }
.dc-nt__day { position:sticky; top:0; z-index:1; padding:var(--dc-3) var(--dc-4) var(--dc-2); background:var(--dc-bg); font-size:12px; font-weight:800; letter-spacing:.02em; color:var(--dc-text-mute); }
.dc-nt__list { display:flex; flex-direction:column; }
.dc-nt__item { position:relative; display:flex; align-items:flex-start; gap:var(--dc-3); padding:var(--dc-3) var(--dc-5) var(--dc-3) var(--dc-4); border-bottom:1px solid var(--dc-line); background:var(--dc-bg); text-decoration:none; }
.dc-nt__item:active { background:var(--dc-sunken); }
.dc-nt__item--new { background:var(--dc-brand-soft); }
.dc-nt__item--new .dc-nt__time { color:var(--dc-text-sub); }
.dc-nt__ava { flex:0 0 auto; display:grid; place-items:center; width:40px; height:40px; border-radius:var(--dc-r-full); background:var(--dc-sunken); color:var(--dc-text-sub); font-size:17px; font-weight:800; }
.dc-nt__ava--ok { background:var(--dc-ok-soft); color:var(--dc-ok); }
.dc-nt__ava--brand { background:var(--dc-surface); border:1px solid var(--dc-brand); color:var(--dc-brand-text); }
.dc-nt__ava--warn { background:var(--dc-warn-soft); color:var(--dc-warn); }
.dc-nt__ava--info { background:var(--dc-info-soft); color:var(--dc-info); }
.dc-nt__txt { flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:2px; }
.dc-nt__head { display:flex; align-items:baseline; gap:var(--dc-2); }
.dc-nt__name { flex:1 1 auto; min-width:0; font-size:14px; font-weight:700; line-height:1.4; color:var(--dc-text); }
.dc-nt__time { flex:0 0 auto; font-size:11px; color:var(--dc-text-mute); white-space:nowrap; }
.dc-nt__msg { display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; font-size:13px; line-height:1.5; color:var(--dc-text-sub); }
.dc-nt__act { align-self:flex-start; margin-top:var(--dc-2); padding:var(--dc-1) var(--dc-3); border-radius:var(--dc-r-full); background:var(--dc-brand); color:var(--dc-text-on); font-size:12px; font-weight:800; }
.dc-nt__dot { position:absolute; top:calc(50% - 4px); right:var(--dc-3); width:8px; height:8px; border-radius:var(--dc-r-full); background:var(--dc-brand); }
.dc-nt__end { padding:var(--dc-5) var(--dc-4); text-align:center; font-size:12px; color:var(--dc-text-mute); }
.dc-nt__body--empty { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--dc-3); padding:var(--dc-7) var(--dc-6); text-align:center; }
.dc-nt__empty-art { display:grid; place-items:center; width:72px; height:72px; border-radius:var(--dc-r-full); background:var(--dc-sunken); color:var(--dc-text-mute); font-size:30px; }
.dc-nt__empty-title { font-size:18px; font-weight:800; color:var(--dc-text); }
.dc-nt__empty-body { max-width:30ch; font-size:14px; line-height:1.6; color:var(--dc-text-sub); }
.dc-nt__empty-btn { min-height:48px; padding:0 var(--dc-5); 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:15px; font-weight:700; }
.dc-nt__empty-btn:active { background:var(--dc-sunken); }
.dc-nt__tabs { flex:0 0 auto; display:flex; padding-bottom:var(--dc-safe-bottom); background:var(--dc-surface); border-top:1px solid var(--dc-line); }
.dc-nt__tab { flex:1 1 0; min-width:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px; min-height:56px; padding:var(--dc-2) var(--dc-1); color:var(--dc-text-mute); text-decoration:none; }
.dc-nt__tab:active { background:var(--dc-sunken); }
.dc-nt__tab[aria-current="page"] { color:var(--dc-brand-text); }
.dc-nt__tab-ico { position:relative; font-size:20px; line-height:1; }
.dc-nt__tab-lbl { font-size:11px; font-weight:700; letter-spacing:-.01em; }
.dc-nt__badge { position:absolute; top:-5px; left:13px; min-width:18px; height:18px; padding:0 4px; border-radius:var(--dc-r-full); background:var(--dc-danger); color:var(--dc-text-on); font-size:11px; font-weight:800; line-height:18px; text-align:center; }

이렇게 씁니다

  • 안 읽은 것은 배경과 점 두 가지로 표시한다. 점 하나만으로는 작아서 지나친다
  • 오늘·어제처럼 날짜로 묶는다 — 시각만 있으면 언제 일인지 알 수 없다
  • 본문은 두 줄에서 자르고, 자세한 내용은 눌러서 들어가게 한다
  • 당장 할 일이 있는 알림에만 버튼을 붙인다. 모든 줄에 버튼이 있으면 무엇이 급한지 사라진다

주의할 점

  • 색과 점만으로 안 읽음을 알리지 말고 "읽지 않음" 을 dc-sr 로 함께 읽어 준다
  • 하단 탭 배지 숫자와 목록의 안 읽음 수가 어긋나지 않게 한다
  • 상단 바에는 --dc-safe-top, 하단 탭에는 --dc-safe-bottom 을 넣는다

다음에 볼 것