Đến nội dung chính

Modal toàn màn hình

Dùng cho việc quá lớn để nhét vào một thẻ — nó che kín ứng dụng để người dùng làm xong đúng việc đó.

Lớp phủ

Xem trước trực tiếp

Nguồn

<div class="dc-fs" role="dialog" aria-modal="true" aria-labelledby="dc-fs-t">
  <div class="dc-fs__bar">
    <button class="dc-fs__bar-ico" type="button">
      <span class="dc-sr">쓰던 내용 버리고 닫기</span>
      <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M6.5 6.5l11 11M17.5 6.5l-11 11" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
    </button>
    <h2 class="dc-fs__bar-title" id="dc-fs-t">후기 쓰기</h2>
    <button class="dc-fs__bar-act" type="button">등록</button>
  </div>
  <div class="dc-fs__body">
    <div class="dc-fs__field">
      <label class="dc-fs__label" for="dc-fs-ttl">한 줄 요약</label>
      <input class="dc-fs__input" id="dc-fs-ttl" type="text" value="배송이 하루 빨랐어요">
    </div>
    <div class="dc-fs__field">
      <label class="dc-fs__label" for="dc-fs-txt">자세한 이야기</label>
      <textarea class="dc-fs__textarea" id="dc-fs-txt" rows="6" aria-describedby="dc-fs-txt-help">포장이 단단해서 모서리 하나 안 눌렸습니다. 색은 화면보다 조금 어둡게 나왔고, 크기는 적어 둔 대로 맞았습니다.</textarea>
      <p class="dc-fs__help" id="dc-fs-txt-help">10자 이상 쓰면 등록할 수 있습니다.</p>
    </div>
  </div>
</div>
.dc-fs {
  display: flex; flex-direction: column;
  height: 560px; overflow: hidden;
  background: var(--dc-bg);
  border-radius: var(--dc-r-md);
  font-family: var(--dc-font);
}
.dc-fs__bar {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; gap: var(--dc-1);
  padding: calc(var(--dc-safe-top) + var(--dc-1)) var(--dc-2) var(--dc-1);
  background: var(--dc-surface);
  border-bottom: 1px solid var(--dc-line);
}
.dc-fs__bar-ico {
  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);
}
.dc-fs__bar-ico svg { width: 22px; height: 22px; }
.dc-fs__bar-ico:active { background: var(--dc-sunken); }
.dc-fs__bar-title {
  flex: 1 1 auto; min-width: 0; margin: 0;
  font-size: 16px; font-weight: 700; text-align: center;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  color: var(--dc-text);
}
.dc-fs__bar-act {
  flex: 0 0 auto;
  min-width: 56px; min-height: 44px; padding: 0 var(--dc-3);
  border: 0; border-radius: var(--dc-r-sm);
  background: transparent; color: var(--dc-brand-text);
  font-family: inherit; font-size: 15px; font-weight: 700;
}
.dc-fs__bar-act:active { background: var(--dc-brand-soft); }
.dc-fs__step {
  flex: 0 0 auto; min-width: 44px; padding: 0 var(--dc-2);
  font-size: 13px; font-weight: 700; text-align: right;
  color: var(--dc-text-mute);
}
.dc-fs__prog { height: 3px; background: var(--dc-sunken); }
.dc-fs__prog-fill { display: block; width: 66%; height: 100%; background: var(--dc-brand); }
.dc-fs__body { flex: 1 1 auto; overflow-y: auto; padding: var(--dc-5); }
.dc-fs__field { margin-bottom: var(--dc-5); }
.dc-fs__label { display: block; margin-bottom: var(--dc-2); font-size: 13px; font-weight: 700; color: var(--dc-text); }
.dc-fs__input,
.dc-fs__textarea {
  display: block; width: 100%;
  padding: var(--dc-3) var(--dc-4);
  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; line-height: 1.6;
}
.dc-fs__input { min-height: 48px; }
.dc-fs__textarea { resize: vertical; }
.dc-fs__input:focus, .dc-fs__textarea:focus { border-color: var(--dc-brand); outline: 2px solid var(--dc-brand-soft); outline-offset: 0; }
.dc-fs__help { margin: var(--dc-2) 0 0; font-size: 12px; line-height: 1.6; color: var(--dc-text-mute); }
.dc-fs__h3 { margin: var(--dc-5) 0 var(--dc-2); font-size: 14px; font-weight: 700; color: var(--dc-text); }
.dc-fs__h3:first-child { margin-top: 0; }
.dc-fs__p { margin: 0; font-size: 13px; line-height: 1.8; color: var(--dc-text-sub); }
.dc-fs__foot {
  padding: var(--dc-3) var(--dc-5) calc(var(--dc-4) + var(--dc-safe-bottom));
  border-top: 1px solid var(--dc-line);
  background: var(--dc-surface);
}
.dc-fs__cta {
  width: 100%; min-height: 50px;
  border: 0; border-radius: var(--dc-r-md);
  background: var(--dc-brand); color: var(--dc-text-on);
  font-family: inherit; font-size: 15px; font-weight: 700;
}
.dc-fs__cta:active { background: var(--dc-brand-hi); }

Cách dùng

  • Góc trên bên trái để đóng (hoặc quay lại); bên phải chỉ một hành động kết thúc
  • Tiêu đề nói rõ việc đang làm: 'Viết đánh giá', không phải 'Bài mới'
  • Nếu có nhiều bước, luôn cho thấy đang ở bước nào và còn mấy bước
  • Khi đã nhập dở mà chạm đóng, phải hỏi có bỏ không

Điểm cần lưu ý

  • Đặt --dc-safe-top cho thanh trên và --dc-safe-bottom cho chân cố định
  • Nút đóng chỉ có biểu tượng — ghi rõ nó đóng cái gì trong span dc-sr
  • Bàn phím sẽ che chân cố định; chỉ để phần thân cuộn

Tiếp theo