TABLE OF CONTENTS

Hi 🤓 Cảm ơn bạn đã ghé thăm blog này, nếu những bài viết trên blog giúp ích cho bạn. Bạn có thể giúp blog hiển thị quảng cáo bằng cách tạm ngừng ad blocker 😫 và để giúp blog duy trì hoạt động nếu bạn muốn.
Cảm ơn bạn!

Star rating systems hay hệ thống đánh giá là một cách để chúng ta xem bài viết, sản phẩm,... Được bao nhiêu người đánh giá và số sao trung bình cao hay thấp, từ đó giúp ta cải thiện chất lượng bài viết tốt hơn.

Giả sử hệ thống trả về cho chúng ta một kết quả số sao trung bình là 4.28 ⭐. Làm thế nào để chúng ta hiển thị chính xác số sao này, thay vì chúng ta phải check điều kiện để hiển thị, vì các icon hay svg thường chỉ có ba kiểu là solid, halfregular.

Để xử lý vấn đề trên thì trong CSS có một thuộc tính khá hay là mix-blend-mode. Thuộc tính này giúp chúng ta pha trộn màu sắc của các đối tượng.

Ví dụ chúng ta có 2 img chồng lên nhau, khi sử dụng blend modes nó sẽ mix các colors của 2 hình với nhau và tùy vào chế độ blend modes, chúng ta sẽ được kết quả là các màu khác nhau sau khi trộn.

Sau khi chúng ta hiểu cơ bản về thuộc tính mix-blend-mode trong CSS, cùng bắt tay vào làm thử Star rating nhé 😁.

Star rating CSS

Ý tưởng của chúng ta đơn giản là chúng ta sẽ tạo một div giống như một lớp phủ lên các ngôi sao ⭐ của chúng ta. Sử dụng mix-blend-mode với giá trị color để mix các màu giữa div và ⭐.

Sử dụng mix-blend-mode: color sẽ chỉ ảnh hưởng đối với các phần tử có màu sắc.

Đầu tiên chúng ta sẽ tạo một parent có class stars chứa các star.

<div class="stars">
  <svg width="100" height="100" viewBox="0 0 940.688 940.688">
    <path d="M885.344,319.071l-258-3.8l-102.7-264.399c-19.8-48.801-88.899-48.801-108.6,0l-102.7,264.399l-258,3.8 c-53.4,3.101-75.1,70.2-33.7,103.9l209.2,181.4l-71.3,247.7c-14,50.899,41.1,92.899,86.5,65.899l224.3-122.7l224.3,122.601 c45.4,27,100.5-15,86.5-65.9l-71.3-247.7l209.2-181.399C960.443,389.172,938.744,322.071,885.344,319.071z" />
  </svg>
  ... 5 stars sẽ cần 5 svg
  <div class="overlay" style="width: 37%"></div>
</div>

Các element star mình sẽ sử dụng svg có sẵn ở trên mạng ^^. Tiếp theo ta cần tạo một lớp phủ overlay. Element này là nhân vật chính giúp chính ta hiển thị chính xác số sao ^^. Ta sẽ phủ element này lên các ngôi sao và sử dụng mix-blend-mode: color như sau:

body {
    height: 100vh;
    margin: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}

.stars {
    position: relative;
    white-space: nowrap;
}
.stars svg {
    width: 60px;
}

.overlay {
    background: #fff;
    height: 100%;
    overflow: hidden;
    mix-blend-mode: color;
    position: absolute;
    top: 0;
    right: 0;
}

svg {
    fill: gold;
}

Chúng ta sẽ để background của overlay giống với màu nền, việc còn lại cứ để mix-blend-mode lo ^^.

Kết quả chúng ta sẽ được như sau:

Có thể các bạn thắc mắc ở trên mình lại sử dụng right: 0 thay vì left:0, đó chính là vì khi sử dụng mix-blend-mode: color nó sẽ trộn màu của các phần tử mà overlay phủ lên. Nếu sử dụng left:0 kết quả sẽ không chính xác.

Vì chúng ta có % tính từ phải qua trái nên chúng ta cần một bước nữa để hiển thị chính xác số sao, chúng ta sẽ sử dụng JavaScript, PHP, React,... Để tính toán và trả về % và hiển thị số sao:

const percentage = Math.round((value / max) * 100);
document.querySelector('.overlay').style.width = `${100 - percentage}%`;

Kết luận

Như vậy là chúng ta đã hoàn thành Star rating bằng cách sử dụng mix-blend-mode trong CSS. Mong bài viết sẽ giúp ích cho các bạn ^^.

Chúc các bạn học tốt. Hẹn gặp các bạn trong các bài viết tiếp theo 😊.

Có thể bạn thích ⚡
homiedev
About Me

Hi, I'm @devnav. Một người thích chia sẻ kiến thức, đặc biệt là về Frontend 🚀. Trang web này được tạo ra nhằm giúp các bạn học Frontend hiệu quả hơn 🎉😄.

Chúc các bạn tìm được kiến thức hữu ích trong blog này 😁😁.