Responsive Design — kiến thức cơ bản, thích ứng giao diện với các màn hình

Tác giả: IT Sectr Đã đăng: 2026-02-25 Thời gian đọc: 9 phút

Responsive Design là cách tiếp cận xây dựng giao diện mà bố cục tự động thích ứng với kích thước, hướng và loại thiết bị. Trong phát triển di động, responsive design được triển khai thông qua size classes trong iOS và configuration qualifiers trong Android. Bài viết phân tích các nguyên tắc của bố cục thích ứng, công cụ của cả hai nền tảng và ví dụ mã.

Những điểm chính

  • Responsive Design — thích ứng giao diện với các kích thước màn hình, hướng và loại thiết bị khác nhau
  • Size Classes — cơ chế iOS để xác định kích thước nhỏ gọn hoặc thông thường theo chiều ngang và chiều dọc
  • Configuration Qualifiers — tài nguyên Android (layout-w600dp, values-sw600dp) cho các cấu hình màn hình khác nhau
  • Lưới thích ứng — sắp xếp lại các phần tử khi thay đổi chiều rộng màn hình, không chỉ đơn giản là kéo giãn
  • Breakpoints — điểm chuyển tiếp giữa các trạng thái bố cục (ví dụ: 375 pt cho iPhone, 768 pt cho iPad)

Responsive Design là gì?

Responsive Design là phương pháp xây dựng giao diện mà bố cục phản ứng với kích thước màn hình, hướng và không gian có sẵn, sắp xếp lại các phần tử mà không mất chức năng. Thuật ngữ này được Ethan Marcotte đặt ra vào năm 2010 cho thiết kế web, nhưng các nguyên tắc hoàn toàn áp dụng được cho các ứng dụng di động gốc.

Trong phát triển di động, responsive design có nghĩa là cùng một ứng dụng hiển thị chính xác trên tất cả các thiết bị: từ iPhone SE (375 pt) đến iPad Pro (1024 pt ở chế độ dọc) và từ điện thoại thông minh Android (360 dp) đến máy tính bảng (800 dp). Các yếu tố chính là lưới linh hoạt, hình ảnh thích ứngtruy vấn phương tiện ở cấp độ framework (size classes, qualifiers).

Theo Tài liệu dành cho nhà phát triển Apple, ứng dụng phải là universal — hoạt động trên tất cả các thiết bị mà không cần bản dựng riêng cho iPad. Google Play khuyến nghị sử dụng bố cục thích ứng thông qua Jetpack WindowManager và canonical layouts. Việc thiếu khả năng thích ứng với máy tính bảng là nguyên nhân phổ biến gây ra các đánh giá tiêu cực.

Responsive vs Adaptive Design

Các thuật ngữ responsiveadaptive thường bị nhầm lẫn, mặc dù chúng mô tả các cách tiếp cận khác nhau. Responsive design sử dụng lưới linh hoạt liên tục điều chỉnh theo chiều rộng màn hình. Adaptive design sử dụng bố cục cố định cho các breakpoints được xác định trước — ứng dụng chuyển đổi giữa chúng một cách đột ngột.

Đặc điểmResponsive DesignAdaptive Design
Cách tiếp cậnDòng chảy liên tụcChuyển đổi rời rạc
LướiDựa trên tỷ lệ phần trăm, linh hoạtCố định cho mỗi breakpoint
Triển khaiAuto Layout, Flexbox, ConstraintLayoutSize Classes, layout-w600dp, storyboards riêng
Số lượng bố cục thiết kếMột, nhưng linh hoạtNhiều (dọc, ngang, máy tính bảng)

Trong thực tế, các ứng dụng di động sử dụng kết hợp cả hai cách tiếp cận. Lưới cơ bản được xây dựng theo hướng responsive (Auto Layout với các phụ thuộc constraint) và khi đạt đến breakpoint (ví dụ: chiều rộng > 600 pt), bố cục chuyển sang phiên bản thích ứng với cách sắp xếp phần tử khác. iOS kết hợp Auto Layout (responsive) với Size Classes (adaptive). Android kết hợp ConstraintLayout (responsive) với tài nguyên qualifier (adaptive).

