Anonymous
Пользовательская палитра цветов JS
Сообщение
Anonymous » 12 май 2024, 18:01
По сути, лол, я не могу добавлять сюда видео, но с помощью палитры цветов HTML по умолчанию вы можете переместить точку палитры цветов, если мышь находится за границами поля цветов, и она перемещается против края границ, но у меня она просто останавливается перемещается и не дает хорошего результата при быстром перемещении мыши.
Я пытаюсь создать собственную палитру цветов, в которой у вас есть ползунок цветов, а затем поле выбранный цвет, и вы можете изменить его белизну и темноту, как показано здесь (например, палитра цветов Adobe xdcc):
Пример палитры цветов Adobe xdcc
[Приведенный ниже код создает это здесь][2]
Вы можете перетащить маленький кружок выбора цвета, и он изменит выбранный цвет, но при использовании холста мне не нужно, чтобы кружок выбора цвета перемещался по краям, когда мышь покидает холст, как мне хотелось бы. изменить.
HTML:
Код: Выделить всё
Document
Let's Create a Color Picker
Selected Color
CSS:
Код: Выделить всё
html, body {
width: 100%;
height: 100%;
font-family: Oxygen, sans-serif;
text-align: center; }
.container {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center; }
#color-picker {
border: .5px solid rgba(15, 15, 15, 0.2); }
.info {
width: 12em;
display: flex;
margin-left: 4em;
flex-direction: row;
justify-content: space-between; }
.selected {
width: 50px;
height: 50px;
border-radius: 100%;
border: 2px solid rgba(15, 15, 15, 0.2); }
JS:
Код: Выделить всё
class Picker {
constructor(target, width, height) {
this.target = target;
this.width = width;
this.height = height;
this.target.width = width;
this.target.height = height;
// Get context
this.context = this.target.getContext("2d");
// Circle
this.pickerCircle = { x: 10, y: 10, width: 10, height: 10 };
this.listenForEvents();
}
draw() {
}
build() {
let gradient = this.context.createLinearGradient(0, 0, this.width, 0);
//Color Stops
gradient.addColorStop(0, "rgb(255, 0, 0)");
gradient.addColorStop(0.15, "rgb(255, 0, 255)");
gradient.addColorStop(0.33, "rgb(0, 0, 255)");
gradient.addColorStop(0.49, "rgb(0, 255, 255)");
gradient.addColorStop(0.67, "rgb(0, 255, 0)");
gradient.addColorStop(0.84, "rgb(255, 255, 0)");
gradient.addColorStop(1, "rgb(255, 0, 0)");
//Fill it
this.context.fillStyle = gradient;
this.context.fillRect(0, 0, this.width, this.height);
//Apply black and white
gradient = this.context.createLinearGradient(0, 0, 0, this.height);
gradient.addColorStop(0, "rgba(255, 255, 255, 1)");
gradient.addColorStop(0.5, "rgba(255, 255, 255, 0)");
gradient.addColorStop(0.5, "rgba(0, 0, 0, 0)");
gradient.addColorStop(1, "rgba(0, 0, 0, 1)");
this.context.fillStyle = gradient;
this.context.fillRect(0, 0, this.width, this.height);
//Circle
this.context.beginPath();
this.context.arc(this.pickerCircle.x, this.pickerCircle.y, this.pickerCircle.width, 0, Math.PI * 2);
this.context.strokeStyle = "black";
this.context.stroke();
this.context.closePath();
}
listenForEvents() {
let isMouseDown = false;
const onMouseDown = (e) => {
this.build();
let currentX = e.clientX - this.target.offsetLeft;
let currentY = e.clientY - this.target.offsetTop;
this.pickerCircle.x = currentX;
this.pickerCircle.y = currentY;
isMouseDown = true;
}
const onMouseMove = (e) => {
if(isMouseDown) {
this.build();
let currentX = e.clientX - this.target.offsetLeft;
let currentY = e.clientY - this.target.offsetTop;
this.pickerCircle.x = currentX;
this.pickerCircle.y = currentY;
}
}
const onMouseUp = () => {
isMouseDown = false;
}
//Register
this.target.addEventListener("mousedown", onMouseDown);
this.target.addEventListener("mousemove", onMouseMove);
this.target.addEventListener("mousemove", () => this.onChangeCallback(this.getPickedColor()));
document.addEventListener("mouseup", onMouseUp);
}
getPickedColor() {
let imageData = this.context.getImageData(this.pickerCircle.x, this.pickerCircle.y, 1, 1);
return { r: imageData.data[0], g: imageData.data[1], b: imageData.data[2] };
}
onChange(callback) {
this.onChangeCallback = callback;
}
}
let picker = new Picker(document.getElementById("color-picker"), 250, 220); picker.build();
picker.onChange((color) => {
let selected = document.getElementsByClassName("selected")[0];
selected.style.backgroundColor = `rgb(${color.r}, ${color.g}, ${color.b})`; });
[1]: https://i.stack.imgur.com/MQsjs.png
[2]: https://i.stack.imgur.com/krEYa.png
Заранее спасибо!
Подробнее здесь:
https://stackoverflow.com/questions/625 ... lor-picker
1715526119
Anonymous
[b]По сути, лол, я не могу добавлять сюда видео, но с помощью палитры цветов HTML по умолчанию вы можете переместить точку палитры цветов, если мышь находится за границами поля цветов, и она перемещается против края границ, но у меня она просто останавливается перемещается и не дает хорошего результата при быстром перемещении мыши.[/b] Я пытаюсь создать собственную палитру цветов, в которой у вас есть ползунок цветов, а затем поле выбранный цвет, и вы можете изменить его белизну и темноту, как показано здесь (например, палитра цветов Adobe xdcc): Пример палитры цветов Adobe xdcc [Приведенный ниже код создает это здесь][2] Вы можете перетащить маленький кружок выбора цвета, и он изменит выбранный цвет, но при использовании холста мне не нужно, чтобы кружок выбора цвета перемещался по краям, когда мышь покидает холст, как мне хотелось бы. изменить. HTML: [code] Document Let's Create a Color Picker Selected Color [/code] CSS: [code] html, body { width: 100%; height: 100%; font-family: Oxygen, sans-serif; text-align: center; } .container { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; } #color-picker { border: .5px solid rgba(15, 15, 15, 0.2); } .info { width: 12em; display: flex; margin-left: 4em; flex-direction: row; justify-content: space-between; } .selected { width: 50px; height: 50px; border-radius: 100%; border: 2px solid rgba(15, 15, 15, 0.2); } [/code] JS: [code] class Picker { constructor(target, width, height) { this.target = target; this.width = width; this.height = height; this.target.width = width; this.target.height = height; // Get context this.context = this.target.getContext("2d"); // Circle this.pickerCircle = { x: 10, y: 10, width: 10, height: 10 }; this.listenForEvents(); } draw() { } build() { let gradient = this.context.createLinearGradient(0, 0, this.width, 0); //Color Stops gradient.addColorStop(0, "rgb(255, 0, 0)"); gradient.addColorStop(0.15, "rgb(255, 0, 255)"); gradient.addColorStop(0.33, "rgb(0, 0, 255)"); gradient.addColorStop(0.49, "rgb(0, 255, 255)"); gradient.addColorStop(0.67, "rgb(0, 255, 0)"); gradient.addColorStop(0.84, "rgb(255, 255, 0)"); gradient.addColorStop(1, "rgb(255, 0, 0)"); //Fill it this.context.fillStyle = gradient; this.context.fillRect(0, 0, this.width, this.height); //Apply black and white gradient = this.context.createLinearGradient(0, 0, 0, this.height); gradient.addColorStop(0, "rgba(255, 255, 255, 1)"); gradient.addColorStop(0.5, "rgba(255, 255, 255, 0)"); gradient.addColorStop(0.5, "rgba(0, 0, 0, 0)"); gradient.addColorStop(1, "rgba(0, 0, 0, 1)"); this.context.fillStyle = gradient; this.context.fillRect(0, 0, this.width, this.height); //Circle this.context.beginPath(); this.context.arc(this.pickerCircle.x, this.pickerCircle.y, this.pickerCircle.width, 0, Math.PI * 2); this.context.strokeStyle = "black"; this.context.stroke(); this.context.closePath(); } listenForEvents() { let isMouseDown = false; const onMouseDown = (e) => { this.build(); let currentX = e.clientX - this.target.offsetLeft; let currentY = e.clientY - this.target.offsetTop; this.pickerCircle.x = currentX; this.pickerCircle.y = currentY; isMouseDown = true; } const onMouseMove = (e) => { if(isMouseDown) { this.build(); let currentX = e.clientX - this.target.offsetLeft; let currentY = e.clientY - this.target.offsetTop; this.pickerCircle.x = currentX; this.pickerCircle.y = currentY; } } const onMouseUp = () => { isMouseDown = false; } //Register this.target.addEventListener("mousedown", onMouseDown); this.target.addEventListener("mousemove", onMouseMove); this.target.addEventListener("mousemove", () => this.onChangeCallback(this.getPickedColor())); document.addEventListener("mouseup", onMouseUp); } getPickedColor() { let imageData = this.context.getImageData(this.pickerCircle.x, this.pickerCircle.y, 1, 1); return { r: imageData.data[0], g: imageData.data[1], b: imageData.data[2] }; } onChange(callback) { this.onChangeCallback = callback; } } let picker = new Picker(document.getElementById("color-picker"), 250, 220); picker.build(); picker.onChange((color) => { let selected = document.getElementsByClassName("selected")[0]; selected.style.backgroundColor = `rgb(${color.r}, ${color.g}, ${color.b})`; }); [1]: https://i.stack.imgur.com/MQsjs.png [2]: https://i.stack.imgur.com/krEYa.png [/code] Заранее спасибо! Подробнее здесь: [url]https://stackoverflow.com/questions/62553806/js-custom-color-picker[/url]