CSS last-child là gì? Cú pháp, ứng dụng trong thiết kế website

Last-child là một pseudo-class quen thuộc trong CSS, thường được sử dụng khi cần định dạng phần tử cuối cùng trong một nhóm mà không phải thêm class riêng vào HTML. Selector này đặc biệt hữu ích trong việc xử lý danh sách, menu, card, bảng dữ liệu và nhiều thành phần giao diện khác. Tuy nhiên, last-child không đơn giản chỉ là “chọn phần tử cuối cùng”. Selector này hoạt động dựa trên cấu trúc DOM và có những quy tắc riêng dễ gây nhầm lẫn, đặc biệt khi kết hợp với nhiều loại phần tử hoặc layout Flexbox, Grid. Trong bài viết này, cùng tìm hiểu CSS last-child là gì, cách hoạt động, cú pháp, cách sử dụng thực tế và những lỗi thường gặp để áp dụng pseudo-class này chính xác hơn!

 

CSS last child là gì? Cú pháp, ứng dụng trong thiết kế website
 

Mục lục

CSS last-child là gì?

CSS last-child là một pseudo-class (lớp giả) trong CSS, dùng để chọn phần tử nằm ở vị trí cuối cùng trong nhóm các phần tử con của cùng một phần tử cha. Điểm quan trọng của :last-child là selector này xét vị trí thực tế của phần tử trong cây DOM, không dựa vào loại thẻ HTML. Vì vậy, phần tử được chọn phải thực sự là phần tử con cuối cùng của phần tử cha và đồng thời khớp với selector.

Ví dụ: 

li:last-child {

  color: red;

}

Nếu phần tử cuối cùng trong < ul > là một < div > thay vì < li >, selector trên sẽ không chọn được < li > nào, dù trước đó vẫn có các phần tử < li > trong danh sách. 

CSS class last-child thường được sử dụng để:

- Loại bỏ border ở phần tử cuối cùng của danh sách hoặc menu.

- Xóa margin hoặc padding thừa ở phần tử cuối của một nhóm nội dung.

- Tạo kiểu riêng cho item cuối, chẳng hạn làm nổi bật nút “Xem thêm”.

- Định dạng phần tử cuối trong bảng hoặc các danh sách dữ liệu.

- Giảm việc phải thêm class riêng vào HTML khi muốn xử lý phần tử cuối.

 

CSS last child
 

Cú pháp cơ bản của CSS last-child

Cú pháp của last-child khá đơn giản, trong đó pseudo-class này được đặt ngay sau selector để xác định phần tử cần áp dụng CSS là phần tử con cuối cùng của phần tử cha. Cụ thể như sau:

selector :last-child {

  property : value;

}

Trong đó:

- Selector: Selector dùng để xác định loại hoặc nhóm phần tử HTML cần chọn.

- Last-child: Pseudo-class kiểm tra phần tử có phải là con cuối cùng của phần tử cha hay không.

- Property: Thuộc tính CSS muốn thay đổi.

- Value: Giá trị được áp dụng cho thuộc tính đó.

Ví dụ, muốn loại bỏ đường viền dưới của < li > cuối cùng trong danh sách:

CSS

li:last-child {

  border-bottom : none;

}

HTML tương ứng:

< ul>

  < li>Trang chủ

  < li>Sản phẩm

  < li>Liên hệ

< /ul>

Trong ví dụ trên, li:last-child sẽ chọn phần tử < li > “Liên hệ” vì đây là phần tử con cuối cùng của < ul >.

CSS last child là gì?

CSS last-child hoạt động như thế nào?

CSS last-child là một pseudo-class dùng để chọn phần tử khi phần tử đó nằm ở vị trí cuối cùng trong danh sách các phần tử con của một phần tử cha. Thay vì phải thêm một class riêng cho phần tử cuối, developer có thể sử dụng :last-child để áp dụng CSS trực tiếp dựa trên cấu trúc HTML.

Cơ chế hoạt động của last-child dựa trên cây DOM (Document Object Model). Khi trình duyệt phân tích HTML, các phần tử được tổ chức thành mối quan hệ cha - con. Với mỗi phần tử cha, trình duyệt xác định thứ tự của các phần tử con. :last-child sẽ kiểm tra xem phần tử đang xét có phải là phần tử con cuối cùng của phần tử cha hay không. Nếu đúng, CSS được áp dụng; nếu không, phần tử sẽ không được chọn.

1. Last-child xét vị trí trong DOM, không xét loại phần tử

Một điểm quan trọng khi sử dụng :last-child là pseudo-class này không chỉ xét các phần tử cùng loại mà quan tâm đến vị trí cuối cùng của phần tử trong toàn bộ nhóm phần tử con.

Chẳng hạn, một phần tử cha có ba phần tử con lần lượt là: < div >, < p > và < span >. Trong trường hợp này, < span > là last-child vì nó nằm cuối cùng. < p > dù là thẻ < p > cuối cùng trong nhóm nhưng vẫn không phải last-child, vì phía sau nó còn có < span > . Nói cách khác, last-child không hiểu theo kiểu “đây là thẻ < p > cuối cùng”, mà hiểu là “đây có phải phần tử cuối cùng của phần tử cha hay không”.

2. Last-child không dựa trên vị trí hiển thị

Last-child xác định phần tử dựa trên thứ tự trong DOM, không phải vị trí mà người dùng nhìn thấy trên giao diện. Điều này đặc biệt quan trọng khi website sử dụng Flexbox hoặc Grid.

Ví dụ, thuộc tính order trong Flexbox có thể thay đổi vị trí hiển thị của các phần tử trên màn hình. Tuy nhiên, thay đổi này không làm thay đổi thứ tự của chúng trong DOM. Vì vậy, một phần tử có thể được hiển thị ở vị trí đầu tiên nhưng vẫn được last-child xác định là phần tử cuối cùng.

