vue自定义颜色选择器

vue自定义颜色选择器

效果图:
在这里插入图片描述

step0: 默认写法 调用系统自带的颜色选择器

       <input type="color">

step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue

<template><div class="container"><!-- 颜色选择器组件 --><ColorPicker v-model="selectedColor" /><!-- 新增的动态背景按钮 --><div><buttonclass="dynamic-button":style="{ backgroundColor: selectedColor }">我的背景色会变化!</button><input type="color"><p>当前选中颜色: {{ selectedColor }}</p></div></div>
</template><script>
import ColorPicker from './ColorPicker.vue'export default {components: { ColorPicker },data() {return {selectedColor: '#ff0000' // 默认颜色}}
}
</script>

step2:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\ColorPicker.vue

<template><div class="color-picker"><!-- 饱和度/明度选择区域 --><divclass="saturation":style="{ backgroundColor: `hsl(${hsv.h}, 100%, 50%)` }"@mousedown="startDrag"><divclass="selector":style="{left: `${hsv.s * 100}%`,top: `${(1 - hsv.v) * 100}%`,backgroundColor: currentColor}"></div></div><!-- 色相滑块 --><div class="hue-slider" @mousedown="startHueDrag"><divclass="hue-pointer":style="{ left: `${(hsv.h / 360) * 100}%` }"></div></div><!-- 颜色显示和输入 --><div class="color-preview" :style="{ backgroundColor: currentColor }"></div><inputv-model="hexColor"class="hex-input"placeholder="#FFFFFF"@input="handleHexInput"></div>
</template><script>
export default {props: {modelValue: String},emits: ['update:modelValue'],data() {return {hsv: { h: 0, s: 1, v: 1 },hexColor: '#ff0000',isDragging: false,isHueDragging: false}},computed: {currentColor() {return this.hsvToHex(this.hsv)}},methods: {startDrag(e) {this.isDragging = truethis.handleDrag(e)window.addEventListener('mousemove', this.handleDrag)window.addEventListener('mouseup', this.stopDrag)},startHueDrag(e) {this.isHueDragging = truethis.handleHueDrag(e)window.addEventListener('mousemove', this.handleHueDrag)window.addEventListener('mouseup', this.stopHueDrag)},handleDrag(e) {if (!this.isDragging) returnconst rect = e.target.getBoundingClientRect()const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))const y = Math.max(0, Math.min(1, (e.clientY - rect.top) / rect.height))this.hsv.s = xthis.hsv.v = 1 - ythis.updateHex()},handleHueDrag(e) {if (!this.isHueDragging) returnconst rect = e.target.getBoundingClientRect()const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))this.hsv.h = x * 360this.updateHex()},stopDrag() {this.isDragging = falsewindow.removeEventListener('mousemove', this.handleDrag)window.removeEventListener('mouseup', this.stopDrag)},stopHueDrag() {this.isHueDragging = falsewindow.removeEventListener('mousemove', this.handleHueDrag)window.removeEventListener('mouseup', this.stopHueDrag)},updateHex() {this.hexColor = this.hsvToHex(this.hsv)this.$emit('update:modelValue', this.hexColor)},handleHexInput() {if (/^#([0-9A-F]{3}){1,2}$/i.test(this.hexColor)) {this.hsv = this.hexToHsv(this.hexColor)}},// 颜色转换函数hsvToHex(hsv) {const h = hsv.h / 360let r, g, bconst i = Math.floor(h * 6)const f = h * 6 - iconst p = hsv.v * (1 - hsv.s)const q = hsv.v * (1 - f * hsv.s)const t = hsv.v * (1 - (1 - f) * hsv.s)switch (i % 6) {case 0: r = hsv.v, g = t, b = p; breakcase 1: r = q, g = hsv.v, b = p; breakcase 2: r = p, g = hsv.v, b = t; breakcase 3: r = p, g = q, b = hsv.v; breakcase 4: r = t, g = p, b = hsv.v; breakcase 5: r = hsv.v, g = p, b = q; break}return `#${[r, g, b].map(x => Math.round(x * 255).toString(16).padStart(2, '0')).join('')}`},hexToHsv(hex) {// 转换逻辑(此处省略具体实现)// 返回类似 {h: 0, s: 1, v: 1} 的HSV对象}}
}
</script><style>
.color-picker {width: 300px;padding: 20px;background: #fff;border-radius: 8px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}.saturation {position: relative;width: 100%;height: 200px;border-radius: 4px;background: linear-gradient(to top, #000, transparent),linear-gradient(to right, #fff, transparent);
}.selector {position: absolute;width: 16px;height: 16px;border: 2px solid white;border-radius: 50%;transform: translate(-8px, -8px);box-shadow: 0 1px 3px rgba(0,0,0,0.3);
}.hue-slider {position: relative;height: 12px;margin: 15px 0;background: linear-gradient(to right,#ff0000 0%,#ffff00 17%,#00ff00 33%,#00ffff 50%,#0000ff 67%,#ff00ff 83%,#ff0000 100%);border-radius: 6px;
}.hue-pointer {position: absolute;width: 16px;height: 16px;background: white;border-radius: 50%;transform: translate(-8px, -2px);box-shadow: 0 1px 3px rgba(0,0,0,0.3);
}.color-preview {width: 40px;height: 40px;border-radius: 4px;border: 1px solid #ddd;
}.hex-input {margin-left: 10px;padding: 8px;width: 100px;border: 1px solid #ddd;border-radius: 4px;
}
</style>

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录

[Python] 为企业网站应用接入钉钉鉴权&#xff0c;实现钉钉客户端内自动免登授权&#xff0c;浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限&#xff0c;没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…

[蓝桥杯 2023 国 Python A] 整数变换

P10985 [蓝桥杯 2023 国 Python A] 整数变换 题目背景 建议使用 PyPy3 提交本题。 题目描述 小蓝有一个整数 n n n。每分钟&#xff0c;小蓝的数都会发生变化&#xff0c;变为上一分钟的数 减去上一分钟的数的各个数位和。 例如&#xff0c;如果小蓝开始时的数为 23 23 …

【Linux】TCP_Wrappers+iptables实现堡垒机功能

规划 显示jumpserver的简单功能&#xff0c;大致的网络拓扑图如下 功能规划 & 拓扑结构 JumpServer&#xff08;堡垒机&#xff09;主要功能&#xff1a; 对访问目标服务器进行统一入口控制&#xff08;例如 nginx、mysql、redis&#xff09;。使用 iptables 做 NAT 转…

用HTML和CSS绘制佩奇:我不是佩奇

在这篇博客中&#xff0c;我将解析一个完全使用HTML和CSS绘制的佩奇(Pig)形象。这个项目展示了CSS的强大能力&#xff0c;仅用样式就能创造出复杂的图形&#xff0c;而不需要任何图片或JavaScript。 项目概述 这个名为"我不是佩奇"的项目是一个纯CSS绘制的卡通猪形象…

Spring 中 WebFlux 编写一个简单的 Controller

引言&#xff1a;响应式编程与 WebFlux 随着应用程序需要处理大量并发请求的情况越来越多&#xff0c;传统的 Servlet 编程模式可能无法满足高效和低延迟的需求。为了应对这种情况&#xff0c;Spring 5 引入了 WebFlux&#xff0c;一个基于响应式编程的 Web 框架&#xff0c;旨…

React十案例下

代码下载 登录模块 用户登录 页面结构 新建 Login 组件&#xff0c;对应结构: export default function Login() {return (<div className{styles.root}><NavHeader className{styles.header}>账号登录</NavHeader><form className{styles.form}>&…

100道C#高频经典面试题带解析答案——全面C#知识点总结

100道C#高频经典面试题带解析答案 以下是100道C#高频经典面试题及其详细解析&#xff0c;涵盖基础语法、面向对象编程、集合、异步编程、LINQ等多个方面&#xff0c;旨在帮助初学者和有经验的开发者全面准备C#相关面试。 &#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSD…

机动车号牌管理系统设计与实现(代码+数据库+LW)

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对机动车号牌信息管理的提升&…

VMWare Workstation Pro17.6最新版虚拟机详细安装教程(附安装包教程)

目录 前言 一、VMWare虚拟机下载 二、VMWare虚拟机安装 三、运行虚拟机 前言 VMware 是全球领先的虚拟化技术与云计算解决方案提供商&#xff0c;通过软件模拟计算机硬件环境&#xff0c;允许用户在一台物理设备上运行多个独立的虚拟操作系统或应用。其核心技术可提升硬件…

DeepSeek的神经元革命:穿透搜索引擎算法的下一代内容基建

DeepSeek的神经元革命&#xff1a;穿透搜索引擎算法的下一代内容基建 ——从语义网络到价值共识的范式重构 一、搜索引擎的“内容饥渴症”与AI的基建使命 2024年Q1数据显示&#xff0c;百度索引网页总数突破3500亿&#xff0c;但用户点击集中在0.78%的高价值页面。这种“数据…

docker安装nginx,基础命令,目录结构,配置文件结构

Nginx简介 Nginx是一款轻量级的Web服务器(动静分离)/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占有内存少&#xff0c;并发能力强. &#x1f517;官网 docker安装Nginx &#x1f433; 一、前提条件 • 已安装 Docker&#xff08;dock…

Python Lambda表达式详解

Python Lambda表达式详解 1. Lambda是什么&#xff1f; Lambda是Python中用于创建匿名函数&#xff08;没有名字的函数&#xff09;的关键字&#xff0c;核心特点是简洁。它适用于需要临时定义简单函数的场景&#xff0c;或直接作为参数传递给高阶函数&#xff08;如map()、f…

基础知识补充篇:什么是DAPP前端连接中的provider

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读352次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…

P1115 最大子段和

P1115 最大子段和 - 洛谷 题目描述 给出一个长度为 n 的序列 a&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度 n。 第二行有 n 个整数&#xff0c;第 i 个整数表示序列的第 i 个数字 aᵢ。 输出格式 输出一…

用实体识别模型提取每一条事实性句子的关键词(实体),并保存到 JSON 文件中

示例代码&#xff1a; # Generate Keywords import torch import os from tqdm import tqdm import json import nltk import numpy as npfrom span_marker import SpanMarkerModelmodel SpanMarkerModel.from_pretrained("tomaarsen/span-marker-mbert-base-multinerd&…

E8流程多行明细行字符串用I分隔,赋值到主表

需求&#xff1a;明细行摘要字段赋值到主表隐藏字段&#xff0c;隐藏摘要字段在标题中显示 代码如下&#xff0c;代码中的获取字段名获取方式&#xff0c;自行转换成jQuery("#fieldid").val()替换。 //1:参数表单id 2:流程字段名 3:0代表主表&#xff0c;1代表明细…

优化你的 REST Assured 测试:设置默认主机与端口、GET 请求与断言

REST Assured 是一个功能强大的 Java 库&#xff0c;用于测试 RESTful Web 服务。它简化了 API 测试流程&#xff0c;提供了一整套用于高效验证响应的工具。在本篇博客中&#xff0c;我们将深入探讨几个核心概念&#xff0c;包括如何设置默认主机和端口、如何发起 GET 请求以及…

3.1.3.4 Spring Boot使用使用Listener组件

在Spring Boot中&#xff0c;使用Listener组件可以监听和响应应用中的各种事件。首先&#xff0c;创建自定义事件类CustomEvent&#xff0c;继承自ApplicationEvent。然后&#xff0c;创建事件监听器CustomEventListener&#xff0c;使用EventListener注解标记监听方法。接下来…

【 vue + js 】引入图片、base64 编译显示图片

一、引入普通图片 1、代码示例&#xff1a; <div class"question"><!-- 错误写法 --><el-empty image"../assets/noinformation.svg" description"暂无问卷"><el-button type"primary">按钮</el-button&…

JVM 之 String 引用机制解析:常量池、堆内存与 intern 方法

关于常量池中的String类型的数据&#xff0c;在JDK6中只可能是对象&#xff0c;在JDK7中既可以是对象也可以是引用 案例一&#xff1a; String s1 new String("1"); String s2 "1"; System.out.println(s1 s2);s1: 执行 new String("1")&am…