J'ai écrit un plugin jQuery qui accepte les couleurs css pour certains de ses paramètres.
Je veux les valider. S'il s'agissait simplement d'une valeur hexadécimale ou rgb, je pourrais le faire avec une expression régulière, mais comment valider les 147 noms de couleurs valides sans gonfler le plugin?
Je me demandais s'il y avait une façon d'essayer d'appliquer un style (peut-être avec jquery) et d'attraper une erreur du navigateur s'il n'est pas valide?
Edit: powtac et Pantelis ont trouvé une solution, mais ils ont tous deux manqué les cas de bord, alors je comprend une solution complète ici:
var validateCssColour = function(colour){ var rgb = $('<div style="color:#28e32a">'); // Use a non standard dummy colour to ease checking for edge cases var valid_rgb = "rgb(40, 227, 42)"; rgb.css("color", colour); if(rgb.css('color') == valid_rgb && colour != ':#28e32a' && colour.replace(/ /g,"") != valid_rgb.replace(/ /g,"")) return false; else return true; };
Toutes les solutions publiées sur cette page sont incorrectes lorsque la chaîne en question est de la même couleur que la couleur de test. Certes, vous pourriez utiliser un choix de couleur très improbable, mais je préférerais avoir un taux de réussite de 100%.
OP a une seule faute de frappe dans son code (voir condition avec deux points) et ne teste pas "# 28e32a", de sorte que la couleur échoue, et le regex va effondrer les espaces dans la couleur, alors "# 28e 32a" (incorrectement ) passer.
Dans JavaScript normal, cela devrait avoir 100% de succès:
function validTextColour(stringToTest) { //Alter the following conditions according to your need. if (stringToTest === "") { return false; } if (stringToTest === "inherit") { return false; } if (stringToTest === "transparent") { return false; } var image = document.createElement("img"); image.style.color = "rgb(0, 0, 0)"; image.style.color = stringToTest; if (image.style.color !== "rgb(0, 0, 0)") { return true; } image.style.color = "rgb(255, 255, 255)"; image.style.color = stringToTest; return image.style.color !== "rgb(255, 255, 255)"; }
JSFiddle: http://jsfiddle.net/WK_of_Angmar/xgA5C/
Vous pouvez simplement définir la couleur dans un élément fictif, puis vérifier si la valeur de l'élément est autre chose que le blanc.
colorToTest = 'lime'; // 'lightgray' does not work for IE $('#dummy').css('backgroundColor', 'white'); $('#dummy').css('backgroundColor', colorToTest); if ($('#dummy').css('backgroundColor') != 'rgb(255, 255, 255)' || colorToTest == 'white') { alert(colorToTest+' is valid'); }
Je sais que cette question est assez ancienne, mais j'ai trouvé une solution javascript pure pour vérifier les couleurs qui semble fonctionner dans tous les navigateurs et voulait la partager
Cette fonction utilise le navigateur pour convertir n'importe quelle chaîne d'entrée en chaîne de couleur CSS (si possible)
function getColorCSS(c) { var ele = document.createElement("div"); ele.style.color = c; return ele.style.color.split(/\s+/).join('').toLowerCase(); }
Voyons la sortie de la fonction en fonction de différentes entrées …
Fondamentalement chaque fois que le navigateur ne peut pas comprendre comment rendre la chaîne d'entrée comme une couleur, une empty string
est renvoyée, ce qui rend cette fonction minuscule parfaite pour détecter les chaînes de couleurs non valides!
redd
, #f0gf0g
, #1234
, f00
, rgb(1,2)
, rgb(1,2,3.0)
, rgb(1,2,3,4)
, rgba(100,150,200)
. . . chrome
. . . Firefox
. . . Internet Explorer aqua
aqua
. . . chrome aqua
. . . Firefox aqua
. . . Internet Explorer pink
rgb(255,192,203)
. . . Chrome convertit tous les noms de couleurs html valides en format rgb sauf pour les 17 suivants et je ne suis pas vraiment sûr de pourquoi ["aqua", "black", "blue", "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", "orange", "purple", "red", "silver", "teal", "white", "yellow"]
pink
. . . Firefox pink
. . . Internet Explorer #f00
, #ff0000
, rgb(255,0,0)
rgb(255,0,0)
. . . chrome rgb(255,0,0)
. . . Firefox rgb(255,0,0)
. . . Internet Explorer rgba(255,0,0,1.0)
, rgba(255,0,0,100)
rgb(255,0,0)
. . . Chrome convertit rgba
en rgb
n'importe quand alpha est rgba
ou supérieur à 1.0
car il est totalement opaque de toute façon (probablement pour la performance) rgb(255,0,0)
. . . Firefox fait la même chose que chrome rgba(255,0,0,1)
. . . Internet Explorer convertit l'alpha param de 1.0
ou plus en 1
rgba(0,255,0,0.5)
rgba(0,255,0,0.498039)
. . . Chrome renvoie quelque chose de différent de celui des autres navigateurs (éventuellement une précision commerciale pour la performance) rgba(0,255,0,0.5)
. . . Firefox rgba(0,255,0,0.5)
. . . Internet Explorer rgba(0,0,255,0.0)
, rgba(0,0,255,-100)
rgba(0,0,255,0)
. . . Chrome convertit l'alpha param de 0.0
ou inférieur à 0
rgba(0,0,255,0)
. . . Firefox fait de même rgba(0,0,255,0)
. . . Internet Explorer fait la même chose rgba(0,0,0,0)
, rgba(0,0,0,-100)
rgba(0,0,0,0)
. . . chrome transparent
. . . Firefox convertit uniquement cette instance rgba
avec tous les paramètres définis sur 0
sur le mot transparent
(étrange) rgba(0,0,0,0)
. . . Internet Explorer hsl(180,50%,50%)
rgb(63,191,191)
. . . chrome rgb(63,191,191)
. . . Firefox hsl(180,50%,50%)
. . . Internet Explorer hsl(x,x,0%)
rgb(0,0,0)
. . . chrome rgb(0,0,0)
. . . Firefox hsl(0,0%,0%)
. . . Internet Explorer convertit toute représentation hsl du black
en cela hsl(x,x,100%)
rgb(255,255,255)
. . . chrome rgb(255,255,255)
. . . Firefox hsl(0,0%,100%)
. . . Internet Explorer convertit toute représentation hsl de white
à cette hsla(180,50%,50%,1.0)
, hsla(180,50%,50%,100)
rgba(63,191,191,1)
. . . chrome rgba(63,191,191,1)
. . . Firefox hsla(180,50%,50%,1)
. . . Internet Explorer hsla(180,50%,50%,0.5)
rgba(63,191,191,0.498039)
. . . chrome rgba(63,191,191,0.5)
. . . Firefox hsla(180,50%,50%,0.5)
. . . Internet Explorer hsla(0,0%,0%,0.0)
, hsla(0,0%,0%,-100)
rgba(0,0,0,0)
. . . chrome transparent
. . . Firefox est cohérent, mais cette conversion semble encore étrange hsla(180,50%,50%,0)
. . . Internet Explorer Wow, je peux difficilement croire que je viens de passer 2 heures à tester cette fonction dans différents navigateurs!
Je suppose que je peux aussi démo utiliser la fonction pendant que je suis là …
function getColorCSS(c) { var ele = document.createElement("div"); ele.style.color = c; return ele.style.color.split(/\s+/).join('').toLowerCase(); } function isColorValid(c) { var s = getColorCSS(c); return (s) ? true : false; } function isColorTransparent(c) { var s = getColorCSS(c); return ( s === "transparent" || s.substring(0,4) === "rgba" && +s.replace(/^.*,(.+)\)/,'$1') <= 0 || s.substring(0,4) === "hsla" && +s.replace(/^.*,(.+)\)/,'$1') <= 0 ); } function isColorWhite(c) { var s = getColorCSS(c); return [ "white", "rgb(255,255,255)", "rgba(255,255,255,1)", "hsl(0,0%,100%)", "hsla(0,0%,100%,1)" ].indexOf(s) > -1; } function isColorBlack(c) { var s = getColorCSS(c); return [ "black", "rgb(0,0,0)", "rgba(0,0,0,1)", "hsl(0,0%,0%)", "hsla(0,0%,0%,1)" ].indexOf(s) > -1; } function checkColorString() { var c = document.getElementById("c").value; if (c === "") { document.getElementsByTagName("body")[0].style.backgroundColor = 'transparent'; document.getElementById("result").innerHTML = ''; } else if (isColorValid(c)) { if (isColorTransparent(c)) { document.getElementsByTagName("body")[0].style.backgroundColor = 'transparent'; document.getElementById("result").innerHTML = '<span style="color:#dadada;">TRANSPARENT</span>'; } else if (isColorWhite(c)) { document.getElementsByTagName("body")[0].style.backgroundColor = getColorCSS(c); document.getElementById("result").innerHTML = '<span style="color:black;">WHITE</span>'; } else if (isColorBlack(c)) { document.getElementsByTagName("body")[0].style.backgroundColor = getColorCSS(c); document.getElementById("result").innerHTML = '<span style="color:white;">BLACK</span>'; } else { document.getElementsByTagName("body")[0].style.backgroundColor = getColorCSS(c); document.getElementById("result").innerHTML = getColorCSS(c); } } else { document.getElementsByTagName("body")[0].style.backgroundColor = 'transparent'; document.getElementById("result").innerHTML = '<span style="font-size:42px;color:#dadada;">☹</span>'; } } var eventList = ["change", "keyup", "paste", "input", "propertychange"]; for(event of eventList) { document.getElementById("c").addEventListener(event, function() { checkColorString(); }); }
#c { width: 300px; padding: 6px; font-family: courier; } #result { font-family: courier; font-size: 24px; padding: 12px 6px; }
<input id="c" placeholder="Enter any valid CSS color..."></input> <div id="result"></div>
Ici, http://jsfiddle.net/vSXNK/
Il est écrit à la hâte mais ça marche.
Je pense que vous pouvez utiliser le script de cette page qui fait exactement ce que vous voulez: vous passez une chaîne et essaie de trouver la couleur. D'accord, ce n'est pas exactement ce que vous vouliez faire, mais cela devrait fonctionner.
Je pense que, en tout cas, à un moment donné, vous devriez faire une recherche de nom (je ne pense pas qu'il existe un moyen magique de déterminer la valeur hexadécimale à partir de la chaîne "bleu clair"), alors arrachez le travail que quelqu'un d'autre a fait ( Le script est par Stoyan Stefanov qui est très bon à javascript, j'ai lu quelques bons livres de lui, et s'il fait une recherche, eh bien, je ne pense pas qu'il y ait une autre solution)