Menu

Nút trong HTML: các type, submit, disabled và định dạng

Cách tạo nút trong HTML bằng phần tử <button>: ba type (submit, button, reset), gửi giá trị cùng form, nút bị vô hiệu hóa, nút có biểu tượng, và định dạng bằng CSS mà vẫn giữ vòng focus.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

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.

typeTác dụngDùng cho
submitGửi form chứa nó. Đây là giá trị mặc định.Thao tác chính của form
buttonTự nó không làm gì; JavaScript của bạn quyết địnhBậ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 đầuHiế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: inherit cho 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: pointer hiện con trỏ hình bàn tay. Mặc định nút hiện mũi tên bình thường.
  • :hover, :active và :focus-visible định dạng các trạng thái rê chuột, nhấn và focus bàn phím. :focus-visible hiệ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óa outline để tránh nó.
  • :disabled nhắm tới các nút có thuộc tính disabled.

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ãnNội dung giữa hai thẻThuộc tính value
Chứa được biểu tượng hoặc markupCóKhông
Thẻ đóngBắt buộcKhông có (phần tử rỗng)
Type mặc địnhsubmitLuô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 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ần role, tabindex và 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-label khi nó chỉ có biểu tượng.
  • Giữ kiểu focus nhìn thấy được. outline: none mà 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ết type="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: inherit rồ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.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu