GODRICH
#css-animation#button#loader#transition#scroll#ui#xu-huong-thiet-ke

Bento grid design — 9 phần landing đang thịnh

Bento grid design là cách xếp các ô vuông to nhỏ khác nhau vào một grid như hộp cơm Nhật, đang thịnh trên Pinterest nhờ landing SaaS.

Dưới đây là landing one-page dựng thật bằng đúng phong cách này. Bạn cứ cuộn từ navigation đến footer để xem toàn bộ dòng chảy trước đã.

Mở trang đầy đủ trong tab mới

Chín bộ phận cấu thành one-page ở trên đã được tách từng mảnh và gom lại thành grid. Mỗi mảnh đi theo trình tự khách thật sự lướt qua trang: bắt mắt, ngó quanh, xem giá, dựng lòng tin, hành động, đăng ký.

Tự chạy · bấm ô để tới mục đó · cả 9 trong một zip

01Hero

Bạn thấy gì

Vùng hero được chia thành ba tile kích thước khác nhau thay vì một khối lớn duy nhất.

Hero bento 2×2
Mở trong tab mới

01 · Hero bento 2×2 — Diện tích đo được 53.267% · khung hình chuyển động 16/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

2x2radius 24호버 확대

Dùng ở đâu

Tile lớn nhất giữ headline và nút CTA, hai ô nhỏ chỉ đặt một huy hiệu trạng thái và một khối màu.

<div class="grid grid-cols-3 grid-rows-2 gap-4">
  <div class="col-span-2 row-span-2 flex flex-col justify-center gap-4
              rounded-tile bg-white p-10 shadow-bento">
    <h1 class="text-4xl font-extrabold">Công việc và đội nhóm trên một màn hình</h1>
    <button class="w-fit rounded-pill bg-ink px-6 py-3 text-sm font-bold text-cream">
      Dùng thử miễn phí
    </button>
  </div>
  <div class="flex items-center gap-3 rounded-tile bg-white p-6 shadow-bento">
    <span class="h-3 w-3 rounded-full bg-accent"></span>
    <span class="text-sm font-semibold">Đồng bộ thời gian thực</span>
  </div>
</div>

02Navigation

Chuyện gì diễn ra trên màn hình

Toàn bộ menu nằm gọn trong một hình viên thuốc, còn chip màu đậm ở bên trong bám theo vị trí hiện tại và trượt qua lại giữa các mục.

Thanh điều hướng pill bo tròn
Mở trong tab mới

02 · Thanh điều hướng pill bo tròn — Diện tích đo được 4.193% · khung hình chuyển động 15/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

radius 999padding 6px그림자 얕게

Chỗ dùng

Thương hiệu và nút CTA cố định ở hai đầu bên ngoài viên thuốc.

<nav class="flex items-center gap-4 rounded-pill bg-white/80 backdrop-blur
            px-3 py-2 shadow-bento">
  <span class="pl-3 font-display font-extrabold text-sm">Nectar</span>
  <div class="relative flex flex-1 rounded-pill bg-ink/5 p-1">
    <span class="absolute inset-y-1 left-1 w-1/4 rounded-pill bg-accent"></span>
    <span class="relative z-10 flex-1 text-center text-xs font-semibold py-2">Trang chủ</span>
    <span class="relative z-10 flex-1 text-center text-xs font-semibold py-2">Tính năng</span>
  </div>
  <button class="rounded-pill bg-accent px-4 py-2 text-xs font-bold text-cream">
    Dùng thử miễn phí
  </button>
</nav>

03Card grid

Chuyển động thế nào

Đây là thân của cả phong cách.

Lưới thẻ bento cốt lõi
Mở trong tab mới

03 · Lưới thẻ bento cốt lõi — Diện tích đo được 17.204% · khung hình chuyển động 20/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

grid-template-columnsgap 16px2열→1열

Khi nào dùng bento grid layout css

Mỗi ô chiếm số cột và số hàng khác nhau, nên khi lướt nhanh, mắt bạn dừng ở ô to nhất trước rồi mới chảy sang những ô còn lại.

