Почему HTML считает «chucknorris» цветом?


7490

Почему некоторые случайные строки создают цвета, когда вводятся в качестве фоновых цветов в HTML? Например:

<body bgcolor="chucknorris"> test </body>

... создает документ с красным фоном во всех браузерах и платформах.

Интересно, chucknorriчто и красный фон, chucknorrи желтый фон.

Что тут происходит?


154
В качестве примечания: не используйте bgcolor. Используйте CSS background.
Джон Дворжак

48
Почему вы хотите добавить цвет фона chucknorris? Какой был ожидаемый цвет?
MasterFly

107
@masterFly: я не знаю, почему мой комментарий под принятым ответом был удален за то, что он «не конструктивен», потому что он отвечает на ваш вопрос довольно хорошо: люди постоянно экспериментируют с этими вещами. Мне было всего 10 лет, когда я обнаружил это, и все, что я делал в то время, было возиться и смотреть, что случилось. У вас не всегда должна быть практическая причина что-то делать, особенно такая легкомысленная, как эта.
BoltClock

49
и <body bgcolor="stevensegal">тест </ body> зеленый
Крис

4
@BenDaggers Пожалуйста, прочитайте историю изменений, прежде чем делать другое редактирование. CSS тег не имеет никакого отношения и уже дважды удален.
Гонки

Ответы:


6883

Это пережиток дней Netscape:

Недостающие цифры обрабатываются как 0 [...]. Неправильная цифра просто интерпретируется как 0. Например, значения # F0F0F0, F0F0F0, F0F0F, #FxFxFx и FxFxFx являются одинаковыми.

Это из поста в блоге . Немного рассуждаю о разборе цвета в Microsoft Internet Explorer, который подробно описывает его, в том числе различную длину значений цвета и т. Д.

Если мы применяем правила по очереди из поста в блоге, мы получаем следующее:

  1. Заменить все недействительные шестнадцатеричные символы на 0

    chucknorris becomes c00c0000000
  2. Заполните следующее общее количество символов, делимое на 3 (11 -> 12)

    c00c 0000 0000
  3. Разделить на три равные группы, где каждый компонент представляет соответствующий компонент цвета цвета RGB:

    RGB (c00c, 0000, 0000)
  4. Обрезать каждый из аргументов справа вниз до двух символов

Что дает следующий результат:

RGB (c0, 00, 00) = #C00000 or RGB(192, 0, 0)

Вот пример, демонстрирующий bgcolorатрибут в действии, для создания этого «удивительного» образца цвета:

<table>
  <tr>
    <td bgcolor="chucknorris" cellpadding="8" width="100" align="center">chuck norris</td>
    <td bgcolor="mrt"         cellpadding="8" width="100" align="center" style="color:#ffffff">Mr T</td>
    <td bgcolor="ninjaturtle" cellpadding="8" width="100" align="center" style="color:#ffffff">ninjaturtle</td>
  </tr>
  <tr>
    <td bgcolor="sick"  cellpadding="8" width="100" align="center">sick</td>
    <td bgcolor="crap"  cellpadding="8" width="100" align="center">crap</td>
    <td bgcolor="grass" cellpadding="8" width="100" align="center">grass</td>
  </tr>
</table>

Это также отвечает на другую часть вопроса; почему bgcolor="chucknorr"производит желтый цвет? Хорошо, если мы применяем правила, строка выглядит так:

c00c00000 => c00 c00 000 => c0 c0 00 [RGB(192, 192, 0)]

Что дает светло-желтый цвет золота. Поскольку строка начинается с 9 символов, мы сохраняем второй символ C на этот раз, поэтому она заканчивается в конечном значении цвета.

Первоначально я столкнулся с этим, когда кто-то указал, что вы можете сделать, color="crap"и, ну, это выходит коричневым.


174
Обратите внимание, что, несмотря на то, что говорится в этом сообщении в блоге, когда вы приступаете к обработке 3-символьных строк, вы дублируете каждый символ, а не ставите 0., то есть 0F6становится #00FF66, а не #000F06.
Аарон Дюфур

634
@usr: HTML построен на преднамеренном игнорировании искаженного ввода;)
Лили Баллард

59
Вы также можете использовать мою произвольную строку для преобразования цветов CSS, чтобы получить цвет для конкретной строки. Он основан на 5 шагах для расчета цвета строки Джереми Гуделлом .
ТимПетрусский

15
Скрытая возможность для семантики? Вы можете сделать несколько страниц с ошибками с этим: <body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>Вы можете добавить div с другим фоном или что-то в этом роде, так что это не так уж эстетично.
Theraot

