Разница между использованием MULTIPLE атрибутов 'id' и 'class' в HTML и CSS - PullRequest
2 голосов
/ 24 марта 2012

В соответствии с принципами CSS, когда мы хотим реализовать возможность многократного использования стилей, мы должны использовать атрибут class, и когда мы знаем, что во всей структуре DOM есть уникальный элемент, мы должны использовать атрибут id для этого элемента, а затем указать стиль.

Но в эту эпоху веб-приложений структура DOM может быть слишком сложной, и существует вероятность дублирования id. Лучший пример будет #title. Его название, которое может появиться в любом месте документа. Теперь лучше всего, если я буду использовать #title или .title при определении стилей (при условии, что они появились более одного раза и имеют другого родителя), вывод, который генерирует CSS, одинаков. Этот jsfiddle поможет вам понять, что я имею в виду http://jsfiddle.net/dewbot/LGAQD/

У меня сложилось впечатление, что точно так же, как JS Renderer, CSS Parser останавливает итерацию, когда обнаруживает первый #title, но не происходит, он продолжает итерацию, пока не достигнет EOF, как class. Таким образом, возникает вопрос, почему мы должны использовать несколько class, а не id?

Ответы [ 4 ]

4 голосов
/ 24 марта 2012

Я думаю, что вы неправильно проанализировали CSS.Браузер не перебирает строку файла CSS за строкой и применяет стили к элементам файла HTML, это наоборот.Браузер анализирует HTML-код и всякий раз, когда он находит атрибут class или id, он ищет его в файлах CSS.(Это очень упрощено, но помогает понять суть).

То, что браузер отображает его правильно, если у вас несколько id s, не означает, что вы должны это делать.Стандарт ясно говорит , что id имеет , чтобы быть уникальным.

4 голосов
/ 24 марта 2012

Таким образом, возникает вопрос, почему мы должны использовать несколько class, а не id?

Поскольку в спецификации HTML так сказано , нарушение правил часто приводит к нарушению кода.

Имеет ли смысл идентифицировать несколько элементов по одному и тому же идентификатору? Думаю, нет. Вот для чего нужны классы: классифицировать похожих элементов.

Теперь лучшая часть, если я использую #title или .title при определении стилей (при условии, что они появились более одного раза и имеют другого родителя), вывод, который генерирует CSS, одинаков.

Это естественное поведение, а не ошибка в любых браузерах, которые делают это per se . Тем не менее, это не тот тип поведения, на который вы должны полагаться, поскольку он имеет дело с несоответствующей разметкой, которая обычно является плохой.

У меня сложилось впечатление, что так же, как JS Renderer, CSS Parser останавливает итерацию, когда обнаруживает первый #title, но не происходит, он продолжает итерацию, пока не достигнет EOF, как class.

Теперь это неправильно. CSS-синтаксические анализаторы выполняют селекторное сопоставление для каждого элемента : они не берут правило и обходят DOM, применяя его к любым элементам, которые ему соответствуют; вместо этого они берут каждый элемент и пытаются сопоставить его с максимально возможным количеством правил. Работая таким образом, парсер не знает , используется ли идентификатор в другом месте документа, и не заботится об этом. Это просто соответствует в соответствии с тем, что элемент говорит, что это . Этот ответ описывает его более подробно.

Пока элемент имеет определенный идентификатор, он должен совпадать с любыми селекторами идентификаторов, которые ищут этот конкретный идентификатор. Таким образом, ожидается, что парсеры будут сопоставлять любые и все элементы с данным идентификатором с одним селектором идентификатора, даже если в HTML неправильно иметь несколько элементов с одинаковым идентификатором. Другими словами, CSS не обеспечивает уникальность идентификаторов, которая требуется для HTML. Этот ответ объясняет.

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

1 голос
/ 24 марта 2012

Вы сами ответили.

CSS применяет его ко всем id и class, которые он может найти.Но JS / jQuery будет реализовывать его первым найденным.

Итак, ваш вопрос становится следующим:

Должен ли я применять одинаковые id s ко многим элементам для манипуляции JS?Ответ: Baaaaa .... D решение

Должен ли я применять одни и те же id ко многим элементам для CSS?Ответ: все еще плохо, решение!но вы реализуете эти свои правила

Вы также должны попытаться использовать правила CSS и JS, применяемые иерархически, таким образом, вы никогда не ошибетесь.Например, #Heading div#Title{css rules here} или $('#Heading div#Titles')...jQuery rules here

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

Затем попробуйте предоставить уникальный идентификатор для элемента на вашем веб-сайте / в приложении, а не в одиночномстр.Это избавит вас от многостраничных служебных сценариев, которые вы включаете в свои страницы.

Например: заголовок вверху главной страницы: #Home-Top-Heading

Надеюсь, это поможет.

0 голосов
/ 24 марта 2012

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

CSS не заботится о идентификаторах мултиплей, JavaScript заботится

http://css -tricks.com / разностной-между-ид-и-класс /

...