iOS Size Classes: Compact và Regular

Size Classes là cơ chế iOS phân loại không gian màn hình có sẵn theo hai trục: ngang và dọc. Mỗi trục có thể là Compact (C) hoặc Regular (R). Sự kết hợp tạo ra bốn tùy chọn thích ứng bố cục: CR (iPhone dọc điển hình), RR (iPad dọc/ngang), RC (iPhone ngang trên Plus/Pro Max), CC (iPad Split View).

swift
// Định nghĩa Size Classes trong Swift
import UIKit

class AdaptiveViewController: UIViewController {

    override func traitCollectionDidChange(
        _ previousTraitCollection: UITraitCollection?
    ) {
        super.traitCollectionDidChange(previousTraitCollection)
        adjustLayout(for: traitCollection)
    }

    private func adjustLayout(for traits: UITraitCollection) {
        switch (traits.horizontalSizeClass, traits.verticalSizeClass) {
        case (.regular, .regular):
            showSplitView() // iPad — hiển thị master-detail
        case (.compact, .regular):
            showStackedView() // iPhone dọc — bố cục xếp chồng
        case (.compact, .compact):
            showCompactView() // iPhone SE ngang — thu nhỏ
        default:
            showDefaultView()
        }
    }

    private func showSplitView() {
        // Sử dụng UISplitViewController hoặc HStack
    }

    private func showStackedView() {
        // Stack dọc cho iPhone
    }

    private func showCompactView() {
        // Ẩn các phần tử phụ, hiển thị phần tử chính
    }
}

Trong Interface Builder, Size Classes được cấu hình thông qua bảng "wAny hAny" — nhà phát triển chọn một tổ hợp cụ thể (wRegular hRegular, wCompact hRegular) và thêm các biến thể constraint. SwiftUI sử dụng @Environment(\.horizontalSizeClass)@Environment(\.verticalSizeClass) để thích ứng phản ứng — khi hướng hoặc kích thước cửa sổ thay đổi, SwiftUI tự động vẽ lại view.

swift
// Size Classes trong SwiftUI
import SwiftUI

struct ResponsiveView: View {
    @Environment(\.horizontalSizeClass) private var hSizeClass

    var body: some View {
        if hSizeClass == .regular {
            // iPad — bố cục ngang với thanh bên
            HStack {
                SidebarView()
                    .frame(width: 300)
                ContentView()
            }
        } else {
            // iPhone — stack dọc toàn màn hình
            VStack {
                ContentView()
            }
        }
    }
}

Android Configuration Qualifiers

Configuration Qualifiers là cơ chế Android để tải các tài nguyên khác nhau (layout, values, drawables) dựa trên đặc điểm thiết bị. Các bộ định tính bao gồm kích thước màn hình (small, normal, large, xlarge), hướng (port, land), chiều rộng tối thiểu (sw<N>dp), chiều rộng khả dụng (w<N>dp) và chiều cao (h<N>dp).

kotlin
// Phát hiện cấu hình thiết bị trong Kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val config = resources.configuration
        val screenWidthDp = config.screenWidthDp
        val screenHeightDp = config.screenHeightDp
        val orientation = config.orientation

        when {
            screenWidthDp >= 900 -> setContentView(R.layout.activity_main_tablet)
            screenWidthDp >= 600 -> setContentView(R.layout.activity_main_sw600)
            else -> setContentView(R.layout.activity_main_phone)
        }
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, LandscapeFragment())
                .commit()
        }
    }
}

