Comment se fait-il que certaines chaînes aléatoires produisent des couleurs lorsqu'elles sont entrées comme couleurs d'arrière-plan en HTML? Par exemple:
<body bgcolor="chucknorris"> test </body>
... produit un document avec un fond rouge sur tous les navigateurs et plates-formes.
Fait intéressant, tout en chucknorri
produisant également un fond rouge, chucknorr
produit un fond jaune.
Que se passe t-il ici?
html
browser
background-color
user456584
la source
la source
bgcolor
. Utilisez CSSbackground
.chucknorris
? Quelle était la couleur attendue?<body bgcolor="stevensegal">
test </body> est vertRéponses:
C'est un souvenir des jours Netscape:
Il s'agit du blog Un petit coup de gueule sur l'analyse des couleurs de Microsoft Internet Explorer qui le couvre en détail, y compris les longueurs variables des valeurs de couleur, etc.
Si nous appliquons les règles tour à tour à partir du billet de blog, nous obtenons ce qui suit:
Remplacez tous les caractères hexadécimaux non valides par des 0
Remplissez le nombre total de caractères suivant divisible par 3 (11 -> 12)
Divisé en trois groupes égaux, chaque composant représentant le composant de couleur correspondant d'une couleur RVB:
Tronquez chacun des arguments de droite à deux caractères
Ce qui donne le résultat suivant:
Voici un exemple démontrant l'
bgcolor
attribut en action, pour produire cet échantillon de couleur "étonnant":Cela répond également à l'autre partie de la question; pourquoi
bgcolor="chucknorr"
produit une couleur jaune? Eh bien, si nous appliquons les règles, la chaîne est:Ce qui donne une couleur or jaune clair. Comme la chaîne commence par 9 caractères, nous gardons le deuxième C cette fois-ci donc il finit dans la valeur de couleur finale.
J'ai rencontré ce problème à l'origine lorsque quelqu'un m'a dit que vous pouviez le faire
color="crap"
et, bien, il apparaît brun.la source
0F6
devient#00FF66
, non#000F06
.<body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>
vous pouvez ajouter un div avec un autre fond ou quelque chose comme ça, donc ce n'est pas si choquant esthétiquement.bgcolor="success"
est aussi un joli vert. Fait intéressant, on peut remplacer ces couleurs en utilisant des sélecteurs d'attribut / valeur CSS (par exemple,td[bgcolor="chucknorris"] {...}
).Je suis désolé de ne pas être d'accord, mais selon les règles d'analyse d'une valeur de couleur héritée postée par @Yuhong Bao ,
chucknorris
NE correspond PAS#CC0000
, mais plutôt à#C00000
, une teinte de rouge très similaire mais légèrement différente. J'ai utilisé le module complémentaire Firefox ColorZilla pour le vérifier.Les règles stipulent:
chucknorris0
chuc knor ris0
ch kn ri
C0 00 00
J'ai pu utiliser ces règles pour interpréter correctement les chaînes suivantes:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
GangnamStyle
MISE À JOUR: Les répondeurs d'origine qui ont dit que la couleur était
#CC0000
depuis ont modifié leurs réponses pour inclure la correction.la source
adamlevine
fonctionne selon jsfiddle.net/LdyZ8/2959 mais les lettres sont bloquées dansada00e000e
lesquelles est rembourré,ada00e000e00
puis réduites à la valeur HEX typique à 6 chiffres,[ad]a0[0e]00[0e]00
ce qui rend ad0e0e qui apparaît dans le jsfiddle ci-dessus.La plupart des navigateurs ignoreront simplement toutes les valeurs NON hexadécimales dans votre chaîne de couleur, en remplaçant les chiffres non hexadécimaux par des zéros.
ChuCknorris
se traduit parc00c0000000
. À ce stade, le navigateur va diviser la chaîne en trois parties égales, ce qui indique rouge , vert et bleu valeurs:c00c 0000 0000
. Les bits supplémentaires dans chaque section seront ignorés, ce qui donne un résultat final de#c00000
couleur rougeâtre.Remarque, cela ne s'applique pas à l'analyse des couleurs CSS, qui suit la norme CSS.
la source
bgcolor
attribut obsolète .Le navigateur essaie de convertir
chucknorris
en code couleur hexadécimal, car ce n'est pas une valeur valide.chucknorris
, tout saufc
une valeur hexadécimale valide.c00c00000000
.Cela semble être un problème principalement avec Internet Explorer et Opera (12) car Chrome (31) et Firefox (26) l'ignorent.
PS Les chiffres entre parenthèses sont les versions de navigateur sur lesquelles j'ai testé.
.
Sur une note plus légère
la source
La raison en est que le navigateur ne peut pas le comprendre et essayer de le traduire en quelque sorte à ce qu'il peut comprendre et dans ce cas en une valeur hexadécimale! ...
chucknorris
commence par lec
caractère reconnu en hexadécimal, il convertit également tous les caractères non reconnus en0
!Donc
chucknorris
au format hexadécimal devient:,c00c00000000
tous les autres caractères deviennent0
etc
restent où ils sont ...Maintenant, ils sont divisés par 3 pour
RGB
(rouge, vert, bleu) ...R: c00c, G: 0000, B:0000
...Mais nous savons que l'hexadécimal valide pour RVB n'est que de 2 caractères, ce qui signifie
R: c0, G: 00, B:00
Le vrai résultat est donc:
J'ai également ajouté les étapes dans l'image comme référence rapide pour vous:
la source
La spécification WHATWG HTML possède l'algorithme exact pour analyser une valeur de couleur héritée: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
Le code Netscape Classic utilisé pour analyser les chaînes de couleurs est open source: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Par exemple, notez que chaque caractère est analysé en tant que chiffre hexadécimal, puis est décalé en un entier 32 bits sans vérifier le dépassement . Seuls huit chiffres hexadécimaux tiennent dans un entier de 32 bits, c'est pourquoi seuls les 8 derniers caractères sont pris en compte. Après avoir analysé les chiffres hexadécimaux en entiers 32 bits, ils sont ensuite tronqués en entiers 8 bits en les divisant par 16 jusqu'à ce qu'ils tiennent en 8 bits, c'est pourquoi les zéros non significatifs sont ignorés.
Mise à jour: ce code ne correspond pas exactement à ce qui est défini dans la spécification, mais la seule différence est qu'il y a quelques lignes de code. Je pense que ce sont ces lignes qui ont été ajoutées (dans Netscape 4):
la source
Réponse:
c
s'agit du seul caractère hexadécimal valide dans chucknorris , la valeur devient:c00c00000000
( 0 pour toutes les valeurs non valides ).Red = c00c
,Green = 0000
,Blue = 0000
.c00000
dont la couleur est rouge brique.la source
chucknorris commence par c et le navigateur le lit en une valeur hexadécimale.
Le navigateur convertit
chucknorris
à une valeur hexadécimale,C00C00000000
.Ensuite, la
C00C00000000
valeur hexadécimale est convertie au format RVB (divisée par 3):Le navigateur n'a besoin que de deux chiffres pour indiquer la couleur:
Enfin, affichez
bgcolor = C00000
dans le navigateur Web.Voici un exemple le démontrant:
la source
Les règles d'analyse des couleurs sur les attributs hérités impliquent des étapes supplémentaires à celles mentionnées dans les réponses existantes. Le composant tronqué à 2 chiffres est décrit comme suit:
Quelques exemples:
Voici une implémentation partielle de l'algorithme. Il ne gère pas les erreurs ou les cas où l'utilisateur entre une couleur valide.
Afficher l'extrait de code
la source