Cách tạo nút dẫn tới một trang
Viết một link bình thường, <a href>, và định dạng bằng CSS để nó trông như nút. Nó dẫn tới trang như mọi link, và giữ mọi tính năng của link: mở trong tab mới, sao chép địa chỉ liên kết và xem trước URL khi rê chuột.
Các quy tắc biến một link thành nút:
display: inline-blockcho padding đẩy khung rộng ra mà vẫn giữ nó trên dòng chữ.text-decoration: nonebỏ gạch chân.colorvàbackgroundthay cho màu xanh của link.:focus-visiblecho người dùng bàn phím một vòng focus rõ ràng.
Cùng class đó dùng được cho <button>, nên nút gửi form và link sang trang khác có thể trông giống hệt nhau trong khi mỗi cái làm đúng việc của mình.
Nút hay link: dùng phần tử nào
Câu hỏi là điều gì xảy ra khi nhấp, không phải nó trông thế nào.
| Khi nhấp vào | Dùng | Ví dụ |
|---|---|---|
| Đi tới một URL khác | <a href> | Đăng ký, Đọc thêm, Xem bảng giá, Tải xuống |
| Thay đổi điều gì đó trên trang này | <button type="button"> | Mở menu, Phát, Thêm vào giỏ, Hiện mật khẩu |
| Gửi một form | <button type="submit"> | Đăng nhập, Tìm kiếm, Lưu |
Một link được đọc là "link" và một nút được đọc là "button" cho người dùng trình đọc màn hình biết điều gì sắp xảy ra. Cách dùng bàn phím cũng khác: Enter kích hoạt cả hai, nhưng Space chỉ kích hoạt nút (trên link, Space cuộn trang). Bản thân phần tử nút có ở trang nút HTML.
Vì sao không đặt nút bên trong link
Đây là cách hầu hết mọi người thử đầu tiên:
<!-- Invalid: interactive content inside <a> -->
<a href="/signup"><button>Sign up</button></a>
<!-- Invalid the other way round, too -->
<button><a href="/signup">Sign up</a></button>
Chuẩn HTML cấm cả hai: <a> và <button> không được chứa phần tử tương tác. Trên thực tế bàn phím gặp hai điểm dừng Tab cho một nút, trình đọc màn hình có thể đọc "link, button, Sign up", và một cú nhấp có đi theo link hay không là tùy trình duyệt. Hãy chọn một phần tử.
Vì sao không dùng onclick với location.href
Cách lách phổ biến khác là một nút đặt URL bằng JavaScript. Nó trông giống hệt một link:
(Ví dụ dùng window.open vì khung xem trước không được rời trang; code thường gặp là location.href = '...'.) Hãy rê chuột và nhấp chuột phải vào cả hai: chỉ link thật hiện URL và có "Mở liên kết trong thẻ mới" và "Sao chép địa chỉ liên kết". Nút cũng không nhận Ctrl+click hay nhấp chuột giữa, trình duyệt không đánh dấu nó là đã truy cập, và công cụ tìm kiếm không đi theo nó như một link. Nếu đích đến là một URL, hãy viết <a href>.
Nút trong form mở một URL
Có một trường hợp nút <button> dẫn sang trang khác là đúng: khi nó gửi kèm dữ liệu. Ô tìm kiếm là ví dụ kinh điển. action của form là URL, và method="get" đưa các trường vào chuỗi truy vấn:
Nhấn Search: trên trang thật, trình duyệt sẽ đi tới https://duckduckgo.com/?q=html+button+link. Khung xem trước hiển thị dữ liệu thay vì rời trang. formaction gửi cùng form đó tới một URL khác từ nút thứ hai.
Nút link bị vô hiệu hóa
Link không có thuộc tính disabled; <a disabled> chẳng làm gì cả. Để tắt một nút link, hãy xóa href của nó (thẻ <a> không có href không phải link, không nhấp hay focus được), và đánh dấu bằng aria-disabled="true" để cả CSS lẫn trình đọc màn hình đều biết:
Nhấn Tab trong khung xem trước: focus chỉ dừng ở nút đầu tiên. Một số trang giữ href và thêm pointer-events: none, nhưng cách này chỉ chặn chuột. Link vẫn tới được bằng Tab và Enter vẫn đi theo nó.
Nút mở tab mới và nút tải xuống
Mọi thuộc tính của link vẫn hoạt động trên link được định dạng như nút:
<a class="btn" href="/files/guide.pdf" download>Download the guide</a>
<a class="btn" href="https://github.com/" target="_blank" rel="noopener">GitHub</a>
Đây là thêm một lý do để dùng <a>: <button> không có download hay target. Xem thêm về target ở trang mở link trong tab mới.
Lỗi thường gặp
- Nút trong link, hoặc link trong nút. HTML không hợp lệ, hoạt động khó lường.
<button onclick="location.href=...">chỉ để chuyển trang. Không mở được tab mới, không sao chép được link, không được thu thập dữ liệu.role="button"trên một link chuyển trang. Nó báo cho người dùng trình đọc màn hình rằng đó là nút, rồi trang lại đổi. Hãy để nó là link.- Link định dạng như nút cho các thao tác như "Xóa" hay "Mở menu" với
href="#". Nếu không có gì được tải, hãy dùng<button type="button">. <a disabled>. Link không có thuộc tính này. Hãy xóahref.- Quên
display: inline-block, khiến padding dọc đè lên các dòng phía trên và phía dưới.
Câu hỏi thường gặp
Làm sao tạo một nút dẫn sang trang khác trong HTML?
Dùng một link và định dạng nó như nút: <a href="/signup" class="btn">Sign up</a> cùng CSS cho padding, nền, bo góc và text-decoration: none. Nó trông như nút và hoạt động như link, đúng với bản chất của nó.
Có thể đặt button bên trong thẻ a không?
Không. Chuẩn HTML không cho phép nội dung tương tác như <button> nằm trong <a>. Mỗi trình duyệt xử lý một kiểu, người dùng bàn phím gặp hai điểm dừng Tab cho một nút, và trình đọc màn hình đọc lên rất khó hiểu. Hãy dùng một phần tử.
Button có thuộc tính href không?
Không. <button> không có href. Để đưa trình duyệt tới một URL, hãy dùng <a href>, hoặc đặt nút trong một <form> có action (thuộc tính formaction trên nút sẽ ghi đè nó).
Dùng onclick với location.href trên nút có tệ không?
Nó chạy được, nhưng người đọc mất mọi thứ mà link mang lại: nhấp chuột giữa và Ctrl+click để mở tab mới, Sao chép địa chỉ liên kết, xem trước URL khi rê chuột, và công cụ tìm kiếm không đi theo nó như một link. Hãy dùng <a> khi đích đến là một URL.
Làm sao vô hiệu hóa một link trông như nút?
Link không có thuộc tính disabled. Hãy xóa href để nó không còn là link, thêm aria-disabled="true" và định dạng nó ở trạng thái vô hiệu hóa. Thêm lại href khi nó cần hoạt động trở lại.