Thông tin cơ bản về thiết kế web đáp ứng

Khi số lượng người dùng điện thoại di động trên Internet tăng lên, việc các nhà thiết kế web bố trí nội dung theo cách phù hợp với nhiều kích thước màn hình ngày càng trở nên quan trọng. Thiết kế web thích ứng, ban đầu do Ethan Marcotte xác định trong A List Apart, là một chiến lược thiết kế đáp ứng nhu cầu của người dùng và khả năng của thiết bị bằng cách thay đổi bố cục của trang web cho phù hợp với thiết bị đang được sử dụng. Ví dụ: một trang web thích ứng có thể hiển thị nội dung ở chế độ xem một cột trên điện thoại, hai cột trên máy tính bảng và ba hoặc bốn cột trên máy tính để bàn.

Khi màn hình rộng hơn, tiện ích sẽ thay đổi hình dạng để phản hồi.

Vì các thiết bị có thể truy cập Internet có rất nhiều kích thước màn hình, nên trang web của bạn cần phải thích ứng với mọi kích thước màn hình hiện có hoặc trong tương lai. Thiết kế thích ứng hiện đại cũng tính đến các chế độ tương tác như màn hình cảm ứng. Mục tiêu là tối ưu hoá trải nghiệm cho mọi người.

Đặt khung nhìn

Các trang được tối ưu hoá cho nhiều thiết bị phải bao gồm thẻ meta viewport ở đầu tài liệu. Thẻ này cho trình duyệt biết cách kiểm soát kích thước và tỷ lệ của trang.

Để cố gắng mang lại trải nghiệm tốt nhất, trình duyệt trên thiết bị di động sẽ hiển thị trang ở chiều rộng màn hình máy tính (thường là khoảng 980px, mặc dù kích thước này khác nhau tuỳ theo thiết bị), sau đó cố gắng làm cho nội dung đẹp mắt hơn bằng cách tăng kích thước phông chữ và điều chỉnh tỷ lệ của nội dung cho vừa với màn hình. Điều này có thể khiến phông chữ trông không nhất quán và yêu cầu người dùng phải phóng to để xem và tương tác với nội dung.

<!DOCTYPE html>
<html lang="en">
  <head>
    …
    <meta name="viewport" content="width=device-width, initial-scale=1">
    …
  </head>
  …

Việc sử dụng giá trị khung nhìn meta width=device-width sẽ cho trang biết để khớp với chiều rộng của màn hình tính bằng pixel không phụ thuộc vào thiết bị (DIP), một đơn vị pixel hình ảnh chuẩn (có thể bao gồm nhiều pixel thực trên màn hình có mật độ điểm ảnh cao). Điều này cho phép trang định hình lại nội dung để phù hợp với nhiều kích thước màn hình.

Ảnh chụp màn hình một trang có văn bản khó đọc vì bị thu nhỏ quá mức.
Trang không có thẻ meta viewport sẽ tải ở chế độ thu nhỏ rất nhiều, khiến văn bản khó đọc. Xem ví dụ này trên Glitch.
Ảnh chụp màn hình của cùng một trang có văn bản ở kích thước có thể đọc được.
Khi đặt thẻ meta viewport, bạn có thể đọc trang mà không cần phóng to. Xem ví dụ này trên Glitch.

Một số trình duyệt giữ nguyên chiều rộng của trang khi xoay sang chế độ ngang và phóng to để lấp đầy màn hình thay vì tạo lại luồng. Việc thêm giá trị initial-scale=1 sẽ yêu cầu trình duyệt thiết lập mối quan hệ 1:1 giữa các pixel CSS và các pixel độc lập với thiết bị bất kể hướng thiết bị, cho phép trang tận dụng chiều rộng ngang đầy đủ.

Quy trình kiểm tra Lighthouse Không có thẻ <meta name="viewport"> với width hoặc initial-scale có thể giúp bạn tự động hoá quy trình đảm bảo rằng tài liệu HTML của bạn sử dụng thẻ meta khung nhìn đúng cách.

Định cỡ nội dung cho khung nhìn

Trên cả máy tính và thiết bị di động, người dùng thường cuộn trang web theo chiều dọc chứ không phải theo chiều ngang. Việc buộc người dùng cuộn theo chiều ngang hoặc thu nhỏ để xem toàn bộ trang sẽ gây ra trải nghiệm kém cho người dùng.

Khi phát triển một trang web dành cho thiết bị di động bằng thẻ meta viewport, thường thì bạn sẽ vô tình tạo ra nội dung trang không vừa với khung nhìn được chỉ định. Ví dụ: hình ảnh hiển thị rộng hơn khung nhìn có thể gây ra việc cuộn theo chiều ngang. Để tránh điều này, hãy điều chỉnh nội dung của bạn cho vừa với khung nhìn.

Quy trình kiểm tra Lighthouse về Kích thước của nội dung không phù hợp với khung nhìn có thể giúp bạn tự động hoá quy trình phát hiện nội dung tràn.

Hình ảnh

Hình ảnh có kích thước cố định sẽ khiến trang cuộn nếu hình ảnh lớn hơn khung nhìn. Bạn nên đặt max-width của tất cả hình ảnh thành 100%. Thao tác này sẽ thu nhỏ hình ảnh để vừa với không gian có sẵn, đồng thời ngăn hình ảnh bị kéo giãn quá kích thước ban đầu.

Trong hầu hết các trường hợp, bạn có thể thực hiện việc này bằng cách thêm nội dung sau vào trang kiểu:

img {
  max-width: 100%;
  display: block;
}

Thêm kích thước của hình ảnh vào phần tử img

Ngay cả khi bạn đặt max-width: 100%, bạn vẫn nên thêm thuộc tính widthheight vào thẻ <img> để trình duyệt có thể đặt trước không gian cho hình ảnh trước khi tải. Điều này giúp ngăn bố cục thay đổi.

Bố cục

Do kích thước và chiều rộng màn hình tính bằng pixel CSS khác nhau rất nhiều giữa các thiết bị (ví dụ: giữa điện thoại và máy tính bảng, thậm chí giữa các điện thoại khác nhau), nên nội dung không nên dựa vào chiều rộng khung nhìn cụ thể để hiển thị tốt.

Trước đây, việc này yêu cầu bạn phải đặt các phần tử bố cục theo tỷ lệ phần trăm. Việc sử dụng phép đo pixel yêu cầu người dùng cuộn theo chiều ngang trên màn hình nhỏ:

Ảnh chụp màn hình bố cục hai cột, trong đó phần lớn cột thứ hai nằm ngoài khung nhìn
Bố cục nổi sử dụng pixel. Xem ví dụ này trên Glitch.

Việc sử dụng tỷ lệ phần trăm sẽ làm cho các cột hẹp hơn trên màn hình nhỏ hơn, vì mỗi cột luôn chiếm cùng một tỷ lệ phần trăm chiều rộng màn hình:

Các kỹ thuật bố cục CSS hiện đại như Flexbox, Bố cục lưới và Multicol giúp bạn tạo các lưới linh hoạt này dễ dàng hơn nhiều.

Hộp linh hoạt

Sử dụng Flexbox khi bạn có một tập hợp các mục có kích thước khác nhau và bạn muốn các mục đó vừa vặn trong một hàng hoặc nhiều hàng, trong đó các mục nhỏ hơn chiếm ít không gian hơn và các mục lớn hơn chiếm nhiều không gian hơn.

.items {
  display: flex;
  justify-content: space-between;
}

Bạn có thể sử dụng Flexbox để hiển thị các mục dưới dạng một hàng hoặc gói vào nhiều hàng khi không gian có sẵn giảm xuống.

Đọc thêm về Flexbox.

Bố cục lưới CSS

Bố cục lưới CSS tạo ra các lưới linh hoạt. Bạn có thể cải thiện ví dụ về thành phần nổi trước đó bằng cách sử dụng bố cục lưới và đơn vị fr, đại diện cho một phần không gian có sẵn trong vùng chứa.

.container {
  display: grid;
  grid-template-columns: 1fr 3fr;
}

Bạn cũng có thể sử dụng Bố cục lưới để tạo bố cục lưới thông thường với số lượng mục vừa đủ. Số lượng kênh có sẵn sẽ giảm khi kích thước màn hình giảm. Bản minh hoạ sau đây cho thấy một lưới chứa nhiều thẻ vừa với mỗi hàng, với kích thước tối thiểu là 200px.