<div class="grid grid-cols-3 grid-rows-2 gap-4">
  <div class="row-span-2 flex flex-col justify-end gap-3 rounded-tile
              bg-white p-5 shadow-bento hover:shadow-bento-hover transition-shadow">
    <div class="flex-1 rounded-[14px] bg-accent/10"></div>
    <p class="text-sm font-semibold">Tìm nhanh</p>
  </div>
  <div class="rounded-tile bg-white p-5 shadow-bento">Tự sắp xếp</div>
  <div class="col-span-2 rounded-tile bg-white p-5 shadow-bento">Báo cáo</div>
</div>

04Danh sách tính năng

Bạn thấy gì

Mỗi tính năng có sẵn chỗ cho icon và một con số nhấn to đùng trong card của nó, nhờ vậy lướt qua là nắm được ngay.

Thẻ tính năng icon + số
Mở trong tab mới

04 · Thẻ tính năng icon + số — Diện tích đo được 0.728% · khung hình chuyển động 23/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

숫자 강조아이콘 40px호버 살짝 뜸

Dùng ở đâu

Thanh mỏng nằm dưới con số diễn họa độ lớn của giá trị đó.

<div class="flex gap-4">
  <div class="flex-1 rounded-tile bg-white p-6 shadow-bento">
    <span class="mb-2 block h-6 w-6 rounded-lg bg-accent"></span>
    <p class="text-2xl font-extrabold">12,000+</p>
    <p class="text-xs font-semibold text-ink/70">App tích hợp</p>
    <span class="mt-3 block h-1 w-full rounded-pill bg-accent"></span>
  </div>
</div>

05Bảng giá

Chuyện gì diễn ra trên màn hình

Chỉ riêng gói đề xuất được ô to hơn 1.1 lần và đeo thêm badge, nên chưa cần bảng so sánh bạn cũng thấy ngay bên nào đang được đẩy.

Gói giá phân cấp theo cỡ ô
Mở trong tab mới

05 · Gói giá phân cấp theo cỡ ô — Diện tích đo được 1.839% · khung hình chuyển động 21/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

강조 칸 1.4배border 2pxbadge 위치

Chỗ dùng

Các gói còn lại lùi về nền nhạt.

<div class="flex items-end gap-4">
  <div class="flex-1 rounded-tile bg-white/60 p-6">
    <p class="font-bold">Miễn phí</p>
  </div>
  <div class="relative flex-[1.1] rounded-tile bg-white pt-8 p-6 shadow-bento-hover">
    <span class="absolute -top-3 left-6 rounded-pill bg-accent px-3 py-1
                 text-xs font-bold text-cream">Đề xuất</span>
    <p class="font-bold">Pro</p>
    <p class="mt-1 text-sm text-ink/70">199.000₫/tháng</p>
  </div>
</div>

06Đánh giá

Chuyển động thế nào

Card trích lời đánh giá được rải rác lẫn giữa các ô khác, nên không bị nhìn như dãy quảng cáo xếp hàng.

Thẻ trích dẫn rải trong lưới
Mở trong tab mới

06 · Thẻ trích dẫn rải trong lưới — Diện tích đo được 33.467% · khung hình chuyển động 16/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

따옴표 아이콘별점 옵션1칸 폭

Dùng khi nào

Thêm một ô sao đánh giá để tín hiệu tin cậy lặp lại thêm lần nữa bằng hình ảnh.

<div class="grid grid-cols-3 gap-4">
  <div class="col-span-2 rounded-tile bg-white p-6 shadow-bento">
    <p class="text-sm font-semibold">"Nhờ nó thời gian onboarding của chúng tôi giảm một nửa"</p>
    <p class="mt-3 text-xs text-ink/60">Kim Do-hyun · Product Manager</p>
  </div>
  <div class="rounded-tile bg-white p-6 shadow-bento">
    <p class="text-sm font-semibold">"Ba công cụ rối rắm giờ gộp hết vào một"</p>
  </div>
</div>

07Dải CTA

Bạn thấy gì

Trong grid có đúng một ô trải hết chiều ngang, nên nơi ánh nhìn dừng lại cuối cùng chính là nó.

Ô CTA ngang dài
Mở trong tab mới

07 · Ô CTA ngang dài — Diện tích đo được 19.051% · khung hình chuyển động 22/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

열 전체 spanradius 24배경 대비

Dùng ở đâu

Một vệt sáng dịu phủ trên nền tối, dồn trọng lượng về phía nút CTA.

<div class="relative overflow-hidden rounded-tile bg-ink px-10 py-12">
  <span class="absolute -right-16 -top-24 h-64 w-64 rounded-full
               bg-accent opacity-30 blur-sm"></span>
  <h3 class="relative max-w-md text-3xl font-extrabold text-cream">
    Đưa đội ngũ của bạn vào ngay hôm nay
  </h3>
  <button class="relative mt-6 rounded-pill bg-cream px-6 py-3
                 text-sm font-bold text-ink">Dùng thử miễn phí</button>
</div>

08Footer

Chuyện gì diễn ra trên màn hình

Mỗi nhóm link ở footer nhận một ô nền rất nhạt, kéo phong cách grid đi đến tận cuối trang.

Nhóm liên kết thành ô riêng
Mở trong tab mới

08 · Nhóm liên kết thành ô riêng — Diện tích đo được 1.765% · khung hình chuyển động 23/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

칸 배경 5%4열→2열구분선 없음

Chỗ dùng

Chia ô bằng khác biệt tông nền thay cho đường kẻ.

<footer class="grid grid-cols-3 gap-4">
  <div class="rounded-tile bg-ink/[.04] p-5">
    <p class="mb-2 text-xs font-bold uppercase text-ink/50">Sản phẩm</p>
    <p class="text-sm font-semibold">Tính năng</p>
  </div>
  <div class="rounded-tile bg-ink/[.04] p-5">
    <p class="mb-2 text-xs font-bold uppercase text-ink/50">Công ty</p>
    <p class="text-sm font-semibold">Giới thiệu</p>
  </div>
</footer>

09Nút và ô nhập

Chuyển động thế nào

Nút và ô nhập dùng đúng bán kính bo góc của card, khiến cả màn hình đọc như một hệ thống duy nhất.

Nút pill radius 12
Mở trong tab mới

09 · Nút pill radius 12 — Diện tích đo được 2.1% · khung hình chuyển động 10/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · Xem mật khẩu

radius 12포커스 링 2px높이 44px

Dùng khi nào

Vòng focus cũng ôm theo bán kính tròn hơn card một chút.

<form class="flex gap-3 rounded-tile bg-white p-6 shadow-bento">
  <label class="relative flex-1 rounded-[12px] bg-cream">
    <input class="w-full rounded-[12px] bg-transparent px-4 py-3 text-sm
                  outline-none ring-2 ring-accent/40" type="email"
           placeholder="Địa chỉ email">
  </label>
  <button class="rounded-[12px] bg-accent px-5 py-3 text-sm font-bold text-cream">
    Đăng ký
  </button>
</form>

Tùy chỉnh tailwind.config

One-page và chín bộ phận trên đều sinh ra từ đúng một bộ giá trị này. Sửa bán kính, bóng đổ hay khoảng cách ở một chỗ duy nhất này là tông cả trang đổi ngay lập tức. Toàn bộ phần bento grid css trong bài chỉ dựa vào các token dưới đây.

theme: {
  extend: {
    colors: {
      cream: "#fff7e6",
      ink: "#17141a",
      accent: "#2f6df6",
      line: "rgba(23,20,26,.08)",
    },
    fontFamily: {
      display: ["'Plus Jakarta Sans'", "system-ui", "sans-serif"],
      body: ["'Inter'", "system-ui", "sans-serif"],
    },
    borderRadius: {
      tile: "20px",
      pill: "999px",
    },
    boxShadow: {
      bento: "0 14px 24px rgba(23,20,26,.10)",
      "bento-hover": "0 20px 32px rgba(23,20,26,.16)",
    },
    spacing: {
      gutter: "14px",
    },
  },
},

Prompt vibe-coding

Bạn chỉ việc đưa config này vào dự án rồi giao việc cho Claude Code hay Cursor theo prompt mẫu dưới đây. Nguyên văn prompt đầy đủ nằm trong prompt.md của zip.

Hero không dựng thành một khối lớn mà chia thành nhiều tile kích thước khác
nhau, dạng mosaic 2x2 không đối xứng. Mọi card dùng rounded-tile và
shadow-bento. Khi hover chỉ đổi bóng sang shadow-bento-hover cho bóng to hơn
— vị trí không xê dịch. Nền chỉ một màu cream. Chỗ nào cần nhấn mới dùng
accent, tuyệt đối không tô gradient.