32
@ Theraot bgcolor="success"тоже хороший зеленый. Интересно, что эти цвета можно переопределить с помощью селекторов атрибутов / значений CSS (например, td[bgcolor="chucknorris"] {...}).
daiscog

970

Извините, что не согласен, но в соответствии с правилами парсинга устаревшего значения цвета, опубликованного @Yuhong Bao , chucknorrisНЕ приравнивается #CC0000, а скорее к #C00000очень похожему, но немного отличающемуся оттенку красного. Я использовал дополнение Firefox ColorZilla, чтобы проверить это.

Правила гласят:

  • сделайте строку длиной, кратной 3, добавив 0: chucknorris0
  • разделите строку на 3 строки одинаковой длины: chuc knor ris0
  • обрезать каждую строку до 2 символов: ch kn ri
  • сохраните шестнадцатеричные значения и добавьте 0, где это необходимо: C0 00 00

Я смог использовать эти правила, чтобы правильно интерпретировать следующие строки:

  • LuckyCharms
  • Luck
  • LuckBeALady
  • LuckBeALadyTonight
  • GangnamStyle

ОБНОВЛЕНИЕ: оригинальные ответчики, которые сказали, что цвет был с #CC0000тех пор, отредактировали свои ответы, чтобы включить исправление.


86
Я понял это, я неверно истолковал некоторые инструкции синтаксического анализа: "adamlevine" = "ada00e000e" = "ada00e000e00" = "ada0 0e00 0e00" = "ad 0e 0e" - Отлично !!
Джереми Гуделл

17
Если вам интересно, я разместил 5-шаговый алгоритм в виде ОБНОВЛЕНИЯ по аналогичному вопросу, который я разместил сегодня: stackoverflow.com/questions/12939234/…
Джереми Гуделл

18
@TimPietrusky создал этот потрясающий невероятный демонстрационный инструмент для случайных названий цветов. Просто зайдите сюда: randomstringtocsscolor.com, нажмите на поле и введите «chucknorris».
Джереми Гуделл

4
adamlevineработает в соответствии с jsfiddle.net/LdyZ8/2959, но блокируются буквы, в ada00e000eкоторые дополняется, ada00e000e00но затем сокращается до типичного шестнадцатеричного значения HEX, [ad]a0[0e]00[0e]00что делает ad0e0e, который появляется в jsfiddle выше.
Мартин

4
Было бы лучше, если бы этот ответ содержал только текущее состояние - история этого ответа и других ответов содержится в редактируемых резюме и / или комментариях.
Питер Мортенсен

397

Большинство браузеров просто игнорируют любые не шестнадцатеричные значения в вашей цветовой строке, заменяя не шестнадцатеричные цифры нулями.

ChuCknorrisпереводится как c00c0000000. На данный момент, браузер будет разделить строку на три равные части, что указывает на красный , зеленый и синие значения: c00c 0000 0000. Лишние биты в каждом разделе будут игнорироваться, в результате #c00000чего конечный результат будет красноватого цвета.

Обратите внимание, что это не относится к анализу цвета CSS, который соответствует стандарту CSS.

<p><font color='chucknorris'>Redish</font></p>
<p><font color='#c00000'>Same as above</font></p>
<p><span style="color: chucknorris">Black</span></p>


7
Хотя мне все еще интересно, почему OP говорит «в CSS», а не «в HTML» - может, они используют супер старый браузер или просто ошибаются?
Майк Кристенсен

7
Так что он, скорее всего, использует устаревший bgcolorатрибут.
animuson

12
Недопустимые символы не пропускаются, они рассматриваются как 0.
Хорошо относитесь к своим модам.

5
(Хотя этот ответ может быть мертв) предложение: используйте цвет фона, чтобы продемонстрировать цвета. Цвет текста находится на такой небольшой относительной площади, что трудно увидеть различия или сходства
Zoe

304

Браузер пытается преобразовать chucknorrisв шестнадцатеричный код цвета, потому что это недопустимое значение.

  1. Во chucknorrisвсем, кромеc недопустимого шестнадцатеричного значения.
  2. Таким образом, он преобразуется в c00c00000000 .
  3. Которая становится # c00000 , оттенок красного.

Похоже, что это проблема в первую очередь для Internet Explorer и Opera (12), так как Chrome (31) и Firefox (26) просто игнорируют это.

PS Цифры в скобках - это версии браузера, на которых я тестировал.

,

На более легкой ноте

