本程式碼研究室將說明如何建構安全、容易存取且易於使用的登入表單。
1. 使用有意義的 HTML
請使用下列專為工作建構的元素:
<form>
<section>
<label>
<button>
您可以看到,這些元素可以啟用內建的瀏覽器功能、提升無障礙功能,並為您的標記增添意義。
點選「重混」,將專案設為可編輯。
將下列程式碼加入
<body>
元素中:<form action="#" method="post"> <h1>Sign in</h1> <section> <label>Email</label> <input> </section> <section> <label>Password</label> <input> </section> <button>Sign in</button> </form>
此時,
index.html
檔案應如下所示:按一下「查看應用程式」即可預覽登入表單。您新增的 HTML 有效且正確,但預設的瀏覽器樣式會導致畫面難以使用,特別是在行動裝置上。
按一下「檢視原始碼」以返回原始碼。
2. 專為手指和拇指設計
調整邊框間距、邊界和字型大小,確保輸入內容在行動裝置上順利運作。
複製下列 CSS 並貼到您的
style.css
檔案中:按一下「查看應用程式」,即可查看新樣式的登入表單。
按一下「View Source」,返回
style.css
檔案。
這包含大量程式碼!請特別注意大小異動:
- 已將
padding
和margin
新增至輸入內容。 font-size
與行動裝置和電腦並不相同。
:invalid
選取器用來表示輸入內容含有無效值。目前尚未提供。
CSS 版面配置為行動裝置優先:
- 預設 CSS 適用於寬度小於 450 像素的可視區域。
- 媒體查詢區段會替寬度至少 450 像素的可視區域設定覆寫值。
建構這類表單時,在電腦和行動裝置上測試程式碼時,請務必:
- 標籤和輸入文字是否清晰易讀,尤其是低視能人士?
- 輸入來源和「登入」按鈕的大小是否足以做為縮圖的觸控目標?
3. 新增輸入屬性以啟用內建瀏覽器功能
允許瀏覽器儲存及自動填入輸入值,並提供內建密碼管理功能的存取權。
在表單 HTML 中加入屬性,如下所示:
<form action="#" method="post"> <h1>Sign in</h1> <section> <label for="email">Email</label> <input id="email" name="email" type="email" autocomplete="username" required autofocus> </section> <section> <label for="password">Password</label> <input id="password" name="password" type="password" autocomplete="current-password" required> </section> <button id="sign-in">Sign in</button> </form>
再次查看應用程式,然後按一下「電子郵件」。
請注意焦點如何移至電子郵件輸入內容。這是因為標籤是透過
for="email"
屬性與輸入內容建立關聯。當標籤或標籤的關聯輸入出現在焦點時,螢幕閱讀器也會朗讀標籤文字。專注於行動裝置上的電子郵件輸入內容。
請注意鍵盤對於輸入電子郵件地址的最佳化效果。舉例來說,
@
和.
字元可能會顯示在主鍵盤上,作業系統上可能會顯示儲存的電子郵件。這都是因為type="email"
屬性套用至<input>
元素。在密碼欄位中輸入文字。
元素已套用
type="password"
屬性,因此文字預設為隱藏。
autocomplete
、name
、id
和type
屬性可協助瀏覽器瞭解輸入內容的角色,以便儲存之後要用於自動填入的資料。
- 使用電腦裝置將焦點移至電子郵件輸入內容,然後輸入一些文字。
只要按一下「全螢幕」圖示 ,即可查看應用程式的網址。如果您在瀏覽器中儲存了任何電子郵件地址,可能會看到對話方塊,讓您從這些儲存的電子郵件中選取。這是因為電子郵件輸入內容已套用
autocomplete="username"
屬性。
autocomplete="username"
和autocomplete="current-password"
可協助瀏覽器使用儲存的值自動填入輸入內容。
不同瀏覽器會使用不同技術來偵測表單輸入的作用,並為多個不同網站提供自動填入功能。
新增及移除屬性,自行嘗試。
測試不同平台上的行為至關重要。請輸入值,並使用不同裝置的不同瀏覽器提交表單。您可以運用 BrowserStack,在各種平台上輕鬆進行測試,開放原始碼專案可免費使用。試試看!
此時,index.html
檔案應如下所示:
4. 新增 UI 以切換密碼顯示方式
可用性專家強烈建議新增圖示或按鈕,方便使用者查看在「密碼」欄位中輸入的文字。沒有內建方法,因此您必須使用 JavaScript 自行實作。
新增這項功能的程式碼非常簡單。這個範例使用文字,而非圖示。
請按照下列步驟更新 index.html
、style.css
和 script.js
檔案。
在
index.html
檔案中的「密碼」部分新增切換鈕:<section> <label for="password">Password</label> <button id="toggle-password" type="button" aria-label="Show password as plain text. Warning: this will display your password on the screen.">Show password</button> <input id="password" name="password" type="password" autocomplete="current-password" required> </section>
請在
style.css
檔案的底部新增下列 CSS:button#toggle-password { background: none; border: none; cursor: pointer; font-weight: 300; padding: 0; position: absolute; top: -4px; right: -2px; }
這會讓「顯示密碼」按鈕的外觀類似純文字,並顯示在密碼部分的右上角。
在
script.js
檔案中加入下列 JavaScript,切換密碼顯示設定,並設定適當的aria-label
:const passwordInput = document.getElementById('password'); const togglePasswordButton = document.getElementById('toggle-password'); togglePasswordButton.addEventListener('click', togglePassword); function togglePassword() { if (passwordInput.type === 'password') { passwordInput.type = 'text'; togglePasswordButton.textContent = 'Hide password'; togglePasswordButton.setAttribute('aria-label', 'Hide password.'); } else { passwordInput.type = 'password'; togglePasswordButton.textContent = 'Show password'; togglePasswordButton.setAttribute('aria-label', 'Show password as plain text. ' + 'Warning: this will display your password on the screen.'); } }
立即嘗試顯示密碼邏輯。
- 查看您的應用程式。
- 在密碼欄位中輸入一些文字。
- 按一下「顯示密碼」。
在不同作業系統的多種瀏覽器中重複執行第四個步驟。
提供使用者體驗設計:使用者會注意到「顯示密碼」並且瞭解其內容嗎?有更好的方式可以提供這項功能嗎?現在,不妨與幾位好友或同事一起進行折扣可用性測試。
如要瞭解這項功能對螢幕閱讀器的運作方式,請安裝 ChromeVox 傳統擴充功能,並瀏覽表單。aria-label
值是否正常運作?
有些網站 (例如 Gmail) 會使用圖示 (而非文字) 切換密碼顯示方式。完成這個程式碼研究室後,請用 SVG 圖片實作此程式碼。 Material Design 提供可免費下載的優質圖示。
此時您的程式碼應如下所示:
5. 新增表單驗證
您可以讓使用者在提交表單前驗證資料,並展示需要修改的內容,藉此協助他們正確輸入資料。
HTML 表單元素和屬性內建基本驗證功能,不過,您也應該利用 JavaScript,在使用者輸入資料和嘗試提交表單時執行更強大的驗證。
這個步驟會使用 Constraint Validation API (廣泛支援) 新增自訂驗證,並內建瀏覽器 UI,藉此設定焦點和顯示提示。
向使用者說明密碼和其他輸入內容的限制條件。千萬別讓他們猜猜!
更新
index.html
檔案的密碼部分:<section> <label for="password">Password</label> <button id="toggle-password" type="button" aria-label="Show password as plain text. Warning: this will display your password on the screen.">Show password</button> <input id="password" name="password" type="password" autocomplete="current-password" aria-describedby="password-constraints" required> <div id="password-constraints">At least eight characters, with at least one lowercase and one uppercase letter.</div> </section>
這會新增兩項功能:
- 密碼限制的相關資訊
- 用於輸入密碼的
aria-describedby
屬性 (螢幕閱讀器會讀取標籤文字、輸入類型 (密碼) 和說明)。
請在
style.css
檔案的底部新增下列 CSS:div#password-constraints { margin: 5px 0 0 0; font-size: 16px; }
將下列 JavaScript 新增至
script.js
檔案:passwordInput.addEventListener('input', resetCustomValidity); function resetCustomValidity() { passwordInput.setCustomValidity(''); } // A production site would use more stringent password testing. function validatePassword() { let message= ''; if (!/.{8,}/.test(passwordInput.value)) { message = 'At least eight characters. '; } if (!/.*[A-Z].*/.test(passwordInput.value)) { message += 'At least one uppercase letter. '; } if (!/.*[a-z].*/.test(passwordInput.value)) { message += 'At least one lowercase letter.'; } passwordInput.setCustomValidity(message); } const form = document.querySelector('form'); const signinButton = document.querySelector('button#sign-in'); form.addEventListener('submit', handleFormSubmission); function handleFormSubmission(event) { event.preventDefault(); validatePassword(); form.reportValidity(); if (form.checkValidity() === false) { } else { // On a production site do form submission. alert('Logging in!') signinButton.disabled = 'true'; } }
點選此按鈕即可體驗這項功能,
所有近期推出的瀏覽器都內建表單驗證功能,並支援 JavaScript 驗證。
- 輸入無效的電子郵件地址,然後按一下「登入」。瀏覽器會顯示警告:無需使用 JavaScript!
- 請輸入有效的電子郵件地址,然後按一下 [登入] (未設定密碼值)。瀏覽器會警告您缺少必要的值,並聚焦於密碼輸入值。
- 輸入無效密碼,然後按一下「登入」。這樣一來,您就能根據錯誤顯示不同的訊息。
嘗試以不同方式協助使用者輸入電子郵件地址和密碼。更好的密碼表單欄位可提供實用建議。
此時您的程式碼應如下所示:
進一步
這些程式碼不會顯示在本程式碼研究室中,但您仍需要使用以下四個重要的登入表單功能:
新增「忘記密碼?」按鈕,讓使用者輕鬆重設密碼。
請提供服務條款和隱私權政策文件的連結,方便使用者瞭解您保護資料的方式。
建議您考量樣式和品牌,並且確保這些額外功能與網站上的其他部分相符。
新增 Analytics (分析) 和 RUM,以便測試及監控表單設計的成效和可用性。