UNPKG

@cataract6545/tmui

Version:

tm-vuetify是一个新势力由主题驱动的UI组件库,相比其它优势大,组件全,设计趋势紧跟未来。具有主题生成,主题实时切换,暗黑实时切换,lottie动画,图表等新颖功能,tmui TMUI

226 lines (209 loc) 4.62 kB
/** * 颜色转换工具 * @description js颜色值转换类 * @author tmui | tmzdy | vuetify | https://tmui.design */ import { rgba, hsla, hsva } from '../lib/interface'; export var colortool = { rgbaToHsla(scolor : rgba) : hsla { let { r, g, b, a } = scolor; r = r / 255; g = g / 255; b = b / 255; var max = Math.max(r, g, b); var min = Math.min(r, g, b); var h, s, l; if (max === min) { h = 0; } else if (max === r) { h = (60 * (g - b)) / (max - min); } else if (max === g) { h = 60 * (2 + (b - r) / (max - min)); } else { h = 60 * (4 + (r - g) / (max - min)); } if (h < 0) { h += 360; } l = (max + min) / 2; if (max === min) { s = 0; } else if (l < 0.5) { s = (max - min) / (max + min); } else { s = (max - min) / (2 - max - min); } return { h: h, s: s * 100, l: l * 100, a: a }; }, hslaToRgba(scolor : hsla) : rgba { let { h, s, l, a } = scolor; h = h / 360; // 转换为0-1之间的比例 s = s / 100; // 转换为0-1之间的比例 l = l / 100; // 转换为0-1之间的比例 var r, g, b; if (s === 0) { r = g = b = l; // 非彩色的HSLA颜色转换成灰色的RGBA颜色 } else { function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; } var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hue2rgb(p, q, h + 1 / 3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1 / 3); } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255), a: a, }; // return { r: rgb[0], g: rgb[1], b: rgb[2], a: a }; }, cssToRgba: function (sColor : string) : rgba { if (!sColor) { return { r: 0, g: 0, b: 0, a: 0 } } let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; sColor = sColor.toLowerCase(); if (sColor && reg.test(sColor)) { if (sColor.length === 4) { let sColorNew = "#"; for (let i = 1; i < 4; i += 1) { sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1)); } sColor = sColorNew; } //处理六位的颜色值 let sColorChange = []; for (let i = 1; i < 7; i += 2) { sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2))); } return { r: sColorChange[0], g: sColorChange[1], b: sColorChange[2], a: 1 } } else if (/^(rgb|RGB|rgba|RGBA)/.test(sColor)) { let arr = sColor.replace(/(?:\(|\)|rgba|rgb|RGB|RGBA)*/g, "").split(",") let p = arr.map(val => Number(val)); if (p.length < 3) { return { r: 0, g: 0, b: 0, a: 1 } } if (p.length == 3) { p.push(1) } return { r: p[0], g: p[1], b: p[2], a: p[3] } } else { return { r: 0, g: 0, b: 0, a: 1 } } }, rgbaToHsva: function (rgba : rgba) : hsva { if (!rgba) return { h: 0, s: 1, v: 1, a: 1 }; const r = rgba.r / 255; const g = rgba.g / 255; const b = rgba.b / 255; const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h = 0; if (max !== min) { if (max === r) { h = 60 * (0 + (g - b) / (max - min)); } else if (max === g) { h = 60 * (2 + (b - r) / (max - min)); } else if (max === b) { h = 60 * (4 + (r - g) / (max - min)); } } if (h < 0) h = h + 360; const s = max === 0 ? 0 : (max - min) / max; const hsv = [h, s, max]; return { h: hsv[0], s: hsv[1], v: hsv[2], a: rgba.a }; }, hsvaToRgba: function (sColor : hsva) : rgba { var { h, s, v, a } = sColor; var r : number = 0; var g : number = 0; var b : number = 0; var i; var f; var p; var q; var t; i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; default: break; } return { r: r, g: g, b: b, a: a } }, rgbaToCss: function (sColor : rgba) : string { return `rgba(${sColor.r},${sColor.g},${sColor.b},${sColor.a})`; }, };