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
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>
|
|
|