Чак Норрис не соответствует веб-стандартам. Веб-стандарты соответствуют ему. # BADA55


298

Причина в том, что браузер не может понять это и пытается каким-то образом перевести это в то, что он может понять, и в этом случае в шестнадцатеричное значение! ...

chucknorrisначинается с cраспознавания шестнадцатеричного символа, а также преобразования всех нераспознанных символов в0 !

Так chucknorrisв шестнадцатеричном формате становится: c00c00000000все остальные символы становятся 0и cостаются там, где они есть ...

Теперь они делятся на 3 для RGB(красный, зеленый, синий) ... R: c00c, G: 0000, B:0000...

Но мы знаем, что действительный шестнадцатеричный для RGB просто 2 символа, значит R: c0, G: 00, B:00

Итак, реальный результат:

bgcolor="#c00000";

Я также добавил шаги на изображении в качестве краткого справочника для вас:

Почему HTML считает «chucknorris» цветом?


23
Это так мило объяснение: D: D: D
Доминик Бучер

2
Такое мудрое и очень простое и прямолинейное объяснение, которое я когда-либо испытывал
Саурин Вала

1
очень креативный ответ :)
ahmednawazbutt

222

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):

if (bytes_per_val > 4)
{
      bytes_per_val = 4;
}

Спасибо, вы показали мне, где находится старый исходный код Netscape ... почему его так сложно найти?
kb1000

202

Ответ:

  • Браузер попытается преобразовать chucknorris в шестнадцатеричное значение.
  • Поскольку cэто единственный действительный шестнадцатеричный символ в chucknorris , значение превращается в: c00c00000000( 0 для всех значений, которые были недействительными ).
  • Браузер затем делит результат на 3 groupds: Red = c00c, Green = 0000, Blue = 0000.
  • Так как действительные шестнадцатеричные значения для фонов html содержат только 2 цифры для каждого типа цвета ( r , g , b ), последние 2 цифры усекаются из каждой группы, оставляя значение rgb, c00000которое имеет цвет кирпично-красного тона.

22

chucknorris начинается с c , и браузер считывает его в шестнадцатеричное значение.

Потому что A, B, C, D, E и F - символы в шестнадцатеричном формате .

Браузер конвертирует chucknorris в шестнадцатеричное значение C00C00000000.

Затем C00C00000000шестнадцатеричное значение преобразуется в формат RGB (делится на 3):

C00C00000000 => R:C00C, G:0000, B:0000

Браузеру нужны только две цифры для обозначения цвета:

R:C00C, G:0000, B:0000=> R:C0, G:00, B:00=>C00000

Наконец, шоу bgcolor = C00000 в веб-браузере.

Вот пример, демонстрирующий это:

<table>
  <tr>
    <td bgcolor="chucknorris" cellpadding="10" width="150" align="center">chucknorris</td>
    <td bgcolor="c00c00000000" cellpadding="10" width="150" align="center">c00c00000000</td>
    <td bgcolor="c00000" cellpadding="10" width="150" align="center">c00000</td>
  </tr>
</table>


15

В правила разбора цветов на устаревших атрибутов включает в себя дополнительные шаги , чем те , которые упомянуты в существующих ответах. Компонент усечения до двухзначной части описывается как:

  1. Отменить все символы, кроме последних 8
  2. Сбросить ведущие нули один за другим если все компоненты имеют начальный ноль
  3. Отменить все символы, кроме первых 2

Некоторые примеры:

oooFoooFoooF
000F 000F 000F                <- replace, pad and chunk
0F 0F 0F                      <- leading zeros truncated
0F 0F 0F                      <- truncated to 2 characters from right

oooFooFFoFFF
000F 00FF 0FFF                <- replace, pad and chunk
00F 0FF FFF                   <- leading zeros truncated
00 0F FF                      <- truncated to 2 characters from right

ABCooooooABCooooooABCoooooo
ABC000000 ABC000000 ABC000000 <- replace, pad and chunk
BC000000 BC000000 BC000000    <- truncated to 8 characters from left
BC BC BC                      <- truncated to 2 characters from right

AoCooooooAoCooooooAoCoooooo
A0C000000 A0C000000 A0C000000 <- replace, pad and chunk
0C000000 0C000000 0C000000    <- truncated to 8 characters from left
C000000 C000000 C000000       <- leading zeros truncated
C0 C0 C0                      <- truncated to 2 characters from right

Ниже приведена частичная реализация алгоритма. Он не обрабатывает ошибки или случаи, когда пользователь вводит правильный цвет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.