Если следовать технической документации HTML-стандартов:
Атрибуты ID и NAME должны начинаться из букв латинского алфавита ([A-Za-z]), и кроме этих символов могут содержать цифры ([0-9]), дефисы («-«), знак подчёркивания («_»), двоеточие («:»), и точку («.»).
Черновики HTML5, которые уже сегодня работают, ещё менее требовательны, в них упомянуто, что ID должен содержать по крайней мере один символ и не должен содержать ни одного пробела.
Однако, как показывает практика, Вам лучше сильнее ограничить себя в символах, если Вы хотите, чтобы Ваши документы корректно поддерживались разными браузерами, CSS-редакторами и JavaScript-фреймворками. В частности, в jQuery есть проблемы при работе с теми ID, которые содержат точки и двоеточия.
Есть ещё одна тонкость — одни браузеры чувствуют разницу между большим и маленьким регистром символов в ID-атрибутах, в то время как другие плюют на регистр. Это значит, что если Вы напишете
в своем HTML и #FirstName { color: red }
(то есть первая буква большая) в CSS, некоторые проблемные браузеры не окрасят этот DIV в красный цвет. Но поскольку оба выражения используют валидные символы в ID, то валидатор не выдаст никаких предупреждений.
Я веду к тому, что Вы можете избежать этой проблемы, если будете внимательно относиться к вопросу именования атрибутов. Например, если Вы ограничите себя исключительно символами нижнего регистра и всегда будете разделять слова либо только дефисом, либо только подчеркиванием, тогда у Вас будет легкий для запоминания образец. И Вам никогда не придётся вспоминать, как Вы там написали, «firstName» или «FirstName», потому что Вы будете знать наверняка, что надо писать только «first_name».
Кроме всего вышесказанного, стоит отметить ещё один нюанс, который в некоторых ситуациях может иметь большое значение. Это касается совместного использования кода: если Вы знаете, что Ваш код будет редактировать кто-то другой, то лучше ограничьте себя исключительно символами нижнего регистра и дефисами (ну и цифрами при необходимости). Конечно, это правило является негласным, если вообще есть такое правило, но в коде, написано для общего доступа, чаще используют именно такой шаблон именований.