Đọc thêm về Bố cục lưới CSS

Bố cục nhiều cột

Đối với một số loại bố cục, bạn có thể sử dụng Bố cục nhiều cột (Multicol) để tạo số lượng cột thích ứng bằng thuộc tính column-width. Trong bản minh hoạ sau, trang sẽ thêm các cột khi có chỗ cho một cột 200px khác.

Đọc thêm về Multicol

Sử dụng truy vấn phương tiện CSS để tạo tính thích ứng

Đôi khi, bạn có thể cần thực hiện các thay đổi rộng rãi hơn đối với bố cục để hỗ trợ một số kích thước màn hình nhất định so với các kỹ thuật được mô tả trước đó. Đây là lúc truy vấn nội dung nghe nhìn phát huy tác dụng.

Truy vấn nội dung đa phương tiện là các bộ lọc đơn giản mà bạn có thể áp dụng cho các kiểu CSS để thay đổi các kiểu đó dựa trên loại thiết bị hiển thị nội dung. Các lớp này cũng có thể thay đổi kiểu dựa trên các tính năng của thiết bị, bao gồm chiều rộng, chiều cao, hướng và liệu thiết bị có đang được dùng làm màn hình cảm ứng hay không.

Để cung cấp nhiều kiểu in, bạn có thể nhắm đến một loại đầu ra và đưa vào một trang kiểu cho các kiểu in:

<!DOCTYPE html>
<html lang="en">
  <head>
    …
    <link rel="stylesheet" href="print.css" media="print">
    …
  </head>
  …

Bạn cũng có thể sử dụng truy vấn nội dung đa phương tiện để đưa kiểu in vào trang kiểu chính:

@media print {
  /* print styles go here */
}

Đối với thiết kế web thích ứng, các truy vấn phổ biến nhất là về các tính năng của thiết bị, vì vậy, bạn có thể tuỳ chỉnh bố cục cho màn hình cảm ứng hoặc màn hình nhỏ hơn.

Truy vấn nội dung nghe nhìn dựa trên kích thước khung nhìn

Truy vấn nội dung nghe nhìn cho phép bạn tạo trải nghiệm thích ứng áp dụng các kiểu cụ thể cho kích thước màn hình cụ thể. Truy vấn về kích thước màn hình có thể kiểm thử những điều sau:

  • width (min-width, max-width)
  • height (min-height, max-height)
  • orientation
  • aspect-ratio

Tất cả các tính năng này đều được hỗ trợ rất tốt trên trình duyệt. Để biết thêm thông tin chi tiết, bao gồm cả thông tin hỗ trợ trình duyệt, hãy xem width (chiều rộng), height (chiều cao), orientation (hướng) và aspect-ratio (tỷ lệ khung hình) trên MDN.

Truy vấn nội dung nghe nhìn dựa trên chức năng của thiết bị

Do có nhiều loại thiết bị, nhà phát triển không thể giả định rằng mọi thiết bị lớn đều là máy tính để bàn hoặc máy tính xách tay thông thường, hoặc mọi thiết bị nhỏ đều sử dụng màn hình cảm ứng. Một số nội dung bổ sung mới hơn trong thông số kỹ thuật của truy vấn nội dung nghe nhìn cho phép bạn kiểm thử các tính năng như loại con trỏ dùng để tương tác với thiết bị và liệu người dùng có thể giữ con trỏ trên các phần tử hay không.

  • hover
  • pointer
  • any-hover
  • any-pointer

Hãy thử xem bản minh hoạ này trên nhiều thiết bị, chẳng hạn như máy tính để bàn thông thường và điện thoại hoặc máy tính bảng.

Các tính năng mới này được hỗ trợ tốt trong tất cả các trình duyệt hiện đại. Tìm hiểu thêm trên các trang MDN về di chuột, any-hover, con trỏany-pointer.

Sử dụng any-hoverany-pointer

Các tính năng any-hoverany-pointer kiểm tra xem người dùng có thể giữ con trỏ trên các phần tử (thường được gọi là lơ lửng) hay không hoặc có sử dụng con trỏ hay không, ngay cả khi đó không phải là cách chính để họ tương tác với thiết bị. Hãy cẩn thận khi sử dụng các phương thức này, ví dụ: để tránh buộc người dùng màn hình cảm ứng chuyển sang sử dụng chuột. Tuy nhiên, any-hoverany-pointer có thể hữu ích nếu bạn cần xác định loại thiết bị mà người dùng sử dụng. Ví dụ: máy tính xách tay có màn hình cảm ứng và bàn di chuột phải khớp với con trỏ thô và con trỏ tinh, ngoài khả năng di chuột.

Cách chọn điểm ngắt

Không xác định điểm ngắt dựa trên các lớp thiết bị hoặc bất kỳ sản phẩm, tên thương hiệu hoặc hệ điều hành nào. Điều này khiến mã của bạn khó duy trì. Thay vào đó, hãy để nội dung xác định cách bố cục thay đổi để vừa với vùng chứa.

Chọn các điểm ngắt chính bằng cách bắt đầu từ những điểm nhỏ, sau đó tăng dần

Trước tiên, hãy thiết kế nội dung vừa với kích thước màn hình nhỏ, sau đó mở rộng màn hình cho đến khi cần có điểm ngắt. Điều này cho phép bạn giảm thiểu số lượng điểm ngắt trên trang và tối ưu hoá các điểm ngắt đó dựa trên nội dung.

Ví dụ sau đây sẽ hướng dẫn bạn về ví dụ về tiện ích thông tin thời tiết dự báo ở đầu trang này. Bước đầu tiên là làm cho thông tin dự báo trông đẹp mắt trên màn hình nhỏ:

Ảnh chụp màn hình ứng dụng thời tiết ở chiều rộng dành cho thiết bị di động
Ứng dụng ở chiều rộng hẹp.

Tiếp theo, hãy đổi kích thước trình duyệt cho đến khi có quá nhiều khoảng trắng giữa các phần tử để tiện xem tiện ích. Quyết định này là chủ quan, nhưng chắc chắn là quá rộng nếu lớn hơn 600px.

Ảnh chụp màn hình ứng dụng thời tiết có khoảng trống lớn giữa các mục
Ở kích thước này, bố cục của ứng dụng có thể sẽ thay đổi.

Để chèn điểm ngắt tại 600px, hãy tạo hai truy vấn nội dung đa phương tiện ở cuối CSS cho thành phần: một truy vấn để sử dụng khi trình duyệt có kích thước 600px trở xuống và một truy vấn để sử dụng khi trình duyệt có kích thước rộng hơn 600px.

@media (max-width: 600px) {

}

@media (min-width: 601px) {

}

Cuối cùng, hãy tái cấu trúc CSS. Bên trong truy vấn nội dung đa phương tiện cho max-width của 600px, hãy thêm CSS chỉ dành cho màn hình nhỏ. Bên trong truy vấn nội dung đa phương tiện cho min-width của 601px, hãy thêm CSS cho màn hình lớn hơn.

Chọn các điểm ngắt nhỏ khi cần

Ngoài việc chọn các điểm ngắt chính khi bố cục thay đổi đáng kể, bạn cũng nên điều chỉnh cho các thay đổi nhỏ. Ví dụ: giữa các điểm ngắt chính, bạn có thể điều chỉnh lề hoặc khoảng đệm trên một phần tử hoặc tăng cỡ chữ để bố cục trông tự nhiên hơn.

Ví dụ này tuân theo cùng một mẫu như ví dụ trước, bắt đầu bằng việc tối ưu hoá bố cục màn hình nhỏ hơn. Trước tiên, hãy tăng phông chữ khi chiều rộng khung nhìn lớn hơn 360px. Sau đó, khi có đủ không gian, bạn có thể tách nhiệt độ cao và thấp để chúng nằm trên cùng một dòng và làm cho biểu tượng thời tiết lớn hơn.

@media (min-width: 360px) {
  body {
    font-size: 1.0em;
  }
}

@media (min-width: 500px) {
  .seven-day-fc .temp-low,
  .seven-day-fc .temp-high {
    display: inline-block;
    width: 45%;
  }

  .seven-day-fc .seven-day-temp {
    margin-left: 5%;
  }

  .seven-day-fc .icon {
    width: 64px;
    height: 64px;
  }
}

