Cách tạo nút trong HTML
Nút là phần tử <button>. Nội dung giữa hai thẻ là thứ người dùng nhìn thấy, và type="button" cho biết nút chạy script của bạn thay vì gửi form. Nhấp thử trong khung xem trước:
Một nút hoạt động chỉ cần vậy: một nhãn, một type và thứ gì đó lắng nghe sự kiện click. Trình duyệt cho nút nhận focus bằng bàn phím và kích hoạt nó bằng Enter hoặc Space, nên người dùng bàn phím có sẵn mọi thứ. Một <div> có trình xử lý click thì không có gì trong số đó.
Bạn cũng có thể gặp onclick="..." viết thẳng trong thẻ. Cách đó chạy được, nhưng addEventListener giữ script tách khỏi markup và cho nhiều trình nghe dùng chung một nút.
Ba type của nút
Thuộc tính type quyết định nút làm gì khi được nhấn.
type | Tác dụng | Dùng cho |
|---|---|---|
submit | Gửi form chứa nó. Đây là giá trị mặc định. | Thao tác chính của form |
button | Tự nó không làm gì; JavaScript của bạn quyết định | Bật tắt, hộp thoại, bộ đếm, mọi thứ chạy bằng script |
reset | Đưa mọi trường của form về giá trị ban đầu | Hiếm khi; người dùng hay bấm nhầm |
Gõ gì đó rồi thử từng nút. Khung xem trước không rời trang khi form được gửi; nó hiển thị dữ liệu mà form lẽ ra đã gửi.
Reset khôi phục giá trị viết trong HTML (Ada), không phải một trường trống. Và nếu bạn xóa type="button" khỏi nút Uppercase, nó trở thành nút submit: nó viết hoa tên rồi gửi form.
Nút submit trong HTML: gửi name và value
Một nút submit có thể mang name và value riêng. Chúng chỉ được gửi cùng form khi chính nút đó là nút gửi form, nên hai nút có thể dùng chung một form và cho máy chủ biết thao tác nào được chọn:
Nhấn Publish và form gửi title=My first post và action=publish. Xóa tiêu đề rồi nhấn một trong hai nút: required chặn việc gửi và trình duyệt hiện thông báo của riêng nó. Nhấn Enter trong ô văn bản cũng gửi form, và trình duyệt coi đó là nhấn nút submit đầu tiên, nên nó gửi action=draft.
Nút submit còn nhận các thuộc tính ghi đè form cho riêng nút đó: formaction (một URL khác), formmethod, formtarget và formnovalidate, thuộc tính bỏ qua bước kiểm tra hợp lệ. formnovalidate là lựa chọn thường gặp cho nút "Lưu nháp", nút cần hoạt động cả khi các trường bắt buộc còn trống.
Một nút nằm ngoài form vẫn gửi được form đó bằng thuộc tính form, nhận id của form: <button type="submit" form="signup">Sign up</button>.
Nút bị vô hiệu hóa
Thuộc tính disabled tắt một nút. Nút bị vô hiệu hóa bỏ qua cú nhấp, bị Tab bỏ qua và không được gửi cùng form. Trình duyệt cũng làm nó xám đi. Một cách làm phổ biến là giữ nút submit ở trạng thái vô hiệu hóa cho tới khi một điều kiện được đáp ứng:
Trong JavaScript, button.disabled là một thuộc tính boolean: đặt nó là true hoặc false. Trong HTML, chỉ cần thuộc tính có mặt là đủ, nên disabled="false" vẫn vô hiệu hóa nút.
Nút bị vô hiệu hóa không cho biết vì sao nó bị tắt, và người dùng bàn phím hay trình đọc màn hình di chuyển bằng Tab không bao giờ tới được nó. Khi lý do không hiển nhiên, hãy ghi rõ bằng chữ cạnh nút, hoặc để nút bật và hiện thông báo lỗi khi được nhấn.
Định dạng nút bằng CSS
Trình duyệt vẽ nút với phông chữ, viền và nền riêng. Đặt vài thuộc tính là thay được tất cả. Hãy giữ kiểu focus nhìn thấy được: đó là cách người dùng bàn phím biết mình đang ở đâu.
Tác dụng của từng quy tắc:
font: inheritcho nút dùng phông chữ của trang. Không có nó, nút dùng phông chữ form nhỏ hơn của trình duyệt (13.33px trên Chrome và Firefox).cursor: pointerhiện con trỏ hình bàn tay. Mặc định nút hiện mũi tên bình thường.:hover,:activevà:focus-visibleđịnh dạng các trạng thái rê chuột, nhấn và focus bàn phím.:focus-visiblehiện vòng focus khi dùng bàn phím nhưng không hiện sau cú nhấp chuột, nên bạn không cần xóaoutlineđể tránh nó.:disablednhắm tới các nút có thuộc tínhdisabled.
Nhấn Tab trong khung xem trước để thấy vòng focus màu hổ phách di chuyển giữa hai nút đầu. Nút bị vô hiệu hóa bị bỏ qua. (Trên Mac, Safari và Firefox chỉ Tab tới nút khi bật điều hướng bằng bàn phím trong cài đặt hệ thống; trên Safari, Option+Tab hoạt động mà không cần bật.) Danh sách đầy đủ các trạng thái có ở trang CSS hover.
Nút có biểu tượng
Vì <button> chứa được HTML, biểu tượng nằm bên trong cạnh chữ. Nút chỉ có biểu tượng thì không có chữ nào để trình đọc màn hình đọc, nên hãy thêm aria-label cho nó:
aria-hidden="true" trên SVG giữ nó ngoài cây trợ năng, nên nút đầu được đọc là "Add item, button" và nút thứ hai là "Delete, button".
button và input type="submit"
<input type="submit"> là cách viết nút submit cũ hơn. Cả hai gửi form theo cùng một cách; khác biệt là thứ chúng chứa được.
<input type="submit" value="Send"> <!-- label comes from value, text only -->
<button type="submit">Send</button> <!-- label is the content, HTML allowed -->
<button> | <input type="submit"> | |
|---|---|---|
| Nhãn | Nội dung giữa hai thẻ | Thuộc tính value |
| Chứa được biểu tượng hoặc markup | Có | Không |
| Thẻ đóng | Bắt buộc | Không có (phần tử rỗng) |
| Type mặc định | submit | Luôn là submit |
Hãy dùng <button>. Lý do duy nhất để giữ <input type="submit"> là CSS hoặc JavaScript có sẵn đang chọn nó. Ngoài ra còn có <input type="button"> và <input type="reset">, cùng ý tưởng cho hai type còn lại.
Nút hay link?
Nút làm một việc trên trang hiện tại: gửi, mở, bật tắt, xóa. Link đi tới một URL khác. Nếu nhấp vào làm đổi thanh địa chỉ, nó nên là <a href>, được định dạng như nút nếu thiết kế cần. Cách làm đó, và vì sao đặt nút trong link là không hợp lệ, có ở trang nút link HTML.
Khả năng tiếp cận
- Dùng
<button>thật. Nó nhận focus được, hoạt động với Enter và Space, và được đọc là nút. Làm lại điều đó trên một<div>cầnrole,tabindexvà trình xử lý phím, mà thường vẫn chưa đủ. - Mọi nút đều cần một tên: chữ của nó, hoặc
aria-labelkhi nó chỉ có biểu tượng. - Giữ kiểu focus nhìn thấy được.
outline: nonemà không có gì thay thế sẽ khiến người dùng bàn phím lạc lối. - Làm vùng nhấp đủ lớn. WCAG 2.2 yêu cầu ít nhất 24 x 24 pixel CSS; padding như ví dụ định dạng ở trên cho chiều cao khoảng 40 pixel.
- Với nút bật tắt, thêm
aria-pressed="true"hoặc"false"và cập nhật khi trạng thái thay đổi.
Lỗi thường gặp
- Nút trong form không có
type. Nó gửi form. Hãy viếttype="button"trên mọi nút không dùng để gửi. - Bọc nút trong link,
<a href="/x"><button>Go</button></a>. Đó là HTML không hợp lệ và mỗi trình duyệt xử lý một kiểu. Hãy dùng một phần tử: link được định dạng như nút. - Dùng
<div onclick>làm nút. Không thể tới nó bằng bàn phím. - Xóa viền focus mà không thêm kiểu
:focus-visible. - Viết
disabled="false"và mong nút được bật. Hãy xóa thuộc tính. - Quên
font: inheritrồi thắc mắc vì sao nút dùng phông chữ khác với phần còn lại của trang.
Câu hỏi thường gặp
Làm sao tạo một nút trong HTML?
Viết <button type="button">Click me</button>. Chữ giữa hai thẻ là nhãn của nút. Thêm một trình nghe sự kiện click bằng JavaScript để nút làm gì đó, hoặc đặt nó trong một <form> với type="submit" để gửi form.
Type mặc định của nút HTML là gì?
submit. Một <button> không có thuộc tính type nằm trong form sẽ gửi form đó khi được nhấp, đó là lý do một nút bình thường trong form có thể làm tải lại trang. Hãy viết type="button" cho mọi nút chạy JavaScript.
button và input type=submit khác nhau thế nào?
Cả hai đều gửi form. <button> có thể chứa HTML (một biểu tượng, chữ đậm) giữa hai thẻ, còn <input type="submit"> lấy nhãn từ thuộc tính value và chỉ chứa được chữ thuần. Hầu hết code hiện đại dùng <button>.
Làm sao vô hiệu hóa một nút trong HTML?
Thêm thuộc tính disabled: <button disabled>Save</button>. Nút bị vô hiệu hóa không nhấp hay focus được, và name, value của nó không được gửi cùng form. Xóa thuộc tính (btn.disabled = false trong JavaScript) để bật lại.
Làm sao để nút HTML dẫn sang trang khác?
Dùng một link được định dạng như nút: <a href="/pricing" class="btn">See pricing</a>. <button> dành cho các thao tác trên trang hiện tại. Bọc nút trong <a> là HTML không hợp lệ.
Tại sao nút của tôi làm tải lại trang?
Nút nằm trong một <form> và không có type, nên nó là nút submit và trình duyệt gửi form rồi tải phản hồi. Hãy thêm type="button" cho nút, hoặc gọi event.preventDefault() trong một trình nghe submit nếu bạn xử lý form bằng JavaScript.