Cấu trúc tài nguyên cho các màn hình khác nhau: res/layout/activity_main.xml (điện thoại), res/layout-sw600dp/activity_main.xml (máy tính bảng 7"), res/layout-sw720dp/activity_main.xml (máy tính bảng 10"). Android tự động chọn bố cục chính xác dựa trên smallestWidth — chiều rộng màn hình tối thiểu tính bằng dp bất kể hướng. Bộ định tính sw<N>dp là phương pháp thích ứng ổn định nhất.

kotlin
// Jetpack Compose — WindowSizeClass để thích ứng
@Composable
fun ResponsiveScreen() {
    val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass

    when {
        windowSizeClass.windowSizeClass == WindowWidthSizeClass.EXPANDED -> {
            TabletLayout() // >= 840 dp
        }
        windowSizeClass.windowSizeClass == WindowWidthSizeClass.MEDIUM -> {
            MediumLayout() // 600–840 dp
        }
        else -> {
            CompactLayout() // < 600 dp
        }
    }
}

Jetpack WindowManager (thư viện androidx.window) cung cấp WindowSizeClass với ba loại chiều rộng: COMPACT (0–600 dp), MEDIUM (600–840 dp), EXPANDED (>840 dp). Đây là giải pháp thay thế hiện đại cho các thư mục qualifier cũ. Google khuyến nghị sử dụng nó để thích ứng với các thiết bị có thể gập lại và máy tính bảng.

Lưới thích ứng và breakpoints

Lưới thích ứng là nền tảng của responsive design. Thay vì kích thước cố định, các phần tử sử dụng tỷ lệ phần trăm, constraints linh hoạt và kích thước nội dung nội tại. Breakpoints là các điểm chiều rộng màn hình mà tại đó bố cục chuyển đổi giữa các trạng thái.

BreakpointiOS Size ClassAndroid QualifierLoại thiết bị
0–374 pt / dpCompact widthiPhone SE, Android cũ
375–599 pt / dpCompact widthsw320dpiPhone 14, Galaxy S24
600–839 pt / dpRegular widthsw600dpiPad mini, máy tính bảng 7"
840+ pt / dpRegular widthsw720dpiPad Pro, máy tính bảng 10"

Breakpoints được khuyến nghị từ Google Material Design và Apple HIG: 0–599 dp (điện thoại, một cột), 600–839 dp (máy tính bảng, hai cột, navigation rail), 840+ dp (máy tính bảng, ba cột, navigation drawer). Số lượng breakpoints không được vượt quá 4 — các điểm chuyển tiếp quá nhiều làm phức tạp việc bảo trì và kiểm thử.

Các phương pháp hay nhất về thiết kế thích ứng

Responsive design thành công đòi hỏi tuân theo một bộ quy tắc được cộng đồng nhà phát triển iOS và Android xây dựng trong thập kỷ qua. Dưới đây là các khuyến nghị chính dựa trên Apple HIG, Google Material Design và kinh nghiệm dự án sản xuất.

  • Bắt đầu với màn hình nhỏ nhất — thiết kế bố cục cho iPhone SE (375 pt) hoặc Android compact (360 dp), sau đó thêm phần mở rộng cho màn hình lớn hơn. Điều này đảm bảo nội dung quan trọng phù hợp ở mọi nơi
  • Sử dụng kích thước nội dung nội tại — UILabel, UIButton, ImageView có kích thước tự nhiên. Auto Layout và ConstraintLayout sử dụng chúng để định vị tự động mà không cần constraints thừa
  • Đừng ẩn nội dung trên màn hình nhỏ — thay vì ẩn, hãy sắp xếp lại (reflow). Người dùng sẽ có quyền truy cập vào cùng một chức năng, chỉ khác thứ tự
  • Kiểm thử trên tất cả Size Classes — trình mô phỏng iOS cho phép chuyển đổi Size Classes mà không cần khởi động lại. Trình giả lập Android cung cấp các cấu hình thiết bị khác nhau. Hãy đảm bảo kiểm thử trên máy tính bảng và thiết bị có thể gập lại
  • Material 3 Adaptive Layout — Google cung cấp các canonical layouts có sẵn cho danh sách/chi tiết, thanh công cụ và điều hướng. Hãy sử dụng chúng thay vì phát minh ra các mẫu của riêng bạn

