2013-05-03 36 views
11

Có thể tính toán màu ở giữa độ dốc không?Tính màu HEX có 2 màu và phần trăm/vị trí

var color1 = 'FF0000'; 
var color2 = '00FF00'; 

// 50% between the two colors, should return '808000' 
var middle = gradient(color1, color2, 0.5); 

Tôi chỉ có hai chuỗi thập lục phân và tôi muốn một trả lại.

+0

Đó là một vấn đề đại số tuyến tính đơn giản (và bạn đã biết rằng kể từ khi bạn đã có câu trả lời cho các màu mẫu của bạn). Những gì bạn đã mã hóa cho đến nay? – Pointy

+0

có thể trùng lặp của [Lập trình Làm sáng hoặc Làm tối màu hex (hoặc rgb và màu pha trộn)] (http://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or- rgb-and-blend-colors) –

Trả lời

29

này nên làm việc:

Về cơ bản nó liên quan đến việc chuyển đổi chúng sang thập phân, tìm nửa, chuyển đổi kết quả lại cho hex và sau đó concatenating chúng.

var color1 = 'FF0000'; 
var color2 = '00FF00'; 
var ratio = 0.5; 
var hex = function(x) { 
    x = x.toString(16); 
    return (x.length == 1) ? '0' + x : x; 
}; 

var r = Math.ceil(parseInt(color1.substring(0,2), 16) * ratio + parseInt(color2.substring(0,2), 16) * (1-ratio)); 
var g = Math.ceil(parseInt(color1.substring(2,4), 16) * ratio + parseInt(color2.substring(2,4), 16) * (1-ratio)); 
var b = Math.ceil(parseInt(color1.substring(4,6), 16) * ratio + parseInt(color2.substring(4,6), 16) * (1-ratio)); 

var middle = hex(r) + hex(g) + hex(b); 
+0

lưu ý đối số thứ ba -> '0,5' là tỷ lệ' color1' và 'color2' –

+0

@KalamarObliwy - Ahh, bỏ qua điều đó. Đã sửa câu trả lời. – techfoobar

+1

Vâng điều này thực sự là gần, nhưng nếu tỷ lệ là 0 thì màu sắc là màu đen, trong khi nó phải là color1. Hơn nữa, các r.toString vv wont pad với số không, sẽ họ? –

4

tôi không thể bình luận về câu trả lời ở trên, vì vậy tôi viết nó ở đây:

tôi phát hiện ra rằng trong phương pháp chuỗi javascript chỉ số để tham số không được bao gồm trong chuỗi trả lại. Điều đó có nghĩa:

var string = "test"; 
//index: 
alert(string.substring(1,3)); 

//will alert es and NOT est 

Edit: Vì vậy, nó nên là:

parseInt(color1.substring(0,2), 16); 
parseInt(color1.substring(2,4), 16); 

parseInt(color1.substring(4,6), 16);