Kết quả sau khi áp dụng prompt này vào page/index.html thật, chụp toàn trang ở viewport 1280px.

kết quả

Bento grid dễ vỡ ở đâu — những cái bẫy

Kích thước tile và màn hình hẹp

Trộn hơn ba cỡ tile là grid biến thành collage. Bố cục gọn gàng bằng grid-template-areas trên màn rộng, khi container thu hẹp lại dễ bị ô này chồng đè lên ô khác, và tài liệu MDN về CSS Grid Layout khuyến nghị ở độ hẹp ấy nên khai báo lại tên vùng từ đầu cho an toàn. Chính dự án này lúc đầu cũng chỉ xếp dọc nguyên bốn ô, kết quả khoảng trắng trong ô to chiếm quá nửa màn hình mobile, cuối cùng phải thêm riêng quy tắc giảm chiều cao ô to bên dưới bề rộng 640px. Cái lỗi hay gặp nữa là cho mỗi ô một độ bóng khác nhau. Chốt đúng hai cấp shadow-bento và shadow-bento-hover là vì bóng đổ đậm nhạt tùy ô sẽ khiến trang nhìn như mấy cái website khác nhau dán chung vào một màn. Zip chứa mã nguồn của chín bộ phận và one-page này mở bằng mật khẩu j7zbg3ef, tải ngay qua nút dưới đây.

Chỉ một màu nhấn

Dùng từ hai màu nhấn trở lên cũng là bẫy lớn của bento grid ui. Dồn hết ánh nhìn về một màu accent chính là lõi của phong cách, nên khi màu nhấn thứ hai xuất hiện, bạn lập tức không còn biết ô nào mới thật sự quan trọng.

Khả năng tiếp cận

Tương phản và giảm chuyển động

Huy hiệu và nút CTA đặt chữ ink(#17141a) trên nền accent(#2f6df6) có tương phản khá thấp, nên chữ badge cỡ nhỏ được chuyển lên nền cream, còn nền accent chỉ dành cho những phần tử to như nút. Vòng focus của demo 09 và vệt sáng dịu của dải CTA được bọc trong media query theo tài liệu MDN về prefers-reduced-motion, khách truy cập bật giảm chuyển động sẽ chỉ thấy trạng thái tĩnh. Nút CTA của one-page viết sao cho chỉ riêng chữ đã đủ nghĩa, còn những chỗ tô khối màu thì README của zip ghi rõ phải điền alt khi thay bằng icon hay ảnh thật.

Các xu hướng khác được gom trong mục xu hướng thiết kế, còn trang này chuyên về gì thì trang giới thiệu nói rõ.

FAQ

Bento grid chỉ dựng được bằng CSS Grid thôi à?

Flexbox cũng nhại được gần giống, nhưng để từng ô chiếm bao nhiêu cột và hàng thì grid-column cùng grid-row của CSS Grid cho code ngắn hơn hẳn. Trong bài này, mục 03·06·08 cần grid dùng CSS Grid, phần còn lại gọn trong một hàng nên dùng Flexbox. Ai muốn xem bento grid html css hoàn chỉnh hơn thì nguyên bản trong zip đã xếp sẵn cả hai kiểu.

Không có ảnh hay minh họa thì bento grid có hợp không?

Hợp, và chính các bento grid design examples không dùng ảnh vẫn tạo được cảm giác chỉn chu. One-page và toàn bộ demo trong bài này không có lấy một tấm hình, chỉ dùng khối màu accent và chỗ để icon, nên rất đáng dùng ở giai đoạn wireframe trước khi có màn hình thật.

Từ bao nhiêu tile thì gọi là bento grid?

Không có chuẩn chính thức, nhưng tối thiểu nên có bốn ô thì khác biệt kích thước mới đủ rõ. Bố cục bốn ô như mục 03 — một ô to trộn ba ô nhỏ — là phổ biến nhất, và nếu section rộng hơn thì kéo lên 6 đến 8 ô như mục 06 vẫn ổn.

Nhập mật khẩu file nén

Mật khẩu nằm ngay trong bài viết này. Đọc tới đó bạn sẽ thấy.