✨(component): 颜色选择器取色器
This commit is contained in:
parent
ab40116673
commit
53697131b6
22
package/component/src/component/colorPicker/EyeDropper.vue
Normal file
22
package/component/src/component/colorPicker/EyeDropper.vue
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<template>
|
||||||
|
<svg t="1651169382813" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2529" width="27" height="27">
|
||||||
|
<path
|
||||||
|
d="M769.3 409.1c-4.3-16.2-14.7-29.7-29.2-38l-51.3-29.6-10 17.3c-3.7 6.4-10.4 10-17.3 10-3.4 0-6.8-0.9-10-2.7l68.6 39.6c5.2 3 9 7.9 10.5 13.7 1.6 5.8 0.8 11.9-2.3 17.2l-6.6 11.5c-6.2 10.8-20.1 14.5-30.9 8.3L441 312.2c-5.2-3-9-7.9-10.5-13.7-1.6-5.8-0.8-11.9 2.3-17.2l6.6-11.5c3-5.2 7.9-9 13.7-10.5 1.9-0.5 3.9-0.8 5.9-0.8 3.9 0 7.8 1 11.3 3l69.3 40c-9.6-5.5-12.8-17.8-7.3-27.3l10-17.3-52-30c-14.5-8.4-31.4-10.6-47.5-6.3-16.2 4.3-29.7 14.7-38 29.2l-6.6 11.5c-8.4 14.5-10.6 31.4-6.3 47.5 4.3 16.2 14.7 29.7 29.2 38l52 30 10-17.3c5.5-9.6 17.8-12.8 27.3-7.3 9.6 5.5 12.8 17.8 7.3 27.3l-10 17.3 77.2 44.6 10-17.3c5.5-9.6 17.8-12.8 27.3-7.3 9.6 5.5 12.8 17.8 7.3 27.3l-10 17.3 51.3 29.6c9.8 5.7 20.6 8.4 31.2 8.4 21.7 0 42.7-11.2 54.3-31.3l6.6-11.5c8.5-14.5 10.7-31.4 6.4-47.5z"
|
||||||
|
fill="#515151" p-id="2530"></path>
|
||||||
|
<path
|
||||||
|
d="M644.2 338.8l10-17.3-77.2-44.6-10 17.3c-5.5 9.6-17.8 12.8-27.3 7.3l111.8 64.6c-9.6-5.5-12.9-17.8-7.3-27.3zM539.6 301.5zM651.5 366.1z"
|
||||||
|
fill="#515151" p-id="2531"></path>
|
||||||
|
<path
|
||||||
|
d="M624.1 195.2c12.3-21.3 39.6-28.6 60.9-16.3 10.3 6 17.7 15.6 20.8 27.1s1.5 23.5-4.5 33.8l-47.2 81.7 34.6 20 47.2-81.7c11.3-19.6 14.3-42.4 8.5-64.2-5.8-21.8-19.8-40.1-39.4-51.4-40.4-23.3-92.2-9.4-115.5 31l-47.2 81.7 34.6 20 47.2-81.7z"
|
||||||
|
fill="#515151" p-id="2532"></path>
|
||||||
|
<path
|
||||||
|
d="M644.2 338.8c-5.5 9.6-2.2 21.8 7.3 27.3 3.1 1.8 6.6 2.7 10 2.7 6.9 0 13.6-3.6 17.3-10l10-17.3-34.6-20-10 17.3zM539.6 301.5c9.6 5.5 21.8 2.2 27.3-7.3l10-17.3-34.6-20-10 17.3c-5.5 9.6-2.2 21.8 7.3 27.3z"
|
||||||
|
fill="#515151" p-id="2533"></path>
|
||||||
|
<path
|
||||||
|
d="M395.4 769.6c-2.6 4.4-6.5 7.6-11 9-2.3 0.7-6.9 1.5-11.3-1-9.6-5.5-21.8-2.2-27.3 7.3l-23.1 40c-1.7 2.9-4.2 5-7.1 5.8-1.7 0.5-4.1 0.8-6.5-0.5-2.4-1.4-3.3-3.7-3.7-5.4-0.7-2.9-0.1-6.2 1.5-9l22.9-39.7c5.6-9.7 2.3-22.2-7.4-27.8-7.3-4.2-9.2-14.7-4.2-23.3l189.5-328.2-34.6-20L283.6 705c-12.4 21.4-10.1 47.2 3.7 64.8l-15 26c-6.7 11.6-8.8 25.1-5.9 37.9 3 13.4 11.1 24.4 22.7 31.1 7.3 4.2 15.4 6.4 23.7 6.4 4.9 0 9.8-0.7 14.6-2.2 12.6-3.9 23.2-12.4 29.9-24.1l15-26c7.8 1.1 15.9 0.4 23.8-2 14.2-4.4 26.2-14.1 33.8-27.3l189.5-328.2-34.6-20-189.4 328.2z"
|
||||||
|
fill="#515151" p-id="2534"></path>
|
||||||
|
<path
|
||||||
|
d="M622.2 416.8c-9.6-5.5-21.8-2.2-27.3 7.3l-10 17.3 34.6 20 10-17.3c5.6-9.6 2.3-21.8-7.3-27.3zM517.7 379.5c5.5-9.6 2.2-21.8-7.3-27.3-9.6-5.5-21.8-2.2-27.3 7.3l-10 17.3 34.6 20 10-17.3z"
|
||||||
|
fill="#515151" p-id="2535"></path>
|
||||||
|
</svg>
|
||||||
|
</template>
|
@ -7,13 +7,16 @@ export default {
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import "./index.less";
|
import "./index.less";
|
||||||
import LayDropdown from "../dropdown/index.vue";
|
import LayDropdown from "../dropdown/index.vue";
|
||||||
import { ref, computed, watch, onMounted } from "vue";
|
import EyeDropper from "./EyeDropper.vue";
|
||||||
|
import { ref, computed, watch, onMounted, } from "vue";
|
||||||
|
import { useEyeDropper } from '@vueuse/core'
|
||||||
|
|
||||||
const emit = defineEmits(["update:modelValue"]);
|
const emit = defineEmits(["update:modelValue"]);
|
||||||
|
|
||||||
export interface LayColorPicker {
|
export interface LayColorPicker {
|
||||||
modelValue?: any;
|
modelValue?: any;
|
||||||
preset?: any;
|
preset?: any;
|
||||||
|
eyeDropper?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const props = withDefaults(defineProps<LayColorPicker>(), {
|
const props = withDefaults(defineProps<LayColorPicker>(), {
|
||||||
@ -24,6 +27,7 @@ const props = withDefaults(defineProps<LayColorPicker>(), {
|
|||||||
const saturationValue = ref<null | HTMLElement>(null);
|
const saturationValue = ref<null | HTMLElement>(null);
|
||||||
const hueSlider = ref<null | HTMLElement>(null);
|
const hueSlider = ref<null | HTMLElement>(null);
|
||||||
const alphaSlider = ref<null | HTMLElement>(null);
|
const alphaSlider = ref<null | HTMLElement>(null);
|
||||||
|
const { isSupported, open, sRGBHex } = useEyeDropper()
|
||||||
|
|
||||||
let pointStyle = ref("top: 25%;left: 80%;");
|
let pointStyle = ref("top: 25%;left: 80%;");
|
||||||
let hueSliderStyle = ref("left: 0;");
|
let hueSliderStyle = ref("left: 0;");
|
||||||
@ -38,6 +42,14 @@ let green = ref(0);
|
|||||||
let blue = ref(0);
|
let blue = ref(0);
|
||||||
let alpha = ref(1);
|
let alpha = ref(1);
|
||||||
|
|
||||||
|
const openEyeDropper = function(){
|
||||||
|
if(isSupported){
|
||||||
|
open();
|
||||||
|
}else{
|
||||||
|
console.warn("LayColorPicker: Eye dropper not supported by your browser!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
let { r, g, b, a } = parseColor(props.modelValue);
|
let { r, g, b, a } = parseColor(props.modelValue);
|
||||||
red.value = r;
|
red.value = r;
|
||||||
@ -46,6 +58,14 @@ onMounted(() => {
|
|||||||
alpha.value = a;
|
alpha.value = a;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
watch(sRGBHex, (sRGBHex) => {
|
||||||
|
let { r, g, b, a } = hex2rgba(sRGBHex);
|
||||||
|
red.value = r;
|
||||||
|
green.value = g;
|
||||||
|
blue.value = b;
|
||||||
|
alpha.value = a;
|
||||||
|
})
|
||||||
|
|
||||||
watch([red, green, blue], (newValue) => {
|
watch([red, green, blue], (newValue) => {
|
||||||
emit(
|
emit(
|
||||||
"update:modelValue",
|
"update:modelValue",
|
||||||
@ -430,6 +450,12 @@ function hex2rgba(s: any) {
|
|||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="eyeDropper"
|
||||||
|
@click="openEyeDropper"
|
||||||
|
style="margin-left: 5px;">
|
||||||
|
<EyeDropper />
|
||||||
|
</div>
|
||||||
<div class="color-diamond">
|
<div class="color-diamond">
|
||||||
<div
|
<div
|
||||||
:style="`background-color: ${colorObj.rgba};width: 100%;height: 100%;box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .15), inset 0 0 4px rgba(0, 0, 0, .25);`"
|
:style="`background-color: ${colorObj.rgba};width: 100%;height: 100%;box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .15), inset 0 0 4px rgba(0, 0, 0, .25);`"
|
||||||
|
@ -54,6 +54,31 @@ export default {
|
|||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
::: title 取色器
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: demo
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<lay-color-picker v-model="color" eyeDropper></lay-color-picker>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { ref } from "vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setup() {
|
||||||
|
const color = ref("#009688");
|
||||||
|
|
||||||
|
return {
|
||||||
|
color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
::: title Icon Picker 属性
|
::: title Icon Picker 属性
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@ -63,6 +88,7 @@ export default {
|
|||||||
| ---------- | -------- | --- |
|
| ---------- | -------- | --- |
|
||||||
| v-model | 选中色 | -- |
|
| v-model | 选中色 | -- |
|
||||||
| preset | 预设颜色 | -- |
|
| preset | 预设颜色 | -- |
|
||||||
|
| eyeDropper | 取色器 | Boolean |
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user