3. Last-child hoạt động theo từng phần tử cha

Last-child được xác định trong phạm vi của từng phần tử cha, không phải trên toàn bộ trang web. Nếu một trang có nhiều danh sách hoặc nhiều nhóm phần tử khác nhau, mỗi nhóm sẽ có phần tử last-child riêng.

Điều này giúp selector có thể được sử dụng linh hoạt trong các thành phần lặp lại như menu, danh sách sản phẩm, danh sách bài viết hoặc các nhóm thông tin. Chỉ cần phần tử nằm ở vị trí cuối trong chính phần tử cha của nó, nó có thể được chọn bằng last-child. 

 

Last child CSS

Điểm nổi bật của việc sử dụng last-child trong CSS

Trong phát triển giao diện, last-child trong CSS không chỉ là một selector đơn thuần mà còn mang lại nhiều lợi ích về mặt tổ chức code và trải nghiệm phát triển. Thay vì phải can thiệp vào HTML hoặc JavaScript để xử lý phần tử cuối cùng, developer chỉ cần một dòng CSS là có thể giải quyết được vấn đề. Điều này đặc biệt hữu ích trong các dự án hiện đại, nơi giao diện thường được xây dựng từ các component tái sử dụng và dữ liệu được render linh hoạt. Dưới đây là những điểm nổi bật giúp last-child trở thành một công cụ quen thuộc trong CSS.

1. Giảm việc thêm class riêng cho phần tử cuối

Trước đây, để định dạng riêng cho phần tử cuối cùng, developer thường phải thêm một class như .last-item thủ công hoặc sử dụng JavaScript để xác định phần tử cần style. Cách làm này vừa tăng thêm thao tác, vừa có thể phát sinh lỗi khi số lượng phần tử thay đổi nhưng class không được cập nhật.  Với CSS last-child div, trình duyệt có thể tự động xác định phần tử cuối dựa trên cấu trúc DOM. Nhờ đó, HTML không cần chứa những class chỉ phục vụ mục đích định dạng, giúp cấu trúc mã gọn gàng và dễ quản lý hơn.

2. CSS ngắn gọn, dễ bảo trì

Last-child giúp CSS ngắn gọn và dễ bảo trì vì không cần tạo thêm class riêng cho phần tử cuối. Thay vì phải viết nhiều selector hoặc gán class thủ công, developer chỉ cần một quy tắc CSS để xử lý tất cả phần tử cuối có cùng cấu trúc.

Ví dụ:

.item :last-child {

  margin -bottom: 0;

}

Khi cần thay đổi cách hiển thị, developer chỉ cần chỉnh sửa một quy tắc CSS duy nhất thay vì cập nhật nhiều class hoặc selector khác nhau. Cách làm này giúp giảm số lượng class và selector trong code, hạn chế CSS bị lặp lại và dễ dàng tìm kiếm, chỉnh sửa khi giao diện thay đổi. Đồng thời, last-child tự động xác định phần tử cuối dựa trên cấu trúc DOM nên giảm nguy cơ phát sinh lỗi khi số lượng phần tử thay đổi. Nhờ đó, mã nguồn trở nên gọn gàng, dễ đọc và thuận tiện hơn cho bảo trì lâu dài.

3. Phù hợp với component có số lượng phần tử thay đổi

Trong các dự án, số lượng phần tử trong một component hoặc danh sách thường không cố định. Một danh sách có thể chỉ có 3 item ở thời điểm này nhưng tăng lên 10 item hoặc giảm xuống còn 2 item khi dữ liệu thay đổi. Nếu sử dụng class riêng để xác định phần tử cuối, developer có thể phải cập nhật lại CSS class last-child mỗi khi cấu trúc danh sách thay đổi. Tuy nhiên với :last-child, trình duyệt sẽ tự động xác định phần tử đang nằm ở vị trí cuối cùng trong DOM và áp dụng CSS tương ứng, không phụ thuộc vào tổng số lượng phần tử. Nhờ đó, developer không cần viết thêm logic cho từng trường hợp, giúp component linh hoạt hơn và hạn chế lỗi khi dữ liệu được thêm, xóa hoặc cập nhật.

4. Hữu ích khi nội dung được render động

Trong các website và ứng dụng hiện đại, nội dung thường được render động từ API hoặc dữ liệu từ cơ sở dữ liệu. Số lượng phần tử có thể thay đổi liên tục khi người dùng tải thêm dữ liệu, lọc danh sách hoặc cập nhật nội dung. Nếu phải xác định phần tử cuối bằng JavaScript và thêm class riêng, code sẽ trở nên phức tạp hơn và cần xử lý lại mỗi khi DOM thay đổi.

Với thuộc tính last-child, CSS có thể tự động nhận diện phần tử đang ở vị trí cuối cùng sau khi DOM được cập nhật. Nhờ đó, developer không cần viết thêm JavaScript chỉ để áp dụng style cho phần tử cuối, giúp code đơn giản hơn và giao diện dễ thích ứng với dữ liệu động.

5. Giúp xử lý spacing, border và layout hiệu quả

CSS last-child div đặc biệt hữu ích khi cần xử lý khoảng cách, đường viền và bố cục giữa các phần tử. Ví dụ, developer có thể thêm margin-bottom cho tất cả item để tạo khoảng cách nhưng đồng thời loại bỏ khoảng trống ở item cuối. Tương tự, border-bottom có thể được áp dụng cho các item và loại bỏ riêng ở phần tử cuối để tránh xuất hiện đường viền không cần thiết.

