Comment faire un sélecteur de couleurs, comme on le voit sur différents sites Web où les utilisateurs peuvent faire défiler différentes couleurs et en un clic obtenir le code couleur?
J'ai essayé de faire des rangées et des colonnes mais ce n'était pas si confortable donc je veux que ce soit comme un sélecteur de couleur
Vous pouvez jeter un oeil à la boîte de couleur comment j'essaie de le faire:
J'ai traversé différentes questions mais je ne suis pas en mesure de résoudre ce problème.
Vous pouvez simplement créer un sélecteur de couleurs par <input>
avec le type comme couleur. Mais cela ne fonctionne que dans les navigateurs modernes.
<input name="Color Picker" type="color"/>
Aperçu sur https://jsfiddle.net/itsselvam/9sL7s7ox/
Comme mentionné dans les réponses précédentes, vous pouvez utiliser l'élément sélecteur de couleur HTML natif:
<input type="color" />
Si le sélecteur de couleurs natif ne répond pas à vos critères, car il a un aspect obsolète et n'est pas aussi lisse que les sélecteurs de couleurs modernes, vous pouvez utiliser l'un des centaines de sélecteurs de couleurs sur le Web. Même une simple recherche sur la page des packages NPM renverra quelques centaines de résultats.
https://www.npmjs.com/search?q=color%20picker
Si vous m'aimez, et après une longue recherche dans la bibliothèque de sélecteurs de couleurs, vous n'avez pas trouvé de sélecteur correspondant à vos critères, vous pouvez construire votre sélecteur de couleurs, ce qui ne prendra pas trop de temps comme je vais le démontrer.
Trouvez une image de roue chromatique qui sera votre sélecteur, par exemple:
(une roue chromatique plus complexe probablement nécessaire dans une application réelle)
Dans votre fichier .html, créez un élément canvas
.
<canvas id="colorCanvas" class="color-canvas" width="250" height="250"></canvas>
Donnez l'élément canvas border-radius: 50%
, cela rendra le canevas rond, donc seuls les clics à l'intérieur du cercle seront tirés et les clics dans le bord seront ignorés (nous aurons besoin d'un événement de clic dans les étapes suivantes).
Dans votre JavaScript, lancez le canevas avec votre image de sélection de couleurs et écoutez les événements de clic
function initColorPicker()
{
var canvasEl = document.getElementById('colorCanvas');
var canvasContext = canvasEl.getContext('2d');
var image = new Image(250, 250);
image.onload = () => canvasContext.drawImage(image, 0, 0, image.width, image.height);
image.src = "./images/myColorPickerImage.png";
canvasEl.onclick = function(mouseEvent)
{
var imgData = canvasContext.getImageData(mouseEvent.offsetX, mouseEvent.offsetY, 1, 1);
var rgba = imgData.data;
alert("rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ", " + rgba[3] + ")");
}
}
Vous pouvez simplement créer un sélecteur de couleurs avec le type comme couleur. Mais cela ne fonctionne que dans les navigateurs modernes.
N'UTILISEZ PAS Color Picker. Il est ultra aléatoire quant à ce qu'il fait, les anciens navigateurs le transforment en une entrée régulière, les plus récents sont aléatoires. Votre meilleur pari est de faire comme je suis et de choisir un sélecteur de couleurs Javascript ou de créer le vôtre. Je suis obligé de créer le mien car tous les sélecteurs actuels sont trop spécifiques au projet.
De plus pour la réponse de Gil Epshtain , si vous ne voulez pas charger une image, vous pouvez remplir la toile avec des dégradés
function initColorPicker() {
var canvas = document.getElementById('colorCanvas');
var canvasContext = canvas.getContext('2d');
let gradient = canvas.getContext('2d').createLinearGradient(0, 0, canvas.width, 0)
gradient.addColorStop(0, '#ff0000')
gradient.addColorStop(1 / 6, '#ffff00')
gradient.addColorStop((1 / 6) * 2, '#00ff00')
gradient.addColorStop((1 / 6) * 3, '#00ffff')
gradient.addColorStop((1 / 6) * 4, '#0000ff')
gradient.addColorStop((1 / 6) * 5, '#ff00ff')
gradient.addColorStop(1, '#ff0000')
canvas.getContext('2d').fillStyle = gradient
canvas.getContext('2d').fillRect(0, 0, canvas.width, canvas.height)
gradient = canvas.getContext('2d').createLinearGradient(0, 0, 0, canvas.height)
gradient.addColorStop(0, 'rgba(255, 255, 255, 1)')
gradient.addColorStop(0.5, 'rgba(255, 255, 255, 0)')
gradient.addColorStop(1, 'rgba(255, 255, 255, 0)')
canvas.getContext('2d').fillStyle = gradient
canvas.getContext('2d').fillRect(0, 0, canvas.width, canvas.height)
gradient = canvas.getContext('2d').createLinearGradient(0, 0, 0, canvas.height)
gradient.addColorStop(0, 'rgba(0, 0, 0, 0)')
gradient.addColorStop(0.5, 'rgba(0, 0, 0, 0)')
gradient.addColorStop(1, 'rgba(0, 0, 0, 1)')
canvas.getContext('2d').fillStyle = gradient
canvas.getContext('2d').fillRect(0, 0, canvas.width, canvas.height)
canvas.onclick = function(e) {
console.log()
var imgData = canvasContext.getImageData((e.offsetX / canvas.clientWidth) * canvas.width, (e.offsetY / canvas.clientHeight) * canvas.height, 1, 1)
var rgba = imgData.data;
var color = "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ", " + rgba[3] + ")";
console.log("%c" + color, "color:" + color)
}
}
initColorPicker()
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
html {
height: 100%;
width: 100%;
}
body {
height: 100%;
width: 100%;
margin: 0;
}
canvas {
height: 100%;
width: 100%;
}
<html>
<body>
<canvas id="colorCanvas" class="color-canvas" width="100%" height="100%"></canvas>
</body>
</html>