Modal window 最佳實踐

x

Vue 3 useModal hook

  • Front-End Developer
  • Creator of vue-final-modal
  • Manager of Vue.js Taiwan

 

  • hunterliu.tw
  • @hunterliu1003

Hunter Liu

大綱

  • 簡介 Modal 

  • 其實你不需要 Modal

    • 決策樹

  •  
    • Roadmap v4

Modal 簡介

定義

模態視窗  - 創建一個禁用主視窗的模式,並使主視窗和子視窗可見。用戶必須先與模態視窗進行交互後才能對主視窗進行操作 。

標題

遮罩

內容

按鈕

關閉

  • 簡化界面、節省空間
  • 立刻吸引使用者注意力

  • 限制操作流程

  • 警告、提示、通知使用者

  • 請求使用者輸入必要資訊

  • 重複確認不可逆的重要操作

特點

常見的應用

Dialog

Fullscreen Modal

Overlay

Lightbox

Modal

Non-modal

Popups

Confirm

Toast

Spinner

Notification

Mode

Alert

Window

Panel

Drawer

象限

分類

Lightbox
存在遮罩
Non-lightbox
不存在遮罩
Modal
不能對背景操作
Dialog
Confirm
Spinner
Fullscreen Modal
Panel
Drawer
Non-modal
能對背景操作
X Toast
Notification
Alert

一言不合就 Modal

變成了 RD 的夢魘

關閉彈窗已成為使用者的本能

是時候重新審視這個 UI 模式了

但...

其實你不需要 Modal

決策樹

  • 需抓住使用者的注意力
  • 使用者從一小部分選項中進行選擇
  • 必要提供額外的內容或功能而不丟失主頁面
  • 在使用者繼續之前,要先收集少量信息
  • 內容緊急

Yes

No

Page

  • 使用者想要將內容添加到書籤或分享
  • 內容主要用於行動裝置
  • 使用者離開當前工作流程後,可能返回
  • 複雜的操作相互作用
  • 未來會擴充其他操作、任務或內容

Yes

No

Page

  • 畫面中會塞入大量元素
  • 內容高度超過裝置最大高度
  • 內容需要滾動
  • 內容超過兩個以上的操作需要使用者完成
  • 解決方案需要使用者完成一項以上的任務

Yes

No

Page

  • 使用者需經常在功能之前來回移動
  • 使用者與功能的交互是否單一
  • 內容是暫時的
  • 之後使用者的關注點需要回到主頁面
  • 內容簡短
  • 內容出現在 sitemap 結構中的最深層
  • 有其他充分的理由

Yes

No

Page

  • 使用者需要立刻注意到
  • 如果轉移使用者注意力,此任務會更容易完成
  • 當前任務對接下來的流程是必要的
  • 要求使用者完成的任務明顯節省接下來的操作
  • 該任務有明確步驟,包含起點與終點

Yes

No

Non-modal

是否為成功或錯誤訊息

Yes

No

Non-modal

  • 搜集使用者訊息
  • 確認使用者操作
  • 嚴重或不可逆轉的操作
  • 填寫表單或做決定
  • 防止嚴重錯誤的警告

Yes

No

Dialog

Bottom Sheet

Nav Drawer

Panel

...

小結

  • 利用決策樹減少非必要的 Modal
  • 思考如何對使用者體驗最好,而不是設計或開發簡單

Use cases

  • Fullscreen Modal
  • Confirm Dialog
  • Toast
  • Custom Transition
  • Panel (Bottom sheet)

Source code

(useModal 的部分)

Why create VFM

沒找到足夠彈性的 Modal 元件

只好自己做一個!

Dialog

Fullscreen Modal

Overlay

Lightbox

Modal

Non-modal

Popups

Confirm

Toast

Spinner

Notification

Mode

Alert

Window

Panel

Drawer

借鑒

  • LockScroll

BootstrapVue

  • Stackable

  • zIndex

  • zIndexBase

Element UI

  • Attach

Vuetify

  • API: this.$modal.show

  • Dynamic Modal

  • Transition

  • FocusTrap

 vue-js-modal

Vue 3 有 Teleport

What is VFM

  • Styleless / Renderless 元件 (非開箱即用)
  • 可搭配 Windi CSS, Tailwind CSS, unocss 使用
  • 支援 Vue 2, 3, Nuxt 2, 3
  • 功能包含:
    • 拖曳、縮放、巢狀 Modal
    • 自定義過渡動畫
    • 動態 Modal

Getting Started

VueFinalModal

Props

classes

styles

transition

clickToClose

escToClose

focusTrap

content-class

content-style

drag

drag-selector

resize

resize-directions

fit-parant

keep-changed-style

min-width

max-width

min-height

max-height

name

modelValue

displayDirective

lockScoll

nonModal

attach

z-index-auto

z-index-base

z-index

overlay-class

overlay-style

overlay-transition

hide-overlay

Events

@before-open

@opened

@before-close

@closed

@click-outside

@drag:start

@drag:move

@drag:end

@resize:start

@resize:move

@resize:end

API

$vfm.show(name)

開啟指定 modal

$vfm.hide(name)

關閉指定 modal

$vfm.hideAll()

關閉所有 modal

$vfm.toggle(name, show)

切換指定 modal

$vfm.modals

回傳所有 modal 實例陣列

$vfm.openedModals

回傳所有開啟中的 modal 實例陣列

$vfm.dynamicModals

回傳所有動態 modal 實例陣列

Dynamic Modal

通常放在 App.vue 或 Layout 元件

useModal hook

Demo

&

Step by step

v4

  • useModal hook
  • Typescript
  • 開箱即用,提供主題樣式內建元件:
    • Fullscreen Modal
    • Bottom Sheet
    • Confirm Dialog
    • ... more

特別感謝

歡迎到 Github 許願

Best Practice of Modal Window

By hunterliu1003

Best Practice of Modal Window

Vue Final Modal is a tiny, renderless, mobile-friendly, feature-rich modal component for Vue.js. You can create a higher-order component easily and can customize template, script and style based on your needs.

  • 424