Cách này giúp layout trở nên gọn gàng và cân đối hơn mà không cần thêm class phụ vào HTML. Đây cũng là một trong những trường hợp sử dụng phổ biến của last-child khi xây dựng menu, danh sách sản phẩm, danh sách bài viết hoặc các component có nhiều phần tử lặp lại.

 

Last child
 

Ứng dụng thực tế của CSS last-child trong thiết kế website

CSS class last-child có nhiều ứng dụng thực tế trong quá trình xây dựng giao diện website, đặc biệt khi cần xử lý riêng phần tử cuối cùng trong một nhóm. Thay vì thêm class phụ vào HTML, developer có thể sử dụng pseudo-class này để kiểm soát border, margin, bảng dữ liệu và nhiều thành phần giao diện khác một cách gọn gàng.

1. Xóa viền (border) hoặc margin của phần tử cuối cùng

Khi thiết kế danh sách, menu hoặc các nhóm nội dung, các phần tử thường được thêm border-bottom hoặc margin-bottom để tạo khoảng cách và phân tách. Tuy nhiên, phần tử cuối cùng thường không cần những thuộc tính này vì có thể tạo ra đường viền hoặc khoảng trống dư thừa. CSS last-child cho phép loại bỏ các thuộc tính này chỉ ở phần tử cuối mà không cần thêm class riêng.

Ví dụ:

.item {

  margin-bottom : 16px;

  border-bottom : 1px solid #ddd;

}

.item:last-child {

  margin-bottom : 0;

  border-bottom : none;

}

Nhờ đó, các phần tử vẫn có khoảng cách và đường phân cách cần thiết, trong khi phần tử cuối được xử lý gọn gàng hơn. Cách này cũng đặc biệt hữu ích với danh sách có số lượng phần tử thay đổi.

2. Định dạng hàng tổng cộng (total row) trong bảng dữ liệu (table)

Trong bảng dữ liệu, hàng cuối cùng thường được sử dụng để hiển thị Tổng cộng, Tổng tiền hoặc kết quả cuối cùng. Nếu hàng này thực sự nằm ở vị trí cuối cùng trong cấu trúc DOM, có thể sử dụng :last-child để tạo kiểu nổi bật hơn.

Ví dụ:

tbody tr:last-child {

 font-weight: bold;

 background-color: #f5f5f5;

 border-top: 2px solid #333;

}

Đoạn CSS trên sẽ áp dụng cho < tr > cuối cùng trong < tbody >, giúp người dùng dễ nhận biết hàng tổng kết giữa các dòng dữ liệu. Tuy nhiên, cần lưu ý rằng :last-child chỉ xác định phần tử dựa trên vị trí trong DOM. Nếu hàng tổng cộng không phải hàng cuối cùng hoặc phía sau còn một < tr > khác, selector này sẽ không chọn đúng hàng tổng cộng.

3. Tùy biến thẻ card hoặc danh sách sản phẩm (grid/flexbox)

Trong các layout website hiện đại sử dụng flexbox hoặc grid, card sản phẩm, card dịch vụ hay card tin tức thường được sắp xếp theo hàng ngang với khoảng cách (gap) giữa các phần tử. Card cuối cùng trong dãy thường không cần margin-right hoặc padding-right để tránh bị lệch ra ngoài container hoặc tạo khoảng trắng thừa ở cạnh phải. CSS last-child giúp xử lý việc này chỉ bằng một dòng CSS, thay vì phải tính toán margin bằng JavaScript hoặc thêm class riêng cho từng trường hợp. 

Ví dụ:

.card-list {

  display: flex;

}

.card {

  margin-right: 20px;

  flex: 1;

}

.card:last-child {

  margin-right: 0;

}

Tuy nhiên cần lưu ý một điểm quan trọng: nếu danh sách card sử dụng flex-wrap: wrap hoặc là grid nhiều hàng, last-child CSS chỉ tác động đến phần tử cuối cùng trong toàn bộ DOM, chứ không phải phần tử cuối của mỗi hàng. Điều này có thể khiến các card ở cuối những hàng giữa vẫn bị dính margin-right thừa, gây lệch layout. Trong trường hợp đó, giải pháp tốt hơn là dùng thuộc tính gap thay cho margin, hoặc kết hợp :nth-child() để tính toán theo số cột hiển thị.

4. Thiết kế thanh điều hướng breadcrumb

Breadcrumb là thành phần điều hướng thường thấy ở đầu trang, hiển thị đường dẫn phân cấp như "Trang chủ / Sản phẩm / Áo thun". Giữa các mục thường có ký hiệu phân cách (dấu /, > hoặc mũi tên) được thêm bằng pseudo-element ::after. Mục cuối cùng, thường là trang hiện tại không cần ký hiệu phân cách này vì phía sau không còn mục nào khác và :last-child là cách xử lý gọn gàng nhất cho tình huống đó.

Ví dụ:

.breadcrumb li::after {

  content: " / ";

  color: #999;

}

.breadcrumb li:last-child::after {

  content: "";

}

.breadcrumb li:last-child {

  color: #333;

  font-weight: bold;

}

Ngoài ẩn dấu phân cách, CSS last-child còn thường được kết hợp để làm nổi bật mục cuối bằng cách đổi màu chữ đậm hơn hoặc bỏ liên kết (link), vì đây là trang hiện tại nên không cần có thể click. Cách làm này giúp breadcrumb vừa đúng về mặt ngữ nghĩa, vừa tự động thích ứng khi số cấp điều hướng thay đổi tùy theo từng trang.

Thuộc tính last child
 

Ví dụ thực tế khi sử dụng last-child CSS 

