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.pswp.cn/diannao/77654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77654.shtml
英文地址,請注明出處:http://en.pswp.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…