WebberUI

台灣手機輸入

09 開頭手機號自動格式化 09xx-xxx-xxx,市話/手機自動判別

台灣電話號碼輸入框:輸入時自動插入連字號(0912-345-678),偵測 09 開頭為手機、0X 區碼為市話並依區碼長度分組(02-2712-3456);左側圖示隨型態切換、無效前綴即時紅色提示,貼上含 +886、全形數字或其他雜訊的字串會自動清洗。

載入預覽⋯

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

<TaiwanPhoneInput />

安裝

npx shadcn@latest add https://webberui.com/r/taiwan-phone-input.json

或在 components.json 設定 registries 後,改用 @webberui/taiwan-phone-input 安裝。

安裝依賴後,從 registry JSON(/r/taiwan-phone-input.jsonfiles[0].content)複製 taiwan-phone-input.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion lucide-react clsx tailwind-merge

使用

import { TaiwanPhoneInput } from "@/components/ui/taiwan-phone-input";

const [phone, setPhone] = React.useState("");

<TaiwanPhoneInput value={phone} onChange={setPhone} allowLandline />

onChange 回傳清洗後的純數字(如 0912345678),適合直接存入資料庫;顯示用的連字號格式由元件內部處理。也可搭配匯出的 normalizeTaiwanPhoneanalyzeTaiwanPhone 工具函式在元件外做清洗與驗證。

市話區碼表內建現行全部長途區碼(02~08、037、049、082、089、0836),比對採最長區碼優先;部分區碼實際混用 7/8 碼用戶號碼,元件取常見長度示範,需要更精確可擴充內建對照表。

Props

Prop型別預設值說明
valuestring受控值:電話號碼(可含雜訊,內部自動清洗為純數字)
onChange(digits: string) => void值變更時觸發,回傳清洗後的純數字字串
allowLandlinebooleantrue是否接受市話(0X 區碼);false 時僅接受 09 開頭手機
placeholderstringallowLandline佔位提示文字
disabledbooleanfalse停用輸入
namestring表單欄位名稱,會以隱藏欄位送出純數字
idstringinput 元素的 id,供外部 label 綁定
classNamestring透傳到最外層容器

可及性

  • 使用 type="tel"inputMode="tel"autoComplete="tel",行動裝置自動喚出數字鍵盤並支援自動填入
  • 驗證失敗時設定 aria-invalid,錯誤與成功訊息置於 aria-live="polite" 區域即時朗讀
  • 純裝飾的型態圖示與狀態圖示皆標記 aria-hidden,不干擾輔助科技
  • 使用者系統開啟「減少動態效果」時,停用圖示切換、綠勾彈出與訊息展開動畫
  • 編輯中段時游標位置會在重新格式化後正確還原,不會跳到行尾

On this page