Trong quá trình xây dựng giao diện website, last-child CSS có thể được ứng dụng vào nhiều tình huống thực tế để xử lý phần tử cuối cùng mà không cần thêm class riêng trong HTML. Từ menu điều hướng, danh sách sản phẩm đến các thành phần có border hoặc margin, pseudo-class này giúp mã CSS ngắn gọn và dễ quản lý hơn. Dưới đây là một số ví dụ phổ biến giúp bạn hiểu rõ hơn cách sử dụng last-child trong từng trường hợp.

Ví dụ 1 - Navigation menu

Navigation menu thường gồm nhiều mục liên kết được đặt cạnh nhau, chẳng hạn như Trang chủ, Giới thiệu, Dịch vụ, Sản phẩm và Liên hệ. Khi thiết kế menu, lập trình viên có thể thêm đường viền bên phải (border-right) để tạo khoảng cách trực quan giữa các mục.

Tuy nhiên, nếu áp dụng đường viền cho tất cả các mục, phần tử cuối cùng cũng sẽ xuất hiện một đường kẻ ở bên phải. Điều này có thể khiến menu trông không cân đối vì sau mục cuối thường không còn nội dung nào cần phân cách.

Có thể sử dụng :last-child để loại bỏ đường viền này như sau:
 

HTML CSS

< nav>

  < ul>

    < li> Trang chủ

    < li> Giới thiệu

    < li> Dịch vụ

    < li> Sản phẩm

    < li> Liên hệ

  < /ul>

< /nav>

nav li {

  border -right: 1px solid #ddd;

  padding : 0 15px;

}

nav li: last-child {

  border-right: none;

}


Trong đoạn CSS trên:

- Nav li áp dụng đường viền bên phải cho tất cả các mục < li > trong menu.

- Nav li:last-child xác định < li > cuối cùng trong danh sách.

- Border-right: none loại bỏ đường viền bên phải của mục Liên hệ.

- Các mục còn lại vẫn giữ đường viền để tạo hiệu ứng phân cách.

Cách này giúp CSS linh hoạt hơn vì nếu thêm hoặc xóa một mục trong menu, phần tử cuối cùng vẫn được tự động xác định mà không cần thay đổi HTML.

Ví dụ 2 - Danh sách sản phẩm

Last-child trong CSS cũng thường được sử dụng trong danh sách sản phẩm, đặc biệt khi các sản phẩm được trình bày theo dạng danh sách dọc. Mỗi sản phẩm có thể được phân cách bằng đường viền phía dưới để người dùng dễ dàng nhận biết từng mục. Bằng cách dùng last-child, bạn có thể loại bỏ margin thừa này một cách đơn giản. Ví dụ:

 

HTML CSS

 < div class="product-list">

  < div class="product-item">

    < h3>Áo thun nam

    < p>250.000đ

  < /div>

  < div class="product-item">

    < h3>Quần jean

    < p>450.000đ

  < /div>

  < div class="product-item">

    < h3>Giày thể thao

    < p>850.000đ

  < /div>

< /div>

.product -item {

  border-bottom: 1px solid #ddd;

  padding : 15px 0;

}

.product-item :last-child {

  border-bottom: none;

  margin-bottom: 0;

}

 

Trong trường hợp này:

- .product-item áp dụng border-bottom cho tất cả sản phẩm.

- .product-item:last-child xác định sản phẩm nằm cuối cùng trong .product-list.

- border-bottom: none loại bỏ đường viền phía dưới của sản phẩm cuối.

- margin-bottom: 0 giúp loại bỏ khoảng cách dư thừa sau sản phẩm cuối nếu trước đó các sản phẩm đều có margin.

Ví dụ, nếu danh sách có 10 sản phẩm, CSS không cần chỉ định sản phẩm thứ 10. Khi số lượng sản phẩm thay đổi thành 5, 20 hoặc 100, :last-child vẫn tự động nhận diện đúng phần tử cuối cùng. Cách sử dụng này giúp giao diện danh sách sản phẩm gọn gàng, nhất quán và dễ bảo trì, đồng thời hạn chế việc phải thêm class riêng như .last-product vào HTML.

Ví dụ 3 - FAQ

Trong phần FAQ (Frequently Asked Questions), các câu hỏi thường được hiển thị thành một danh sách theo chiều dọc. Mỗi câu hỏi có thể được ngăn cách bằng đường viền phía dưới để người dùng dễ phân biệt từng nội dung. Tuy nhiên, nếu áp dụng border-bottom cho tất cả câu hỏi, phần tử cuối cùng cũng xuất hiện đường viền ở phía dưới. Điều này đôi khi tạo cảm giác phần FAQ chưa kết thúc hoặc xuất hiện một đường kẻ không cần thiết.

Có thể sử dụng :last-child để loại bỏ đường viền của câu hỏi cuối cùng:
 

HTML CSS

< div class="faq-list">

  < div class="faq-item">

    < h3>last-child CSS là gì?

    < p>Đây là pseudo-class dùng để chọn phần tử cuối cùng.

  < /div>

  < div class="faq-item">

    < h3>last-child có cần thêm class không?

    < p>Không. CSS có thể tự xác định phần tử cuối cùng.

  < /div>

  < div class="faq-item">

    < h3>last-child được sử dụng ở đâu?

    < p>Có thể sử dụng trong menu, danh sách, FAQ và nhiều thành phần khác.

  < /div>

< /div>

.faq-item {

  border-bottom : 1px solid #ddd;

  padding : 20px 0;

}

.faq-item :last-child {

  border-bottom : none;

}

 

Trong đoạn CSS trên:

- .faq-item áp dụng đường viền phía dưới cho tất cả câu hỏi FAQ.

- .faq-item:last-child xác định .faq-item nằm cuối cùng trong .faq-list.

