Thẻ nên dùng
Đặt dòng này trong <head> của mọi trang:
<meta name="viewport" content="width=device-width, initial-scale=1">
width=device-width làm bố cục rộng bằng màn hình, và initial-scale=1 mở trang ở mức zoom 100%. Hầu hết các trang web chỉ cần như vậy. Một trang đầy đủ đã có thẻ này:
Script đọc thẻ và chiều rộng bố cục. Trình duyệt máy tính bỏ qua thẻ viewport, nên trong bản xem trước này chiều rộng đơn giản là chiều rộng của khung xem trước. Trên điện thoại, cùng tệp này sẽ báo chiều rộng của điện thoại (thường từ 360 đến 430 pixel CSS) nhờ có thẻ.
Điện thoại làm gì khi thiếu thẻ
Một trình duyệt di động không tìm thấy thẻ viewport sẽ cho rằng trang được làm cho máy tính. Nó dàn trang rộng khoảng 980 pixel, rồi thu nhỏ toàn bộ cho vừa màn hình. Hai chiếc điện thoại mô phỏng bên dưới tải cùng một trang, một chiếc dàn ở 980px và một chiếc ở chiều rộng điện thoại, cả hai được thu về cùng kích thước:
Trên điện thoại đầu tiên, chữ 16px trở nên tí hon và người đọc phải dùng hai ngón tay để phóng to. Trên điện thoại thứ hai, chữ vẫn dễ đọc, và các cột xếp chồng lên nhau vì quy tắc @media (max-width: 600px) khớp. Đó là nhiệm vụ thứ hai của thẻ: media query nhìn thấy chiều rộng bố cục, nên không có thẻ thì điện thoại báo 980px và các style cho di động của bạn không bao giờ được áp dụng. Đổi 375 thành 980 trong show('with', 375) thì hai điện thoại trông giống hệt nhau.
Thẻ chỉ là một nửa công việc
Thẻ viewport cho bạn một bố cục hẹp; CSS của bạn phải vừa trong đó. Chỉ một phần tử có chiều rộng cố định lớn hơn màn hình cũng làm cả trang cuộn ngang:
Khung đầu tiên cuộn ngang; khung thứ hai co lại cho vừa. Hãy gán max-width: 100% cho ảnh và các phần tử rộng khác, và ưu tiên chiều rộng linh hoạt (phần trăm, fr, flexbox) thay vì chiều rộng pixel cố định.
Các giá trị của viewport
| Giá trị | Ví dụ | Tác dụng |
|---|---|---|
width | width=device-width | Chiều rộng bố cục. device-width là chiều rộng màn hình tính bằng pixel CSS; một con số cũng được phép nhưng hiếm khi là ý hay. |
initial-scale | initial-scale=1 | Mức zoom khi trang mở. |
minimum-scale / maximum-scale | maximum-scale=5 | Giới hạn zoom. Mức tối đa thấp sẽ chặn zoom, nên hãy bỏ maximum-scale. |
user-scalable | user-scalable=yes | Có cho phép phóng to bằng hai ngón tay hay không. Hãy bỏ nó đi. |
viewport-fit | viewport-fit=cover | Cho trang tràn xuống dưới tai thỏ hoặc các góc bo tròn, đi kèm padding env(safe-area-inset-*). |
interactive-widget | interactive-widget=resizes-content | Bàn phím ảo ảnh hưởng tới bố cục thế nào. Được Chrome trên Android hỗ trợ. |
Các giá trị được ngăn cách bằng dấu phẩy. Một trang lấp đầy toàn màn hình trên điện thoại có tai thỏ trông như sau:
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<style>
body {
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
}
</style>
Đừng chặn zoom
Bạn sẽ gặp thẻ này trong các template cũ:
<!-- Avoid: stops people from zooming -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
Nó ngăn phóng to bằng hai ngón tay, điều mà người thị lực kém phụ thuộc vào, và các công cụ kiểm tra khả năng tiếp cận như Lighthouse sẽ đánh dấu nó. Safari trên iOS bỏ qua user-scalable=no, nên thẻ này thậm chí còn không hoạt động nhất quán. Nếu một ô nhập tự phóng to khi chạm vào trên iPhone, nguyên nhân là cỡ chữ của input nhỏ hơn 16px; hãy đặt font-size của input ít nhất là 16px thay vì tắt zoom.
Lỗi thường gặp
- Quên thẻ. Một stylesheet responsive không có tác dụng gì trên điện thoại nếu thiếu thẻ này, vì media query thấy bố cục 980px. Hãy đặt nó cạnh thẻ title trong template trang.
- Dùng dấu chấm phẩy giữa các giá trị. Hãy dùng dấu phẩy:
width=device-width, initial-scale=1. - Viết cứng một chiều rộng như
width=375. Màn hình có nhiều kích thước; hãy dùngdevice-width. - Tắt zoom bằng
user-scalable=nohoặcmaximum-scale=1. - Đổ lỗi cho thẻ khi trang cuộn ngang. Tìm phần tử rộng hơn màn hình và cho nó chiều rộng linh hoạt.
Câu hỏi thường gặp
Thẻ meta viewport có tác dụng gì?
Nó cho trình duyệt di động biết bố cục nên rộng bao nhiêu. Không có nó, hầu hết điện thoại dàn trang ở khoảng 980 pixel CSS rồi thu nhỏ cho vừa màn hình. Với width=device-width, bố cục khớp với chiều rộng màn hình, nên chữ dễ đọc và media query hoạt động.
Thẻ meta viewport chuẩn là gì?
<meta name="viewport" content="width=device-width, initial-scale=1">, đặt trong <head>. Đây là lựa chọn đúng cho gần như mọi trang responsive.
Vì sao meta viewport của tôi không hoạt động?
Kiểm tra thẻ có nằm trong <head> không, name có phải là viewport không và các giá trị có được ngăn cách bằng dấu phẩy không. Nếu trang vẫn cuộn ngang, có phần tử nào đó rộng hơn màn hình, như một chiều rộng cố định, một ảnh lớn hoặc một từ dài; thẻ này không sửa được CSS rộng hơn thiết bị.
Có nên dùng user-scalable=no hoặc maximum-scale=1 không?
Không. Cả hai đều ngăn người dùng phóng to, điều mà nhiều người thị lực kém phụ thuộc vào, và chúng không qua được các bài kiểm tra khả năng tiếp cận. Dù sao Safari trên iOS cũng bỏ qua user-scalable=no.
Thẻ meta viewport có ảnh hưởng đến trình duyệt máy tính không?
Không. Trình duyệt máy tính bỏ qua nó; chiều rộng bố cục ở đó đơn giản là chiều rộng cửa sổ. Thẻ này có tác dụng trên điện thoại và máy tính bảng.