Skip to content

ColorPicker 颜色选择器 ​

基础用法 ​

弹出式颜色选择器,用于在底部抽屉中完成颜色选取与确认。

  • 支持面板二维取色、色相 / 透明度滑块,以及 HEX / RGBA / HSB / HSL 四种格式输入
  • 内置预设颜色区,预设区与扩展区均可用插槽整体替换
  • 打开状态下,外部修改绑定值会实时同步到取色面板

确定后写入

仅点击“确定”才将颜色值写入 v-model,点击“取消”或关闭时丢弃本次修改

vue
<template>
	<sn-button type="primary" text="打开颜色选择器" @click="openPicker"></sn-button>
	<sn-color-picker ref="picker" v-model="color" title="选择颜色" @confirm="onConfirm"></sn-color-picker>
</template>

<script lang="ts" setup>

	const picker = ref<SnColorPickerComponentPublicInstance | null>(null)
	const color = ref<string>('#F5222D')

	function openPicker() {
		picker.value?.$callMethod('open')
	}

	function onConfirm(value: string) {
		console.log(value)
	}
</script>

更多演示请下载 demo 查看

实现原理 ​

弹出式部分基于 sn-drawer 底部抽屉封装,内部嵌入 sn-color-picker-view。

遮罩与面板在首次打开时挂载,与其他 Picker 保持一致,关闭后保留节点;不再预挂载固定定位面板,以规避首次显示时的层级异常。此挂载策略不影响独立使用的 sn-color-picker-view。

格式下拉菜单属于嵌套弹层:打开时使用高于颜色选择器的动态层级,遮罩拦截底层触摸滚动;点击格式选项切换输入格式,点击菜单外区域仅关闭格式菜单,不关闭颜色选择器。

拖动取色时面板仅更新饱和度与亮度;拖动到边界时保持当前色相,亮度降为 0 时色相滑块不会跳回红色端点;手指越过面板进入色相条仍保持原色相,色相条右端保持在 360° 位置。

注意事项 ​

标题默认居中显示;取消 / 确定按钮在未传入文案时自动使用当前语言的默认文案。

属性 ​

参数说明类型默认值可选值
v-model绑定的颜色值String#F5222D-
disabled是否禁用(取色、输入、按钮均不可用)Booleanfalsetrue | false
height弹出抽屉的高度String | Number620px-
maskClose点击遮罩是否可关闭Booleantruetrue | false
maskOpacity遮罩透明度Number0.4-
preventBack是否阻止返回键关闭Booleanfalsetrue | false
title标题,为空时不显示String''-
showClose是否显示右上角关闭按钮Booleantruetrue | false
showAlpha是否显示透明度滑块与透明度输入Booleantruetrue | false
showPresets是否显示预设颜色区域Booleantruetrue | false
format初始输入格式Stringhexhex | rgba | hsb | hsl
presetTitle预设颜色区域标题String内置颜色-
presetColors自定义预设颜色,二维数组(每行一组);使用内置色板Array<Array<String>>--
panelHeight取色面板高度String | Number260px-
showCancel是否显示取消按钮Booleantruetrue | false
showConfirm是否显示确定按钮Booleantruetrue | false
cancelText取消按钮文字String取消-
confirmText确定按钮文字String确定-
customStyle根节点自定义样式SnStyleValue''-
headerStyle标题栏自定义样式SnStyleValue''-
headerClass样式类String''-
titleStyle标题文字自定义样式SnStyleValue''-
titleClass样式类String''-
closeButtonStyle关闭按钮自定义样式SnStyleValue''-
closeButtonClass样式类String''-
actionsStyle底部按钮区域自定义样式SnStyleValue''-
actionsClass样式类String''-
cancelButtonStyle取消按钮自定义样式SnStyleValue''-
cancelButtonClass样式类String''-
confirmButtonStyle确定按钮自定义样式SnStyleValue''-
confirmButtonClass样式类String''-
viewStyle透传至内部 sn-color-picker-view 根节点的自定义样式SnStyleValue''-
viewClass样式类String''-
panelStyle透传至内部 sn-color-picker-view,取色面板自定义样式SnStyleValue''-
panelClass样式类String''-
thumbClass透传至内部 sn-color-picker-view,取色面板指示圆点样式类String''-
slidersStyle透传至内部 sn-color-picker-view,滑块容器自定义样式SnStyleValue''-
slidersClass样式类String''-
hueStyle透传至内部 sn-color-picker-view,色相滑块自定义样式SnStyleValue''-
hueClass样式类String''-
alphaStyle透传至内部 sn-color-picker-view,透明度滑块自定义样式SnStyleValue''-
alphaClass样式类String''-
sliderThumbClass透传至内部 sn-color-picker-view,滑块指示圆点样式类String''-
inputRowStyle透传至内部 sn-color-picker-view,格式与数值输入行自定义样式SnStyleValue''-
inputRowClass样式类String''-
fieldsStyle透传至内部 sn-color-picker-view,数值输入区域自定义样式SnStyleValue''-
fieldsClass样式类String''-
selectStyle透传至内部 sn-color-picker-view,格式下拉选择自定义样式SnStyleValue''-
selectClass样式类String''-
inputStyle透传至内部 sn-color-picker-view,数值输入框自定义样式SnStyleValue''-
inputClass样式类String''-
presetsStyle透传至内部 sn-color-picker-view,预设颜色区域自定义样式SnStyleValue''-
presetsClass样式类String''-
presetTitleStyle透传至内部 sn-color-picker-view,预设颜色标题自定义样式SnStyleValue''-
presetTitleClass样式类String''-
presetGridStyle透传至内部 sn-color-picker-view,预设颜色网格自定义样式SnStyleValue''-
presetGridClass样式类String''-
presetItemStyle透传至内部 sn-color-picker-view,预设颜色块自定义样式SnStyleValue''-
presetItemClass样式类String''-

事件 ​

名称类型说明
change(value: string) => Void点击确定写入颜色值时触发,与 v-model 同步
confirm(value: string) => Void点击确定时触发,携带确认后的颜色值
cancel() => Void点击取消时触发
open() => Void选择器打开(动画结束)时触发
close() => Void选择器关闭(动画结束)时触发
clickoverlay() => Void点击遮罩时触发

方法 ​

名称参数返回值描述
open--打开颜色选择器,以当前 v-model 值作为初始颜色
close--关闭颜色选择器,不写入颜色值

插槽 ​

名称说明作用域
preset替换「内置颜色」预设区域内容;未传入时渲染预设颜色网格(预设标题与色块),showPresets 为 false 时不显示该区域color:当前颜色值
extra预设颜色区域下方的扩展区域,可放置自定义内容(如自定义色板);未传入时不渲染color:当前颜色值

extra 插槽可作为“自定义色板”使用:点击色点直接修改 v-model(打开状态下会同步到取色面板):

vue
<template>
	<sn-color-picker ref="picker" v-model="color" title="选择颜色">
		<template #extra="slotProps">
			<view class="my-palette">
				<view v-for="(c, i) in palette" :key="i" class="my-palette-dot" :style="dotStyle(c, slotProps.color)"
					@click="onPick(c)"></view>
			</view>
		</template>
	</sn-color-picker>
</template>

<script lang="ts" setup>
	const picker = ref<SnColorPickerComponentPublicInstance | null>(null)
	const color = ref<string>('#F5222D')
	const palette = ref<string[]>(['#1F1F1F', '#EF4444', '#3B82F6'])

	function onPick(c: string) {
		color.value = c
	}

	function dotStyle(c: string, current: any): string {
		const ring = current == c ? 'var(--sn-primary)' : 'var(--sn-line)'
		return `width:28px;height:28px;border-radius:14px;margin-right:8px;background-color:${c};border:2px solid ${ring};`
	}
</script>

以下属性属于 sn-color-picker-view(颜色选择容器),可直接嵌入页面单独使用,不依赖弹出层:

vue
<template>
	<sn-color-picker-view v-model="color" @change="onChange"></sn-color-picker-view>
</template>

<script lang="ts" setup>
	const color = ref<string>('#F5222D')

	function onChange(value: string) {
		console.log(value)
	}
</script>

sn-color-picker-view 属性 ​

参数说明类型默认值可选值
v-model绑定的颜色值String#F5222D-
active是否激活;为 false 时不响应外部颜色值变化与交互Booleantruetrue | false
disabled是否禁用(拖动取色与输入均不可用)Booleanfalsetrue | false
showAlpha是否显示透明度滑块与透明度输入Booleantruetrue | false
showPresets是否显示预设颜色区域Booleantruetrue | false
format初始输入格式Stringhexhex | rgba | hsb | hsl
presetTitle预设颜色区域标题String内置颜色-
presetColors自定义预设颜色,二维数组(每行一组);使用内置色板Array<Array<String>>--
panelHeight取色面板高度String | Number300px-
sliderHeight滑块轨道高度String | Number$24-
sliderSpacing滑块、输入行、预设区域之间的间距String | Number$12-
borderRadius取色面板与滑块的圆角大小String | Number$10-
thumbSize取色面板指示圆点大小String | Number$30-
customStyle根节点自定义样式SnStyleValue''-
customClass根节点自定义样式类String''-
panelStyle取色面板自定义样式SnStyleValue''-
panelClass样式类String''-
thumbClass取色面板指示圆点样式类String''-
slidersStyle滑块容器自定义样式SnStyleValue''-
slidersClass样式类String''-
hueStyle色相滑块自定义样式SnStyleValue''-
hueClass样式类String''-
alphaStyle透明度滑块自定义样式SnStyleValue''-
alphaClass样式类String''-
sliderThumbClass滑块指示圆点样式类String''-
inputRowStyle格式与数值输入行自定义样式SnStyleValue''-
inputRowClass样式类String''-
fieldsStyle数值输入区域自定义样式SnStyleValue''-
fieldsClass样式类String''-
selectStyle格式下拉选择自定义样式SnStyleValue''-
selectClass样式类String''-
inputStyle数值输入框自定义样式SnStyleValue''-
inputClass样式类String''-
presetsStyle预设颜色区域自定义样式SnStyleValue''-
presetsClass样式类String''-
presetTitleStyle预设颜色标题自定义样式SnStyleValue''-
presetTitleClass样式类String''-
presetGridStyle预设颜色网格自定义样式SnStyleValue''-
presetGridClass样式类String''-
presetItemStyle预设颜色块自定义样式SnStyleValue''-
presetItemClass样式类String''-

sn-color-picker-view 事件 ​

名称类型说明
change(value: string) => Void拖动取色、修改数值输入、点击预设颜色时触发,携带当前颜色值

sn-color-picker-view 方法 ​

名称参数返回值描述
refresh--重新测量取色面板与滑块位置并同步显示(一般无需手动调用)

sn-color-picker-view 插槽 ​

名称说明作用域
preset替换「内置颜色」预设区域内容;未传入时渲染预设颜色网格(预设标题与色块),showPresets 为 false 时不显示该区域color:当前颜色值
extra预设颜色区域下方的扩展区域,可放置自定义内容(如自定义色板);未传入时不渲染color:当前颜色值

使用 MIT 协议