- border-bottom: none loại bỏ đường viền của câu hỏi cuối cùng.

- Các câu hỏi phía trên vẫn giữ đường viền để tạo sự phân tách rõ ràng.

Ví dụ, với 3 câu hỏi, đường viền sẽ xuất hiện giữa câu hỏi thứ nhất và thứ hai, giữa câu hỏi thứ hai và thứ ba, nhưng không có đường viền bên dưới câu hỏi thứ ba. Cách này đặc biệt hữu ích khi số lượng câu hỏi FAQ có thể thay đổi. Khi thêm hoặc xóa câu hỏi, CSS vẫn tự động xác định phần tử cuối cùng mà không cần chỉnh sửa HTML hoặc thêm class riêng cho câu hỏi cuối.

 

Sử dụng CSS last child

 

Ví dụ 4 - Footer

Trong footer của website, các liên kết thường được chia thành nhiều nhóm như Về chúng tôi, Dịch vụ, Chính sách, Hỗ trợ. Mỗi liên kết có thể được hiển thị theo dạng danh sách dọc và phân cách bằng đường viền hoặc khoảng cách. Khi muốn tạo đường phân cách giữa các liên kết nhưng không muốn xuất hiện đường viền ở mục cuối cùng, bạn có thể kết hợp :last-child với border-bottom. Ví dụ:

 

HTML CSS

< footer>

  < ul class="footer-menu">

    < li> Về chúng tôi

    < li> Dịch vụ

    < li> Chính sách bảo mật

    < li> Điều khoản sử dụng

    < li >< a href="#">Liên hệ

  < /ul >

< /footer >

.footer-menu li {

  border-bottom: 1px solid #ddd;

  padding: 10px 0;

}

.footer-menu li:last-child {

  border-bottom: none;

}

 

Trong đoạn CSS trên:

- .footer-menu li áp dụng đường viền phía dưới cho tất cả các mục trong footer.

- .footer-menu li:last-child chọn < li > cuối cùng trong danh sách.

- border-bottom: none loại bỏ đường viền của mục Liên hệ.

- Các mục phía trên vẫn giữ đường viền để tạo sự phân cách giữa các liên kết.

Nhờ đó, footer có thể tạo được hiệu ứng đường kẻ giữa các mục mà không xuất hiện đường viền thừa ở cuối danh sách.

Ví dụ 5 - Các card trong website

Trong website, các thẻ card thường được sử dụng để hiển thị sản phẩm, dịch vụ, bài viết hoặc thông tin nổi bật. Khi đặt nhiều card theo chiều dọc, mỗi card có thể được tạo khoảng cách với card tiếp theo bằng margin-bottom.

Tuy nhiên, card cuối cùng không có phần tử phía sau nên việc giữ lại margin-bottom có thể tạo ra khoảng trống không cần thiết ở cuối danh sách. Lúc này, :last-child có thể được sử dụng để loại bỏ khoảng cách này.
 

HTML CSS

< div class="card-list">

  < div class="card">Card 1

  < div class="card">Card 2

  < div class="card">Card 3

< /div>

.card {

  margin-bottom: 20px;

}

.card:last-child {

  margin-bottom: 0;

}

 

Trong ví dụ này:

- .card tạo khoảng cách 20px giữa các card.

- .card:last-child chọn card cuối cùng.

- margin-bottom: 0 loại bỏ khoảng cách bên dưới card cuối.

Nhờ đó, các card vẫn có khoảng cách đều nhau nhưng không xuất hiện khoảng trống dư thừa ở cuối danh sách. 

 

Sử dụng CSS last child
 

Phân biệt :last-child với các Pseudo-class liên quan 

Các pseudo-class như :last-child, :last-of-type, :first-child hay :nth-child() đều được sử dụng để chọn phần tử dựa trên vị trí trong cấu trúc HTML. Tuy nhiên, mỗi selector có cách xác định phần tử khác nhau và phù hợp với từng trường hợp sử dụng riêng. Hiểu rõ sự khác biệt giữa các pseudo-class này giúp bạn lựa chọn selector chính xác, tránh tình trạng CSS không áp dụng như mong đợi.

1. Phân biệt last-child và last-of-type

Last-child được sử dụng khi bạn muốn chọn phần tử nằm cuối cùng trong nhóm phần tử con của một phần tử cha. Pseudo-class này quan tâm đến vị trí của phần tử trong toàn bộ nhóm, không chỉ các phần tử cùng loại. Vì vậy, phần tử cần chọn phải thực sự là phần tử con cuối cùng thì CSS mới được áp dụng. Do đó, last child thường được sử dụng khi yêu cầu thiết kế liên quan trực tiếp đến phần tử cuối cùng của toàn bộ danh sách hoặc nhóm, chẳng hạn như loại bỏ margin, border hoặc padding của mục cuối. 

Trong khi đó, last-of-type tập trung vào loại thẻ HTML. Pseudo-class này chọn phần tử cuối cùng thuộc một loại thẻ cụ thể trong nhóm phần tử con. Do đó, last-of-type phù hợp khi một container chứa nhiều loại phần tử khác nhau nhưng bạn chỉ muốn tác động đến phần tử cuối cùng của một loại nhất định. 

2. Phân biệt last-child và nth-last-child()

Last-child được sử dụng khi bạn chỉ muốn chọn phần tử cuối cùng trong một nhóm phần tử con. Đây là lựa chọn phù hợp cho các thao tác đơn giản như xóa margin, border hoặc điều chỉnh padding của phần tử cuối.

