Menu

Gradient trong CSS: radial, linear và conic gradient

Gradient trong CSS là hình ảnh mà trình duyệt vẽ từ các màu. Tìm hiểu radial-gradient (hình dạng, kích thước, vị trí), linear-gradient (hướng và góc), conic-gradient, điểm dừng màu, điểm dừng cứng để vẽ sọc, gradient lặp lại và chữ gradient.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Radial gradient

radial-gradient() chuyển màu từ một điểm tâm lan ra ngoài. Giống mọi gradient trong CSS, nó là một hình ảnh, nên đặt trong background-image (hoặc cách viết tắt background):

Cú pháp đầy đủ là radial-gradient(shape size at position, color stops). Mọi thứ đứng trước các màu đều không bắt buộc.

Thành phầnGiá trịMặc định
Hình dạngcircle, ellipseellipse
Kích thướcclosest-side, closest-corner, farthest-side, farthest-corner, hoặc độ dàifarthest-corner
Vị tríat center, at top left, at 30% 70%, at 20px 40pxat center
Điểm dừng màuHai màu trở lên, mỗi màu có thể kèm một vị trí

Từ khóa kích thước quyết định màu cuối cùng xuất hiện ở đâu: ở cạnh gần nhất của hộp, ở góc xa nhất, và tương tự. Đổi các giá trị ở đây và xem gradient được vẽ lại:

Thử circle farthest-corner at 30% 50%, #f59e0b, #2563eb, ellipse at bottom, white, #16a34a và circle 40px, #f59e0b 99%, transparent (một chấm tròn có viền sắc nét).

Linear gradient

linear-gradient() chuyển màu dọc theo một đường thẳng. Đặt hướng hoặc góc ở đầu, sau đó là các màu:

Góc bắt đầu từ 0deg hướng lên trên và quay theo chiều kim đồng hồ, nên 90deg là to right còn 180deg là giá trị mặc định to bottom. to right vẫn là hướng vật lý trên trang viết từ phải sang trái; bạn tự lật nó nếu gradient cần đi theo hướng đọc.

Điểm dừng màu và điểm dừng cứng

Mỗi màu có thể có một vị trí. Không có vị trí thì các màu được chia đều. Khi hai màu chung một vị trí, màu đổi ngay lập tức, và đó là cách vẽ sọc, lá cờ hay thanh tiến độ:

Một điểm dừng cũng có thể nhận hai vị trí, #111827 12px 24px, để vẽ một dải màu đặc từ 12px đến 24px.

Conic gradient

conic-gradient() quét màu quanh một điểm tâm, giống kim đồng hồ. Với điểm dừng cứng, nó vẽ được biểu đồ tròn mà không cần hình ảnh hay JavaScript:

Biểu đồ vẽ bằng CSS là vô hình với trình đọc màn hình, nên hãy ghi cả các con số bằng chữ.

Chữ gradient

Cắt nền gradient theo hình các chữ cái và làm cho bản thân chữ trong suốt:

.gradient-text {
  background: linear-gradient(90deg, #2563eb, #db2777);
  -webkit-background-clip: text; /* older browsers need the prefix */
  background-clip: text;
  color: transparent;
}

Nhớ tính đến một màu color thường làm dự phòng: nếu việc cắt không thành công, chữ sẽ biến mất. Chữ gradient cũng có độ tương phản không đều, nên chỉ dùng cho tiêu đề lớn.

Gradient có thể xếp chồng cùng hình ảnh và các gradient khác trong một danh sách background-image; trang background image trình bày về lớp, kích thước và vị trí.

Lỗi thường gặp

  • background-color: linear-gradient(...). Gradient là hình ảnh: dùng background-image hoặc background.
  • Góc quay sai hướng. 0deg hướng lên trên, không phải sang phải. 90deg mới hướng sang phải.
  • Gradient trên phần tử không có chiều cao. Không có gì hiện ra; hãy cho nó nội dung hoặc kích thước.
  • Màu ở giữa bị đục. Chuyển giữa hai màu đậm đối lập, như đỏ và xanh lá, sẽ đi qua màu nâu xám trong sRGB. Thêm một điểm dừng ở giữa, hoặc chuyển màu trong một không gian màu khác: linear-gradient(in oklch, red, green).
  • Gradient lớn, nhạt bị phân dải. Các màu quá gần nhau trên một vùng rộng sẽ lộ ra từng bậc; tăng độ tương phản giữa các điểm dừng một chút sẽ đỡ hơn.

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

Làm sao tạo radial gradient trong CSS?

Dùng background-image: radial-gradient(#93c5fd, #1e3a8a);. Thêm hình dạng và vị trí trước các màu, chẳng hạn radial-gradient(circle at top left, #93c5fd, #1e3a8a).

circle và ellipse trong radial-gradient khác nhau thế nào?

ellipse (mặc định) giãn theo tỷ lệ của hộp, nên hộp rộng thì gradient cũng rộng. circle giữ gradient tròn bất kể hộp có hình dạng gì.

Làm sao đặt hướng cho linear gradient?

Đặt hướng hoặc góc ở đầu: linear-gradient(to right, red, blue) hoặc linear-gradient(45deg, red, blue). Mặc định là to bottom (180deg); 0deg hướng lên trên và góc quay theo chiều kim đồng hồ.

Làm sao tạo sọc rõ nét thay vì chuyển màu mượt?

Cho hai màu cùng một vị trí dừng: linear-gradient(90deg, #2563eb 50%, #f59e0b 50%) đổi màu ngay ở giữa mà không chuyển tiếp. repeating-linear-gradient lặp lại một mẫu gồm các điểm dừng như vậy.

Có dùng gradient cho background-color được không?

Không. Gradient là một hình ảnh, nên nó thuộc về background-image hoặc cách viết tắt background. background-color: linear-gradient(...) không hợp lệ và bị bỏ qua.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu