基于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.
 
 
 
 

242 lines
6.1 KiB

<template>
<view>
<view class="padding-10">
<sectionTitle title="当前颜色" num='01'></sectionTitle>
<view class="container">
<!-- 展示当前颜色的画布 -->
<view class="container canvas" :style="canvasStyle" @click="onClickCanvas">
<view :style="canvasHexStyle">
{{canvasHex}}
</view>
</view>
<button @click="openPicker">打开色盘</button>
<!-- ref定义了组件的名字 -->
<!-- @confirm将调色盘的确认按钮绑定到confirmPicker()方法 -->
<t-color-picker ref="colorPicker" :color="canvasColor" @confirm="confirmPicker"></t-color-picker>
<view class="form padding-10">
<text class="padding-r-10 input-title">Hex色码</text>
<uni-easyinput v-model="hexValue" placeholder="#ffc107" class="padding-r-10"></uni-easyinput>
<button @click="hexSubmit" size="mini" type="primary">确认</button>
</view>
</view>
</view>
<!-- 新增代码,rgb色码输入框 -->
<uni-card :is-shadow="false">
<template v-slot:title>
<view class="card-title input-title">RGB色码</view>
</template>
<uni-row class="form">
<uni-col :span="2">
<text class="">R</text>
</uni-col>
<uni-col :span="22">
<slider :value="canvasColor.r" min="0" max="255" data-type="r" @changing="sliderChanging"
activeColor="#ff8183" backgroundColor="#ffb5b6" block-color="#e92528" block-size="20"
:show-value="true" />
</uni-col>
</uni-row>
<uni-row class="form">
<uni-col :span="2">
<text class="">G</text>
</uni-col>
<uni-col :span="22">
<!-- 以data-开头的是一种特殊的属性,它将自身的值以变量的形式传递到绑定事件的函数之中-->
<slider :value="canvasColor.g" min="0" max="255" data-type="g" @changing="sliderChanging"
activeColor="#55d54e" backgroundColor="#a6f4a5" block-color="#3b8b1e" block-size="20"
:show-value="true" />
</uni-col>
</uni-row>
<uni-row class="form">
<uni-col :span="2">
<text class="">B</text>
</uni-col>
<uni-col :span="22">
<slider :value="canvasColor.b" min="0" max="255" data-type="b" @changing="sliderChanging"
activeColor="#8a96ff" backgroundColor="#7980ff" block-color="#3651e8" block-size="20"
:show-value="true" />
</uni-col>
</uni-row>
</uni-card>
<view class="padding-10">
<sectionTitle num="02" title="相似色彩"></sectionTitle>
</view>
<SimilarColors :rgb="canvasColor"></SimilarColors>
</view>
</template>
<script>
export default {
data() {
return {
canvasColor: {
r: 255,
g: 193,
b: 7,
a: 1
},
hexValue: "",
};
},
// 页面启动时的生命周期函数
mounted() {
this.hexValue = "#" + this.rgbToHex(this.canvasColor)
},
methods: {
// methods中的方法需要通过某些事件、动作才能触发运行
openPicker(item) {
// 打开颜色选择器
this.$refs.colorPicker.open();
},
confirmPicker(e) {
// 色盘点击确定后
// 将选取的颜色赋值给canvasColor状态
this.canvasColor = e.rgba;
// 更新hex输入框的数据
this.hexValue = e.hex;
},
// 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转换为rgb
hexToRgb(hex) {
// 将hex切割为rgb数组
const hexArr = hex.match(/[\s\S]{1,2}/g) || []
// 转换为10进制数组
const rgbArr = hexArr.map(hex => parseInt(hex, 16));
return {
r: rgbArr[0],
g: rgbArr[1],
b: rgbArr[2],
a: 1,
}
},
// 将hex值复制到剪切板
onClickCanvas() {
uni.setClipboardData({
data: this.canvasHex,
})
},
// 提交hex值
hexSubmit() {
// 预处理
let hexStr = this.hexValue.trim().replace('#', "").toLowerCase();
// 将3位hex值转化为6位hex
if (hexStr.length === 3) {
hexStr = hexStr.split("").reduce((total, current) => total + current.repeat(2), "");
}
if (hexStr.length !== 6) {
return uni.showToast({
title: "Hex色码必须为3位或6位",
icon: "none",
});
}
// 验证hex是否合法
const alphabet = "0123456789abcdef";
for (let elem of hexStr) {
if (!alphabet.includes(elem)) {
return uni.showToast({
title: "请输入正确的Hex色码",
icon: "none",
})
}
}
const rgb = this.hexToRgb(hexStr);
// 更新canvas颜色
this.canvasColor = rgb;
// 更新色盘颜色
this.$refs.colorPicker.rgba = rgb;
},
// 增加slider滑动监听方法
sliderChanging(e) {
// e.target.dataset.type对应模板中data-type中的值
// e.detail.value是滚动条对应的位置
this.canvasColor[e.target.dataset.type] = e.detail.value;
this.hexValue = '#' + this.rgbToHex(this.canvasColor);
}
},
computed: {
// computed 中的方法被称为计算属性,它会实时监听自身所依赖的状态
// 每当canvasColor发生变化时,设置canvas的颜色
canvasStyle() {
return `background: #${this.rgbToHex(this.canvasColor)}`
},
// 设置canvas的文本颜色
// 使其根据hex颜色的深浅自动变化
canvasHexStyle() {
for (let key in this.canvasColor) {
if (this.canvasColor[key] >= 130) {
return "color: black";
}
return "color: white";
}
},
// 设置canvas的hex文本(16进制表示)
canvasHex() {
return "#" + this.rgbToHex(this.canvasColor);
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 10px;
}
.padding-10 {
padding: 10px;
}
.canvas {
height: 80px;
width: 100%;
margin-bottom: 10px;
border-radius: 10px;
border-color: #484848;
border-style: dashed;
}
.form {
display: flex;
flex-direction: row;
align-items: center;
}
.padding-r-10 {
padding-right: 10px;
}
.input-title {
font-size: 14px;
color: gray;
font-weight: 700;
}
.card-title {
padding-top: 5px;
}
slider {
touch-action: none;
}
</style>