Trong khi đó, :nth-last-child() cho phép xác định phần tử dựa trên vị trí tính từ cuối danh sách. Pseudo-class này linh hoạt hơn vì có thể chọn phần tử cuối cùng, phần tử đứng thứ hai từ cuối, thứ ba từ cuối hoặc nhiều vị trí khác tùy theo công thức được thiết lập.

Do đó, nên sử dụng last-child khi chỉ cần xử lý một phần tử cuối cùng, còn :nth-last-child() phù hợp khi cần kiểm soát nhiều vị trí tính từ cuối hoặc xây dựng các quy tắc CSS phức tạp hơn dựa trên thứ tự của phần tử.

3. Phân biệt last-child với first-child

Last-child được sử dụng để chọn phần tử nằm ở vị trí cuối cùng trong nhóm phần tử con của một phần tử cha. Pseudo-class này thường phù hợp khi cần xử lý riêng phần tử kết thúc danh sách, chẳng hạn như loại bỏ margin, border hoặc padding dư thừa.

Ngược lại, first-child CSS được sử dụng để chọn phần tử nằm ở vị trí đầu tiên trong nhóm phần tử con. Pseudo-class này thường được dùng khi muốn tạo kiểu riêng cho phần tử bắt đầu danh sách, chẳng hạn như điều chỉnh khoảng cách phía trên hoặc loại bỏ border ở đầu danh sách.

Do đó, nên sử dụng first-child khi cần tác động đến phần tử đầu tiên, còn last-child phù hợp khi cần xử lý phần tử cuối cùng. Hai pseudo-class này thường được sử dụng kết hợp để kiểm soát khoảng cách, đường viền và bố cục ở hai đầu của một danh sách.

 

CSS last child khác CSS first child
 

Một số hạn chế của CSS last-child div

CSS last-child giúp định dạng phần tử cuối cùng trở nên đơn giản mà không cần thêm class riêng. Tuy nhiên khi áp dụng, selector này vẫn có một số hạn chế do cách CSS xác định phần tử dựa trên cấu trúc DOM. Nếu HTML chứa nhiều loại phần tử xen kẽ hoặc thứ tự hiển thị được thay đổi bằng Flexbox, Grid, kết quả có thể không giống với vị trí mà người dùng nhìn thấy trên giao diện. Vì vậy, cần hiểu rõ những giới hạn này để sử dụng CSS last-child div đúng mục đích và tránh lỗi khi xây dựng layout.

1. Phụ thuộc tuyệt đối vào vị trí trong DOM (Strict DOM Position)

Thuộc tính div:last-child xác định phần tử dựa trên vị trí thực tế trong DOM, không dựa trên vai trò hoặc nội dung của phần tử. Điều này có nghĩa là < div > chỉ được chọn khi nó thực sự là phần tử con cuối cùng của phần tử cha. Nếu phía sau nó xuất hiện một phần tử khác như < p >, < span > hoặc một < div > khác, selector có thể không hoạt động như mong muốn.

Hạn chế này đặc biệt đáng chú ý khi cấu trúc HTML thay đổi trong quá trình phát triển website. Chỉ cần thêm một phần tử vào cuối container, phần tử trước đó có thể không còn đáp ứng điều kiện :last-child. Vì vậy, khi sử dụng selector này, cần kiểm soát chặt chẽ cấu trúc DOM của thành phần giao diện.

2. Không thể lọc theo class hoặc attribute

Last-child chỉ quan tâm đến vị trí của phần tử trong nhóm, không thể tự xác định phần tử dựa trên class, ID hoặc attribute. Ví dụ, nếu một container chứa nhiều < div > với các class khác nhau, :last-child vẫn xét phần tử cuối cùng theo cấu trúc DOM thay vì tìm phần tử cuối cùng có một class cụ thể. Điều này khiến selector trở nên hạn chế khi giao diện có nhiều nhóm nội dung được phân loại bằng class hoặc attribute.

Trong những trường hợp cần chọn phần tử dựa trên đặc điểm cụ thể, có thể cần kết hợp :last-child với selector khác hoặc sử dụng các pseudo-class như :last-of-type. Với cấu trúc phức tạp hơn, đặt class rõ ràng cho phần tử cần xử lý đôi khi sẽ dễ kiểm soát và bảo trì hơn.

3. Nhạy cảm với các phần tử được chèn động

Khi nội dung được thêm hoặc xóa động bằng JavaScript hoặc các framework như React, Vue hay Angular, phần tử được CSS last-child xác định có thể thay đổi, khiến kiểu CSS được áp dụng cho phần tử khác. Chẳng hạn, khi một phần tử mới được chèn vào cuối container, phần tử trước đó không còn là :last-child và sẽ mất các kiểu CSS dành cho phần tử cuối. Điều này có thể làm thay đổi các thuộc tính như margin, border hoặc padding.

Vì vậy, với những danh sách có nội dung thay đổi liên tục, cần cân nhắc cách xây dựng selector để tránh phụ thuộc quá nhiều vào thứ tự DOM. Trong một số trường hợp,sử dụng class theo trạng thái hoặc logic của component sẽ dễ kiểm soát hơn so với việc dựa hoàn toàn vào :last-child.

4. Khó xử lý layout dạng grid/ multi-column phức tạp

Last-child chỉ xác định phần tử cuối cùng theo thứ tự DOM, trong khi giao diện CSS Grid hoặc multi-column có thể sắp xếp phần tử theo nhiều hàng và cột. Vì vậy, phần tử được xem là cuối cùng trong DOM chưa chắc là phần tử nằm ở vị trí cuối cùng về mặt trực quan trên giao diện. Điều này có thể gây khó khăn khi muốn xử lý riêng card cuối của một hàng hoặc cột.

