30天挑戰:「CSS progress bar (stepper) 」技術記錄
總結
記錄頭尾至頂至底的進度條之 HTML 結構與 CSS 設定
See the Pen stepper (justify-content-between) (::after line) by Charlie (@Charlie7779) on CodePen.
設計圖
- 手機版不顯示步驟文字
- 步驟圖示與文字需左右頭尾滿版
- 三個狀態階段:已完成(黑底白字配黑線)、進行中(紅底白字配紅線)、待填寫(灰框灰字配灰線條)
HTML 結構
- 全部 stepper 的 HTML 結構都維持一致,代表日後可改用程式碼搭配迴圈動態產生 progress bar 內容
- stepper 的步驟數字不使用 CSS 偽元素,避免分散產生內容的相關邏輯
- 補充理由:「步驟數字不建議放到偽元素裡面,因為擴展為更多步驟,變數不好塞」、「(如果數字透過偽元素處理的話,)實務上若遇到多語系需求,或是不同數字的表達方式等等,就容易傷腦筋」
- 使用
complete
、active
與pending
三種 CSS class name 來明確標註不同狀態,增加原始碼的好讀性
SCSS
- 第 9 行
.step-container
:注意並沒有使用justify-content: space-between;
- 第 18 行
.step-item
:- 使用
flex: 1 1;
讓 flex item 佔據所有空間 overflow-x: hidden;
乃是為了配合 progress bar line,重要的伏筆(?)
- 使用
- 第 26 行
.step-item:not(:first-child)
:除了第一個 stepper 外,其餘 stepper 一律使用padding-left
往右側退1rem
- 第 30 行
.step-item:last-child
:使用flex: none;
讓最後一個 stepper 完全不額外佔據任何空間 - 第 34-35 行:設定
.icon
與.content
為display: inline-block;
,即可直接水平排列 - 第 39 行
.icon
:- 設定
flex: none;
避免圖示本身被壓縮變形 - 使用
text-align: center;
與line-height: 32px;
讓文字水平垂直置中
- 設定
- 第 53 行
.step-item:not(:last-child)
:- 54 行
.content
設定為position: relative;
作為 progress bar line 的定位基準點 - 60 行
.content::after
:繪製 progress bar line,設定left: calc(100% + 1rem);
讓線條往右推移,並因為第 18 行已經設定.step-item
需overflow-x: hidden;
,所以多餘的線條長度會直接被隱藏起來 - 66 行
width: 99999px;
:直接設定一個足夠長的線段數值
- 54 行
- 第 73 行
.content-text
:手機版時不顯示,故display: none;
- 79-106 行:針對不同的狀態進行顏色調整
- 第 109 行:在桌面版要顯示
.content-text
,將display: inline-block;
加回
參考文件
- Ant Design Pro: 分步表單
- 特別銘謝:超感謝 Red Chou 助教願意撥冗給予原始碼的改善建議