Đối với màn hình lớn, bạn nên giới hạn chiều rộng tối đa của bảng thông tin dự báo để bảng này không sử dụng toàn bộ chiều rộng màn hình.

@media (min-width: 700px) {
  .weather-forecast {
    width: 700px;
  }
}

Tối ưu hoá văn bản để đọc

Theo lý thuyết về khả năng đọc cổ điển, một cột lý tưởng phải chứa từ 70 đến 80 ký tự mỗi dòng (khoảng 8 đến 10 từ bằng tiếng Anh). Hãy cân nhắc thêm điểm ngắt mỗi khi chiều rộng của một khối văn bản tăng lên khoảng 10 từ.

Ảnh chụp màn hình một trang văn bản trên thiết bị di động
Văn bản trên thiết bị di động.
Ảnh chụp màn hình một trang văn bản trên trình duyệt dành cho máy tính
Văn bản tương tự trong trình duyệt dành cho máy tính có thêm điểm ngắt để ràng buộc độ dài dòng.

Trong ví dụ này, phông chữ Roboto tại 1em tạo ra 10 từ trên mỗi dòng trên màn hình nhỏ hơn, nhưng màn hình lớn hơn cần có điểm ngắt. Trong trường hợp này, nếu chiều rộng trình duyệt lớn hơn 575px, thì chiều rộng nội dung lý tưởng là 550px.

@media (min-width: 575px) {
  article {
    width: 550px;
    margin-left: auto;
    margin-right: auto;
  }
}

Tránh ẩn nội dung (:#avoid-hiding-content)

Hãy cẩn thận khi chọn nội dung ẩn hoặc hiển thị tuỳ thuộc vào kích thước màn hình. Đừng ẩn nội dung chỉ vì bạn không thể vừa màn hình. Kích thước màn hình không dự đoán được nội dung mà người dùng có thể muốn xem. Ví dụ: việc xoá số lượng phấn hoa khỏi thông tin dự báo thời tiết có thể là vấn đề nghiêm trọng đối với những người bị dị ứng vào mùa xuân và cần thông tin đó để quyết định xem họ có thể ra ngoài hay không.

Xem các điểm ngắt truy vấn nội dung nghe nhìn trong Công cụ của Chrome cho nhà phát triển

Sau khi bạn thiết lập các điểm ngắt truy vấn nội dung nghe nhìn, hãy kiểm tra xem các điểm ngắt đó ảnh hưởng như thế nào đến giao diện của trang web. Bạn có thể đổi kích thước cửa sổ trình duyệt để kích hoạt các điểm ngắt, nhưng Công cụ dành cho nhà phát triển Chrome có một tính năng tích hợp cho thấy giao diện của trang ở các điểm ngắt khác nhau.

Ảnh chụp màn hình của DevTools với ứng dụng thời tiết đang mở và chiều rộng 822 pixel đã chọn.
Công cụ cho nhà phát triển hiển thị ứng dụng thời tiết ở kích thước khung nhìn rộng hơn.
Ảnh chụp màn hình DevTools với ứng dụng thời tiết đang mở và chiều rộng 436 pixel được chọn.
Công cụ cho nhà phát triển hiển thị ứng dụng thời tiết ở kích thước khung nhìn hẹp hơn.

Cách xem trang của bạn ở các điểm ngắt khác nhau:

  1. Mở Công cụ cho nhà phát triển.
  2. Bật Chế độ thiết bị. Chế độ này sẽ mở ở chế độ thích ứng theo mặc định.
  3. Để xem các truy vấn nội dung nghe nhìn, hãy mở trình đơn Chế độ thiết bị rồi chọn Hiển thị truy vấn nội dung nghe nhìn. Thao tác này sẽ hiển thị các điểm ngắt dưới dạng các thanh có màu phía trên trang.
  4. Nhấp vào một trong các thanh để xem trang của bạn trong khi truy vấn nội dung nghe nhìn đó đang hoạt động. Nhấp chuột phải vào một thanh để chuyển đến định nghĩa của truy vấn nội dung nghe nhìn đó.