Với các layout phức tạp, :last-child thường không đủ linh hoạt để kiểm soát từng vị trí hiển thị. Khi đó, có thể cần kết hợp :nth-child(), :nth-last-child(), CSS Grid hoặc các class được xác định theo logic layout để đạt kết quả chính xác hơn.

 

Sử dụng last child
 

Những nguyên nhân phổ biến khiến last-child không hoạt động 

Mặc dù last-child là một pseudo-class đơn giản nhưng trên thực tế, rất nhiều developer gặp tình trạng CSS không áp dụng được như mong đợi. Nguyên nhân thường không nằm ở cú pháp CSS mà đến từ cách hiểu sai bản chất hoạt động của selector này, hoặc từ cấu trúc HTML không như dự tính. Dưới đây là 4 nguyên nhân phổ biến nhất kèm cách khắc phục cụ thể.

1. Có thẻ khác nằm ở vị trí cuối cùng trong thẻ cha

Đây là một trong những nguyên nhân phổ biến nhất khiến last-child "không hoạt động" dù CSS viết hoàn toàn đúng cú pháp. Pseudo-class này chỉ chọn một phần tử khi nó thực sự là phần tử con cuối cùng trong DOM, bất kể phần tử đó thuộc loại thẻ nào.

Ví dụ:

< ul>

  < li>Mục 1

  < li>Mục 2

  < div class="clearfix">

< /ul>

Trong trường hợp này, selector li:last-child sẽ không chọn được < li >Mục 2< /li > vì phần tử cuối cùng trong < ul > là < div class="clearfix" >.

Cách khắc phục là kiểm tra lại cấu trúc HTML và đảm bảo phần tử cần định dạng thực sự nằm ở vị trí cuối cùng. Nếu không thể thay đổi HTML, có thể cân nhắc sử dụng last-of-type khi muốn chọn phần tử cuối cùng cùng loại trong phạm vi phần tử cha.

2. Nhầm lẫn giữa selector class và selector tag name

Một lỗi thường gặp khác là viết sai selector, dẫn đến trình duyệt hiểu nhầm ý định của developer. Ví dụ, khi muốn chọn phần tử cuối có class .item, nhiều người viết nhầm thành .item:last-child nhưng lại quên rằng last-child xét vị trí trong toàn bộ danh sách con, không phải vị trí trong danh sách các phần tử có cùng class đó. Nếu phần tử cuối cùng trong DOM không mang class .item, quy tắc này sẽ không áp dụng cho bất kỳ phần tử .item nào cả.

Ví dụ:

< div class="list">

  < p class="item">A

  < p class="item">B

  < span class="extra">C

< /div>

Trong trường hợp này, .item:last-child sẽ không chọn được phần tử B vì B không phải là phần tử con cuối cùng, phần tử cuối cùng thực tế là . Cách khắc phục là dùng last-of-type kết hợp class thận trọng hoặc tốt hơn là dùng :nth-last-child() để xác định vị trí chính xác nếu cấu trúc phức tạp, ví dụ .item:nth-last-child(2) nếu biết rõ số lượng phần tử phía sau.

3. Lỗi do thuộc tính display (flexbox & grid order)

Khi sử dụng Flexbox hoặc Grid, thuộc tính order có thể thay đổi vị trí hiển thị của phần tử trên giao diện. Tuy nhiên, thay đổi này không làm thay đổi thứ tự của phần tử trong DOM.

Ví dụ:

.item :last-child {

  order : -1;

}

Phần tử được chọn bởi :last-child vẫn là phần tử cuối cùng trong DOM. Tuy nhiên, order: -1 có thể khiến nó được hiển thị ở vị trí đầu tiên trên giao diện.

Điều này dễ gây nhầm lẫn khi kiểm tra bằng mắt, phần tử đang nằm cuối trong mã HTML có thể xuất hiện ở đầu giao diện, trong khi last-child vẫn xác định nó dựa trên cấu trúc DOM ban đầu.

Khi gặp trường hợp này, nên kiểm tra trực tiếp cấu trúc HTML bằng DevTools của trình duyệt thay vì chỉ dựa vào thứ tự hiển thị. Đồng thời, cần lưu ý rằng các pseudo-class như :last-child, :first-child và :nth-child() dựa trên cấu trúc DOM chứ không dựa trên vị trí trực quan sau khi order được áp dụng.

4. Lỗi sai cú pháp hoặc viết sai vị trí dấu cách (whitespace)

Lỗi cơ bản nhưng vẫn thường gặp là viết sai cú pháp CSS, đặc biệt là đặt sai vị trí dấu cách giữa selector và pseudo-class. Dấu hai chấm : phải được viết liền ngay sau selector, không được có khoảng trắng ở giữa, nếu không trình duyệt sẽ hiểu đây là hai selector khác nhau (combinator) thay vì một pseudo-class.

Ví dụ: 

/* Sai - có khoảng trắng trước dấu : */  -  li :last-child { color : red; }

/* Đúng */ - li:last-child { color : red; }

Nếu selector không được viết đúng, trình duyệt sẽ không áp dụng quy tắc CSS như mong muốn. Vì vậy, khi last-child không hoạt động, nên kiểm tra lần lượt cú pháp selector, khoảng trắng, cấu trúc HTML và thứ tự DOM trước khi tìm đến các nguyên nhân phức tạp hơn. Có thể sử dụng DevTools hoặc các công cụ lint CSS như Stylelint để phát hiện và hạn chế những lỗi cú pháp trong quá trình phát triển.

 

Cách sử dụng last child CSS

 

Một số câu hỏi thường gặp về CSS last-child

