Почему некоторые случайные строки создают цвета, когда вводятся в качестве фоновых цветов в HTML? Например:
<body bgcolor="chucknorris"> test </body>
... создает документ с красным фоном во всех браузерах и платформах.
Интересно, chucknorri
что и красный фон, chucknorr
и желтый фон.
Что тут происходит?
html
browser
background-color
user456584
источник
источник
bgcolor
. Используйте CSSbackground
.chucknorris
? Какой был ожидаемый цвет?<body bgcolor="stevensegal">
тест </ body> зеленыйОтветы:
Это пережиток дней Netscape:
Это из поста в блоге . Немного рассуждаю о разборе цвета в Microsoft Internet Explorer, который подробно описывает его, в том числе различную длину значений цвета и т. Д.
Если мы применяем правила по очереди из поста в блоге, мы получаем следующее:
Заменить все недействительные шестнадцатеричные символы на 0
Заполните следующее общее количество символов, делимое на 3 (11 -> 12)
Разделить на три равные группы, где каждый компонент представляет соответствующий компонент цвета цвета RGB:
Обрезать каждый из аргументов справа вниз до двух символов
Что дает следующий результат:
Вот пример, демонстрирующий
bgcolor
атрибут в действии, для создания этого «удивительного» образца цвета:Это также отвечает на другую часть вопроса; почему
bgcolor="chucknorr"
производит желтый цвет? Хорошо, если мы применяем правила, строка выглядит так:Что дает светло-желтый цвет золота. Поскольку строка начинается с 9 символов, мы сохраняем второй символ C на этот раз, поэтому она заканчивается в конечном значении цвета.
Первоначально я столкнулся с этим, когда кто-то указал, что вы можете сделать,
color="crap"
и, ну, это выходит коричневым.источник
0F6
становится#00FF66
, а не#000F06
.<body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>
Вы можете добавить div с другим фоном или что-то в этом роде, так что это не так уж эстетично.bgcolor="success"
тоже хороший зеленый. Интересно, что эти цвета можно переопределить с помощью селекторов атрибутов / значений CSS (например,td[bgcolor="chucknorris"] {...}
).Извините, что не согласен, но в соответствии с правилами парсинга устаревшего значения цвета, опубликованного @Yuhong Bao ,
chucknorris
НЕ приравнивается#CC0000
, а скорее к#C00000
очень похожему, но немного отличающемуся оттенку красного. Я использовал дополнение Firefox ColorZilla, чтобы проверить это.Правила гласят:
chucknorris0
chuc knor ris0
ch kn ri
C0 00 00
Я смог использовать эти правила, чтобы правильно интерпретировать следующие строки:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
GangnamStyle
ОБНОВЛЕНИЕ: оригинальные ответчики, которые сказали, что цвет был с
#CC0000
тех пор, отредактировали свои ответы, чтобы включить исправление.источник
adamlevine
работает в соответствии с jsfiddle.net/LdyZ8/2959, но блокируются буквы, вada00e000e
которые дополняется,ada00e000e00
но затем сокращается до типичного шестнадцатеричного значения HEX,[ad]a0[0e]00[0e]00
что делает ad0e0e, который появляется в jsfiddle выше.Большинство браузеров просто игнорируют любые не шестнадцатеричные значения в вашей цветовой строке, заменяя не шестнадцатеричные цифры нулями.
ChuCknorris
переводится какc00c0000000
. На данный момент, браузер будет разделить строку на три равные части, что указывает на красный , зеленый и синие значения:c00c 0000 0000
. Лишние биты в каждом разделе будут игнорироваться, в результате#c00000
чего конечный результат будет красноватого цвета.Обратите внимание, что это не относится к анализу цвета CSS, который соответствует стандарту CSS.
источник
bgcolor
атрибут.Браузер пытается преобразовать
chucknorris
в шестнадцатеричный код цвета, потому что это недопустимое значение.chucknorris
всем, кромеc
недопустимого шестнадцатеричного значения.c00c00000000
.Похоже, что это проблема в первую очередь для Internet Explorer и Opera (12), так как Chrome (31) и Firefox (26) просто игнорируют это.
PS Цифры в скобках - это версии браузера, на которых я тестировал.
,
На более легкой ноте
источник
Причина в том, что браузер не может понять это и пытается каким-то образом перевести это в то, что он может понять, и в этом случае в шестнадцатеричное значение! ...
chucknorris
начинается сc
распознавания шестнадцатеричного символа, а также преобразования всех нераспознанных символов в0
!Так
chucknorris
в шестнадцатеричном формате становится:c00c00000000
все остальные символы становятся0
иc
остаются там, где они есть ...Теперь они делятся на 3 для
RGB
(красный, зеленый, синий) ...R: c00c, G: 0000, B:0000
...Но мы знаем, что действительный шестнадцатеричный для RGB просто 2 символа, значит
R: c0, G: 00, B:00
Итак, реальный результат:
Я также добавил шаги на изображении в качестве краткого справочника для вас:
источник
HTML-спецификация WHATWG имеет точный алгоритм анализа устаревшего значения цвета: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
Код Netscape Classic, используемый для разбора цветовых строк, имеет открытый исходный код: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155.
Например, обратите внимание, что каждый символ анализируется как шестнадцатеричное число, а затем сдвигается в 32-разрядное целое число без проверки на переполнение. . Только восемь шестнадцатеричных цифр вписываются в 32-разрядное целое число, поэтому учитываются только последние 8 символов. После разбора шестнадцатеричных чисел на 32-разрядные целые числа они затем усекаются до 8-разрядных целых чисел, деля их на 16, пока они не вписываются в 8-разрядные, поэтому начальные нули игнорируются.
Обновление: этот код не совсем соответствует тому, что определено в спецификации, но единственное отличие - несколько строк кода. Я думаю, что эти строки были добавлены (в Netscape 4):
источник
Ответ:
c
это единственный действительный шестнадцатеричный символ в chucknorris , значение превращается в:c00c00000000
( 0 для всех значений, которые были недействительными ).Red = c00c
,Green = 0000
,Blue = 0000
.c00000
которое имеет цвет кирпично-красного тона.источник
chucknorris начинается с c , и браузер считывает его в шестнадцатеричное значение.
Браузер конвертирует
chucknorris
в шестнадцатеричное значениеC00C00000000
.Затем
C00C00000000
шестнадцатеричное значение преобразуется в формат RGB (делится на 3):Браузеру нужны только две цифры для обозначения цвета:
Наконец, шоу
bgcolor = C00000
в веб-браузере.Вот пример, демонстрирующий это:
источник
В правила разбора цветов на устаревших атрибутов включает в себя дополнительные шаги , чем те , которые упомянуты в существующих ответах. Компонент усечения до двухзначной части описывается как:
Некоторые примеры:
Ниже приведена частичная реализация алгоритма. Он не обрабатывает ошибки или случаи, когда пользователь вводит правильный цвет.
Показать фрагмент кода
источник