Ma question est: étant donné une cible de couleur RVB, quelle est la formule pour changer la couleur noire (#000
) dans cette couleur en utilisant uniquement des filtres CSS?
Une réponse pour être accepté, il serait nécessaire de fournir une fonction (dans toutes les langues) qui serait prêt à accepter la cible de la couleur comme d'un argument et retour le CSS correspondant filter
chaîne de caractères.
Le contexte pour ce qui est de la nécessité de redéfinir les couleurs de l'une SVG à l'intérieur d'un background-image
. Dans ce cas, il est à l'appui de certaines TeX mathématiques fonctionnalités de KaTeX: https://github.com/Khan/KaTeX/issues/587.
Exemple
Si la couleur cible est - #ffff00
(jaune), une bonne solution est:
filter: invert(100%) sepia() saturate(10000%) hue-rotate(0deg)
(démo)
Non-buts
- De l'Animation.
- Non CSS-filtre de solutions.
- À partir d'une autre couleur que le noir.
- Se soucier de ce qui se passe pour d'autres couleurs que le noir.
Ainsi, les résultats
Recherche par force Brute pour les paramètres d'un filtre fixe la liste: https://stackoverflow.com/a/43959856/181228
Inconvénients: inefficace, ne génère que certains des 16 777 216 couleurs possibles (676,248 avechueRotateStep=1
).Une recherche plus rapide de la solution à l'aide de SPSA: https://stackoverflow.com/a/43960991/181228 Bounty attribué
Un
drop-shadow
solution: https://stackoverflow.com/a/43959853/181228
Inconvénients: Ne fonctionne pas sur le Bord. Nécessite non-filter
CSS modifications mineures et de modifications HTML.
Vous pouvez toujours obtenir un Accepté de répondre en soumettant un non par force brute solution!
Ressources
-
Comment
hue-rotate
etsepia
sont calculés: https://stackoverflow.com/a/29521147/181228 Exemple Ruby mise en œuvre:LUM_R = 0.2126; LUM_G = 0.7152; LUM_B = 0.0722 HUE_R = 0.1430; HUE_G = 0.1400; HUE_B = 0.2830 def clamp(num) [0, [255, num].min].max.round end def hue_rotate(r, g, b, angle) angle = (angle % 360 + 360) % 360 cos = Math.cos(angle * Math::PI / 180) sin = Math.sin(angle * Math::PI / 180) [clamp( r * ( LUM_R + (1 - LUM_R) * cos - LUM_R * sin ) + g * ( LUM_G - LUM_G * cos - LUM_G * sin ) + b * ( LUM_B - LUM_B * cos + (1 - LUM_B) * sin )), clamp( r * ( LUM_R - LUM_R * cos + HUE_R * sin ) + g * ( LUM_G + (1 - LUM_G) * cos + HUE_G * sin ) + b * ( LUM_B - LUM_B * cos - HUE_B * sin )), clamp( r * ( LUM_R - LUM_R * cos - (1 - LUM_R) * sin ) + g * ( LUM_G - LUM_G * cos + LUM_G * sin ) + b * ( LUM_B + (1 - LUM_B) * cos + LUM_B * sin ))] end def sepia(r, g, b) [r * 0.393 + g * 0.769 + b * 0.189, r * 0.349 + g * 0.686 + b * 0.168, r * 0.272 + g * 0.534 + b * 0.131] end
Notez que l'
clamp
ci-dessus fait l'hue-rotate
de la fonction non-linéaire. Démo: Arriver à une non-couleur en niveaux de gris à partir d'une échelle de gris de la couleur: https://stackoverflow.com/a/25524145/181228
-
Une formule presque œuvres (à partir d'une question similaire):
https://stackoverflow.com/a/29958459/181228Une explication détaillée des raisons de la formule ci-dessus est faux CSS (
hue-rotate
n'est pas une véritable rotation de la teinte, mais une approximation linéaire):
https://stackoverflow.com/a/19325417/2441511