CSS last-child là một pseudo-class thường được sử dụng để định dạng phần tử cuối cùng trong một nhóm phần tử. Tuy nhiên, trong thực tế, developer có thể gặp một số trường hợp selector không hoạt động như mong muốn hoặc chưa rõ cách kết hợp với các tính năng CSS khác. Dưới đây là những câu hỏi thường gặp khi sử dụng :last-child và cách xử lý phù hợp.

1. Tại sao viết .class:last-child lại không ăn CSS?

Thuộc tính .class:last-child vẫn là một selector hợp lệ trong CSS nhưng chỉ áp dụng khi phần tử vừa có class tương ứng, vừa là phần tử con cuối cùng của phần tử cha. Last-child không tìm phần tử cuối cùng trong nhóm các phần tử có cùng class. Vì vậy, nếu phần tử mang class .class nằm trước một phần tử khác trong DOM, selector sẽ không được áp dụng. Khi gặp trường hợp này, cần kiểm tra lại cấu trúc HTML hoặc cân nhắc sử dụng :last-of-type nếu mục tiêu là chọn phần tử cuối cùng trong nhóm các phần tử cùng loại.

2. Có thể kết hợp last-child với Pseudo-element (như ::after, ::before) được không?

Có. Thuộc tính last-child có thể kết hợp với các pseudo-element như ::before và ::after để kiểm soát nội dung hoặc hiệu ứng trang trí của phần tử cuối cùng. Cách sử dụng này thường gặp khi tạo đường phân cách giữa các mục trong menu, danh sách sản phẩm hoặc các thành phần giao diện. Chẳng hạn, có thể áp dụng ::after cho tất cả phần tử để tạo đường kẻ và sử dụng :last-child để loại bỏ đường kẻ ở phần tử cuối cùng. Cách kết hợp này giúp hạn chế việc phải thêm class riêng chỉ để xử lý phần tử cuối.

3. Có nên sử dụng last-child trong thiết kế website responsive không?

Có. Last-child hoạt động bình thường trên các giao diện responsive vì selector này dựa trên cấu trúc DOM, không phụ thuộc trực tiếp vào kích thước màn hình. Vì vậy, có thể sử dụng nó để loại bỏ margin, padding, border hoặc các thành phần trang trí không cần thiết ở phần tử cuối trong nhiều bố cục khác nhau. 
 

Câu hỏi về last child


Qua bài viết của Phương Nam Vina, có thể thấy CSS last-child là một pseudo-class đơn giản nhưng rất hữu ích khi cần định dạng phần tử cuối cùng trong một nhóm mà không phải thêm class riêng vào HTML. Từ loại bỏ margin, border đến tùy chỉnh menu, danh sách và các thành phần giao diện, selector này giúp mã CSS gọn gàng và dễ quản lý hơn. Tuy nhiên để sử dụng last-child chính xác, cần hiểu rằng selector này dựa trên vị trí thực tế của phần tử trong DOM, không phải vị trí hiển thị hoặc nhóm các phần tử có cùng class. Khi gặp lỗi, cần kiểm tra cấu trúc HTML, selector, thứ tự DOM và cân nhắc các lựa chọn như :last-of-type() hoặc :nth-child() nếu phù hợp. Nắm rõ những nguyên tắc này sẽ giúp bạn sử dụng :last-child hiệu quả và tránh các lỗi CSS thường gặp trong quá trình xây dựng website.

Tham khảo thêm:

icon thiết kế website CSS variables là gì? Cẩm nang sử dụng CSS variables

icon thiết kế website CSS sticky là gì? Cách dùng position sticky trong thiết kế web

icon thiết kế website CSS float là gì? Cách hoạt động và sử dụng hiệu quả cho website

Bài viết mới nhất

Glassmorphism là gì? Cách tạo hiệu ứng kính mờ cho website

Glassmorphism là gì? Cách tạo hiệu ứng kính mờ cho website

Glassmorphism là phong cách thiết kế giao diện sử dụng hiệu ứng trong suốt, làm mờ, viền sáng để tạo cảm giác các thành phần đặt trên lớp kính.

 
Semantic HTML là gì? Ý nghĩa và cách dùng HTML semantic tags

Semantic HTML là gì? Ý nghĩa và cách dùng HTML semantic tags

Semantic HTML là cách sử dụng các thẻ HTML mô tả vai trò các thành phần trên website, hỗ trợ công cụ tìm kiếm và người dùng hiểu nội dung tốt hơn.

gRPC là gì? Cơ chế hoạt động và ứng dụng trong phát triển web

gRPC là gì? Cơ chế hoạt động và ứng dụng trong phát triển web

gRPC là framework mã nguồn mở giúp dịch vụ giao tiếp qua Remote Procedure Calls, sử dụng Protocol Buffers để định nghĩa, trao đổi dữ liệu hiệu quả.

AI Agent là gì? Kiến trúc cốt lõi và cách triển khai cho website

AI Agent là gì? Kiến trúc cốt lõi và cách triển khai cho website

AI Agent là một bước phát triển của AI, cho phép hệ thống phân tích, lập kế hoạch, thực hiện hành động và đánh giá kết quả để hoàn thành mục tiêu.

Footprint là gì? Bí mật phía sau hệ thống footprint website

Footprint là gì? Bí mật phía sau hệ thống footprint website

Footprint là tập hợp dấu vết từ nền tảng, cấu trúc và các hoạt động web, giúp nhận diện, phân tích hệ thống và khai thác dữ liệu hiệu quả trong SEO.

FAQ schema là gì? Cách tạo và cài schema FAQ cho website

FAQ schema là gì? Cách tạo và cài schema FAQ cho website

FAQ schema là dữ liệu có cấu trúc giúp công cụ tìm kiếm hiểu rõ về nội dung và mối quan hệ giữa các câu hỏi và câu trả lời trong phần FAQ trên web.

zalo