Nguyên tắc chính của thiết kế thích ứng: nội dung xác định bố cục, chứ không phải ngược lại. Nếu iPad hiển thị cùng một chồng thẻ như iPhone, chỉ kéo dài ra — đó không phải là responsive design. Responsive design xem xét lại bố cục: trên iPhone — cuộn dọc, trên iPad — master-detail với thanh bên.

Câu hỏi thường gặp

Responsive Design khác Adaptive Layout như thế nào?

Responsive Design sử dụng lưới linh hoạt điều chỉnh mượt mà theo chiều rộng màn hình. Adaptive Layout chuyển đổi giữa các bố cục cố định tại các điểm breakpoint. Trong thực tế, cả hai cách tiếp cận được kết hợp: lưới cơ bản responsive + chuyển đổi thích ứng cho các thay đổi lớn (điện thoại vs máy tính bảng).

Có những Size Classes nào trong iOS?

iOS sử dụng hai trục: ngang (Compact/Regular) và dọc (Compact/Regular). iPhone ở chế độ dọc — Compact width, Regular height (CR). iPad — Regular width, Regular height (RR). iPhone Plus/Pro Max ở chế độ ngang — Regular width, Compact height (RC). Nhà phát triển đặt các biến thể constraint cho mỗi tổ hợp.

sw600dp trong Android là gì?

sw600dp (smallestWidth 600 dp) là bộ định tính tài nguyên Android có nghĩa là chiều rộng màn hình tối thiểu của thiết bị ít nhất 600 dp. Nó được sử dụng để tải bố cục thay thế cho máy tính bảng (7" trở lên). Hướng không ảnh hưởng — sw xem xét cạnh nhỏ hơn của màn hình.

Làm thế nào để kiểm thử khả năng thích ứng của ứng dụng?

Trên iOS, sử dụng trình mô phỏng với các Size Classes khác nhau và Xem trước SwiftUI với các thiết bị có kích thước khác nhau. Trên Android — cấu hình thiết bị trong trình giả lập (Pixel 5, Pixel C, Galaxy Tab) và Layout Validation trong Android Studio. Trên cả hai nền tảng, hãy đảm bảo kiểm thử trên máy tính bảng iPad/Android thực tế và thiết bị có thể gập lại.

Canonical layouts trong Material Design là gì?

Canonical layouts là các mẫu bố cục thích ứng có sẵn từ Google Material Design 3: list-detail, feed (nguồn cấp dữ liệu thẻ), supporting pane (nội dung chính + bảng hành động). Mỗi mẫu có ba biến thể (compact/medium/expanded) và tự động thích ứng với WindowSizeClass.

Tóm tắt

  • Responsive Design — thích ứng bố cục với kích thước và hướng màn hình thông qua lưới linh hoạt và breakpoints
  • Size Classes trong iOS (Compact/Regular) xác định bố cục cho iPhone, iPad và Split View
  • Configuration Qualifiers trong Android (sw<N>dp, w<N>dp, layout-land) tải tài nguyên theo thiết bị
  • Jetpack WindowManager cung cấp WindowSizeClass với ba loại: COMPACT, MEDIUM, EXPANDED
  • Breakpoints: 0–599 dp (điện thoại), 600–839 dp (máy tính bảng), 840+ dp (máy tính bảng rộng)
  • Responsive ≠ kéo giãn đơn giản — yêu cầu sắp xếp lại các phần tử, không ẩn nội dung
  • Kiểm thử trên tất cả các loại thiết bị, bao gồm máy tính bảng và thiết bị gập, là giai đoạn phát triển bắt buộc

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm