Thẻ input và các type của nó
<input> là một trường của form, và thuộc tính (attribute) type quyết định nó là loại trường nào. Cùng một thẻ có thể tạo ô văn bản, thanh trượt, bộ chọn ngày hay bộ chọn màu. Thử từng trường bên dưới rồi nhấn Submit để xem form gửi đi những gì:
<input> là phần tử rỗng nên không có thẻ đóng. name là khóa mà giá trị được gửi kèm, còn value là giá trị ban đầu. Thiếu type hoặc viết sai sẽ cho ra một ô văn bản bình thường.
Tất cả các kiểu input trong HTML
type | Là gì | Ghi chú |
|---|---|---|
text | Một dòng văn bản | Mặc định |
password | Văn bản hiển thị thành dấu chấm | Bản thân nó không mã hóa; hãy gửi qua HTTPS |
email | Một địa chỉ email | Kiểm tra định dạng; có phím @ trên bàn phím điện thoại |
url | Một địa chỉ web | Phải bắt đầu bằng scheme như https:// |
tel | Một số điện thoại | Bàn phím số trên di động, không kiểm tra định dạng |
search | Một ô tìm kiếm | Thường có nút xóa nội dung |
number | Một con số | Nút tăng giảm, min, max, step |
range | Một thanh trượt | Cố ý không chính xác; giá trị là một số |
date | Một ngày | Giá trị là YYYY-MM-DD |
time | Một giờ trong ngày | Giá trị là HH:MM (24 giờ) |
datetime-local | Ngày và giờ, không có múi giờ | Giá trị là YYYY-MM-DDTHH:MM |
month | Một năm và tháng | Không phải trình duyệt nào cũng hỗ trợ |
week | Một năm và số tuần | Không phải trình duyệt nào cũng hỗ trợ |
color | Một bộ chọn màu | Giá trị là #rrggbb viết thường |
checkbox | Một ô bật/tắt | Xem checkbox trong HTML |
radio | Chọn một trong một nhóm | Xem radio button trong HTML |
file | Một bộ chọn tệp | accept, multiple |
hidden | Một giá trị được gửi nhưng không hiển thị | Cho ID và token |
submit | Một nút gửi form | <button type="submit"> linh hoạt hơn |
reset | Một nút đặt lại | Hiếm khi là ý hay |
button | Một nút tự nó không làm gì | Dùng với JavaScript |
image | Một nút gửi được vẽ bằng ảnh | Gửi kèm cả tọa độ cú nhấp |
Các type văn bản và bàn phím điện thoại
email, url, tel, search và text trên máy tính đều trông như một ô văn bản. Khác biệt nằm ở cách kiểm tra hợp lệ và, trên điện thoại, ở bàn phím được mở ra. Trong ví dụ này, viền ô chuyển xanh hoặc đỏ tùy theo đánh giá của trình duyệt về giá trị:
- Với trình duyệt,
ada@examplelà email hợp lệ: nó chỉ kiểm tra có văn bản, có@và có tên miền, chứ không kiểm tra tên miền có dấu chấm hay không. Việc kiểm tra thật sự diễn ra trên máy chủ. example.comkhông phảiurlhợp lệ vì thiếu scheme.https://example.comthì hợp lệ.telchấp nhận mọi thứ. Định dạng số điện thoại giữa các nước quá khác nhau nên không có kiểm tra sẵn; thêmpatternnếu bạn cần.inputmode="numeric"yêu cầu điện thoại mở bàn phím số mà không gặp các vấn đề củatype="number", nên đây là lựa chọn đúng cho mã bưu chính, mã dùng một lần và số thẻ.
number và range
Cả hai đều nhận min, max và step. number dành cho giá trị chính xác; range là thanh trượt cho những giá trị mà con số cụ thể không quá quan trọng. Thanh trượt range không hiển thị số, nên hãy đi kèm một thẻ <output>:
Với number, step mặc định là 1, nên một trường giá tiền không có step="0.01" sẽ từ chối 4.99 khi gửi form. Trong JavaScript, input.value luôn là chuỗi; dùng input.valueAsNumber để lấy một số.
Ngày và giờ
Các type ngày và giờ mở bộ chọn riêng của trình duyệt. Người đọc thấy định dạng theo khu vực của họ (09/24/2026, 24.09.2026), nhưng giá trị luôn có cùng một định dạng cố định:
Định dạng cố định đó là thứ máy chủ nhận được và JavaScript đọc được, nên bạn không bao giờ phải phân tích "24.09.2026". min và max cũng dùng định dạng này. datetime-local không có múi giờ: nếu múi giờ quan trọng, hãy chuyển đổi trên máy chủ theo múi giờ của người đọc.
color và file
accept="image/*" giới hạn bộ chọn tệp chỉ hiện ảnh (và cho phép dùng camera trên điện thoại); nó cũng nhận phần mở rộng, như accept=".pdf,.docx". Đây chỉ là gợi ý cho bộ chọn, nên hãy kiểm tra loại tệp trên máy chủ. multiple cho phép chọn nhiều tệp. Một lần tải lên thật sự còn cần method="post" và enctype="multipart/form-data" trên form.
Gợi ý với datalist
Thẻ <datalist> cung cấp cho ô văn bản một danh sách gợi ý mà vẫn cho phép nhập bất kỳ giá trị nào. Nối chúng với nhau bằng thuộc tính list:
Gõ "ja" vào ô để xem các gợi ý khớp. Khác với select, người đọc có thể gõ một giá trị không có trong danh sách.
Các thuộc tính dùng được trên input
| Thuộc tính | Tác dụng |
|---|---|
name | Khóa mà giá trị được gửi kèm |
value | Giá trị ban đầu |
placeholder | Gợi ý hiển thị khi ô còn trống (không phải nhãn) |
required | Phải điền trước khi gửi |
disabled | Không dùng được và không được gửi |
readonly | Không sửa được nhưng vẫn được gửi |
autocomplete | Tự động điền gì: email, name, current-password, one-time-code, off |
min, max, step | Giới hạn cho number, range, ngày và giờ |
minlength, maxlength | Giới hạn độ dài cho các type văn bản |
pattern | Biểu thức chính quy mà toàn bộ giá trị phải khớp |
inputmode | Bàn phím điện thoại nào được hiện: numeric, decimal, email, tel, url |
list | id của một thẻ <datalist> |
multiple | Nhiều giá trị, cho email và file |
accept | Loại tệp cho file |
Lỗi thường gặp
- Dùng
type="number"cho số điện thoại, mã bưu chính hay số thẻ. Chúng không phải số lượng. Dùngtelhoặctextkèminputmode="numeric". - Trường giá tiền không có
step="0.01". Giá trị thập phân sẽ không qua được kiểm tra. - Dùng
placeholderlàm nhãn. Nó biến mất ngay khi người đọc bắt đầu gõ. - Dựa vào
accepthoặctype="email"để bảo mật. Chúng chỉ giúp tiện hơn; máy chủ vẫn phải kiểm tra lại. - Dùng
type="month"hoặctype="week"mà không có phương án dự phòng. Một số trình duyệt chỉ hiện ô văn bản thường. - Viết thẻ đóng
</input>.<input>là phần tử rỗng.
Câu hỏi thường gặp
HTML có bao nhiêu kiểu input?
22: button, checkbox, color, date, datetime-local, email, file, hidden, image, month, number, password, radio, range, reset, search, submit, tel, text, time, url và week. Một type không hợp lệ hoặc bị bỏ trống sẽ hoạt động như text.
Kiểu input mặc định trong HTML là gì?
text. Một thẻ <input> không có type, hoặc có type mà trình duyệt không biết, là một ô nhập văn bản một dòng.
Có nên dùng type="number" cho số điện thoại hay mã bưu chính không?
Không. number dành cho số lượng: nó thêm nút tăng giảm và từ chối dấu +, khoảng trắng và dấu gạch nối vốn có trong số điện thoại. Dùng type="tel" cho số điện thoại, và type="text" kèm inputmode="numeric" cho các mã như mã bưu chính hay số thẻ.
Input type date dùng định dạng nào?
Giá trị luôn là YYYY-MM-DD, chẳng hạn 2026-09-24, bất kể người đọc thấy định dạng nào trên màn hình. Phần hiển thị theo ngôn ngữ và khu vực của người đọc; giá trị được gửi đi và đọc bằng script thì không.
Thẻ input có cần thẻ đóng không?
Không. <input> là phần tử rỗng (void element): viết <input type="text" name="city">. Thẻ đóng </input> là không hợp lệ, còn dấu gạch chéo tự đóng trong <input /> được phép nhưng không có tác dụng gì.