Пользовательская палитра цветов JSCSS

Разбираемся в CSS
Ответить Пред. темаСлед. тема
Anonymous
 Пользовательская палитра цветов JS

Сообщение Anonymous »

По сути, лол, я не могу добавлять сюда видео, но с помощью палитры цветов 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Палитра цветов для веб-сборки Blazor с возможностью палитры
    Anonymous » » в форуме C#
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Пользовательская цветовая палитра в seaborn
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Настраиваемая цветовая палитра в тепловой карте Seaborn
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Палитра Windowbuilder без компонентов
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Генерация сплошных цветов с использованием линейного градиента CSS (а не плавных цветов)
    Anonymous » » в форуме CSS
    0 Ответы
    205 Просмотры
    Последнее сообщение Anonymous

Вернуться в «CSS»