我目前正在开发一个JS动画库,需要根据0 - 1之间的进度值计算两个值之间的颜色。
例如,函数可能看起来像下面的内容。这将以HEX格式输入两种颜色。
- colourA =初始颜色
- colourB =最终颜色
- 进度= 0。5人(50%)
const interpolateColour = (colourA, colourB, progress) => { return polColour }
目标是返回颜色0。两种颜色之间的5个进度或50%。我知道十六进制颜色很可能需要转换成RGBA的HSV来实现这种效果,虽然不确定哪种是最好的方法。
编辑:我想出来了。..
const is = {
hex: a => /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a),
rgb: a => /^rgb/.test(a),
hsl: a => /^hsl/.test(a),
col: a => (is.hex(a) || is.rgb(a) || is.hsl(a)),
}
const convertToRgba = (colour) => {
return is.hex(colour) ? hexToRgba(colour)
: is.rgb(colour) ? rbgToRgba(colour)
: is.hsl(colour) ? hslToRgba(colour)
: colour
}
const hexToRgba = (colour, alpha = 1) => {
const [r, g, b] = colour.match(/\w\w/g).map(x => parseInt(x, 16))
return `rgba(${r},${g},${b},${alpha})`
};
const rbgToRgba = (colour, alpha = 1) => {
const [r, g, b] = colour.replace(/[^\d,]/g, '').split(',')
return `rgba(${r},${g},${b},${alpha})`
}
const deconstructRgba = (rgba) => {
return rgba.replace(/[^\d,]/g, '').split(',').map(x => parseInt(x))
}
const formatRbga = (colour) => {
return `rgba(${colour.r},${colour.g},${colour.b},${colour.a})`
}
const interpolateColour = (colourA, colourB, progress) => {
const [r1, g1, b1, a1] = deconstructRgba(convertToRgba(colourA))
const [r2, g2, b2, a2] = deconstructRgba(convertToRgba(colourB))
return formatRbga({
r: Math.round((r1 + r2) * progress),
g: Math.round((g1 + g2) * progress),
b: Math.round((b1 + b2) * progress),
a: Math.round((a1 + a2) * progress)
})
}
export {
interpolateColour,
convertToRgba,
hexToRgba,
rbgToRgba,
deconstructRgba
}
3条答案
按热度按时间vm0i2vca1#
R、G和B值的简单插值就足够了。
0s7z1bwu2#
使用十六进制颜色:
qvk1mo1f3#
对于那些寻求简单、独立的解决方案的人:
使用方法: