基于uniapp开发
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
2.7 KiB

2 years ago
<template>
<view>
<view class="panel container" :style="panelColor">
<view :style="canvasHexStyle" @click="onClickCanvas">
<view >
{{name}}
</view>
<view>
#{{hex}}
</view>
<view class="rgb-text">
rgb({{rgb.r}},{{rgb.g}},{{rgb.b}})
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: "ColorPanel",
props: {
hsb: {
type: Object,
},
name: {
type: String,
}
},
methods: {
/**
* hsb rgb
* @param {Object} 颜色模式 H(hues)表示色相S(saturation)表示饱和度Bbrightness表示亮度
*/
HSBToRGB(hsb) {
let rgb = {};
let h = Math.round(hsb.h);
let s = Math.round((hsb.s * 255) / 100);
let v = Math.round((hsb.b * 255) / 100);
if (s == 0) {
rgb.r = rgb.g = rgb.b = v;
} else {
let t1 = v;
let t2 = ((255 - s) * v) / 255;
let t3 = ((t1 - t2) * (h % 60)) / 60;
if (h == 360) h = 0;
if (h < 60) {
rgb.r = t1;
rgb.b = t2;
rgb.g = t2 + t3;
} else if (h < 120) {
rgb.g = t1;
rgb.b = t2;
rgb.r = t1 - t3;
} else if (h < 180) {
rgb.g = t1;
rgb.r = t2;
rgb.b = t2 + t3;
} else if (h < 240) {
rgb.b = t1;
rgb.r = t2;
rgb.g = t1 - t3;
} else if (h < 300) {
rgb.b = t1;
rgb.g = t2;
rgb.r = t2 + t3;
} else if (h < 360) {
rgb.r = t1;
rgb.g = t2;
rgb.b = t1 - t3;
} else {
rgb.r = 0;
rgb.g = 0;
rgb.b = 0;
}
}
return {
r: Math.round(rgb.r),
g: Math.round(rgb.g),
b: Math.round(rgb.b)
};
},
// 将 rgb 转换为 hex
rgbToHex(rgb) {
let hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)];
hex.map(function(str, i) {
if (str.length == 1) {
hex[i] = '0' + str;
}
});
return hex.join('');
},
// 将 hex 复制到设备剪贴板
onClickCanvas() {
uni.setClipboardData({
data: "#" + this.hex,
});
// 调用父组件的函数
this.$emit("clickPanel",this.hex);
},
},
computed: {
rgb() {
return this.HSBToRGB(this.hsb);
},
hex() {
return this.rgbToHex(this.rgb);
},
panelColor() {
return `background: #${this.hex}`;
},
// 设置canvas的文本颜色
canvasHexStyle() {
for (let key in this.rgb) {
if (this.rgb[key] >= 130) {
return "color: black";
}
}
return "color: white";
}
},
}
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
}
.rgb-text {
font-size: 10px;
}
.panel {
height: 70px;
width: 110px;
border-radius: 10px;
border-color: #484848;
border-style: dashed;
}
</style>