Лучшие практики CSS для идентификаторов и классов?

Я погрузился в книгу SitePoint, касающуюся CSS.

Что меня поразило в примерах, так это использование ID в качестве селектора CSS.

Некоторые элементы CSS-дизайна, которые я сделал, мне всегда казалось проще и универсальнее использовать Class в качестве селектора.

Может быть, это вещь .Net, потому что мы не всегда можем контролировать идентификатор элемента ...

Здесь лучше всего использовать CLASS или ID в качестве селектора?

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
39
0
26 071
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

Ответ принят как подходящий

Я думаю, они всегда используют id в примерах, потому что это менее двусмысленно. Вы знаете, что они говорят конкретно об элементе который one и его стилях.

В общем, эмпирическое правило состоит в том, что вы должны спросить себя: «Существует ли более одного элемента, для которого требуется один и тот же стиль, сейчас или в любое время в будущем?», И ответ будет даже «возможно», а затем сделать это класс.

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

Mesh 18.11.2008 17:00

Согласовано. Это может помочь выбрать имена идентификаторов, которые подразумевают уникальность, например «mainsection» или «navbar».

Nathan Long 18.11.2008 19:03

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

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

edit: и да, MS действительно наложила CSS на ASP.NET, спасибо, ребята!

@Tim Meers - значит, у вас нет проблем с искаженными селекторами идентификаторов, интерпретацией MS апскейлинга браузера, элементами управления, нарушающими семантику (так называемые CSS-дружественные адаптеры были выпущены по какой-то причине), и продолжающейся настойчивостью в продвижении встроенного стиля? Если вас это устраивает, то вам - король, но лично для меня веб-формы были мертвы с тех пор, как был выпущен MVC.

annakata 12.08.2010 12:40

Веб-формы были значительно улучшены после версии 4. Они больше не искажают html-код (включая интервалы), и теперь вы можете использовать статические идентификаторы и отключить состояние просмотра, состояние сеанса, и у вас может быть маршрутизация, как в MVC. Вы можете использовать некоторые из замечательных функций MVC или смешивать и сочетать :)

George Filippakos 29.01.2013 12:05

Практика зависит от «разрешения» того, что вы пытаетесь выбрать.

Я использую классы, когда хочу изменить целый набор элементов. Идентификаторы дают мне гораздо более детальный контроль, который иногда необходим.

Вы должны использовать «id», когда вы всегда говорите об одном (и всегда будет один) раздел вашего сайта.

В основном все сводится к семантике.

div.header

Это говорит мне о том, что вы разрешаете на своем сайте несколько «заголовков». Возможно, это подзаголовки.

div#header

Это говорит мне о том, что вы говорите об одном «разделе заголовка» в макете вашего сайта.

Обновлено: Вот полустаревшая статья о дизайне на чистом CSS ... если вы просто просканируете примеры CSS, вы увидите, почему я использую там ID: Как: чистый CSS-дизайн

Не забывайте, что класс и Я БЫ не исключают друг друга. Ничто не мешает вам иметь и то, и другое! Иногда это очень полезно, поскольку позволяет элементу наследовать общий стиль вместе с другими элементами того же класса, а также дает вам точный контроль над этим конкретным элементом. Еще один удобный метод - применить несколько классов к одному и тому же объекту (да, class = "someClass someOtherClass" вполне допустим). Например:

<style>
div.box {
float: left;
border: 1px solid blue;
padding: 1em;
}

div.wide {
width: 40em; 
}

div.narrow {
width: 10em; 
}

div#oddOneOut {
float: right;
}
</style>

<div class = "box wide">a wide box</div>
<div class = "box narrow">a narrow box</div>
<div class = "box wide" id = "oddOneOut">an odd box</div>

Теоретически также возможно сделать так, чтобы CSS применялся только к элементам, принадлежащим к нескольким классам, например. div.box.narrow {something: somevalue;}, но, к сожалению, он поддерживается не всеми браузерами. Обновление 2011: Множественные селекторы классов теперь имеют почти универсальную поддержку браузеров, так что продолжайте и используйте их!

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

Ola Tuvesson 18.11.2008 18:50

Это также хороший способ выкопать себе красивую и глубокую яму, если вы не будете осторожны. ;) Как правило большого пальца; классы (или идентификаторы в этом отношении) никогда не должны иметь имена, описывающие внешний вид, а скорее функции.

Williham Totland 10.03.2010 01:40

Есть пример того, как это приведет к «красивой и глубокой дыре»?

Ola Tuvesson 28.03.2010 18:35

Просто чтобы разогреть старую ветку: селектор div в div#oddOneOut не нужен. Поскольку атрибут я бы уникален для всей страницы, селектор #oddOneOut будет достаточно точным, чтобы соответствовать этому элементу.

matewka 18.03.2014 00:15

Правильно, имя элемента HTML в данном случае включено только для согласованности и ясности (я иногда делаю это и в производственном CSS).

Ola Tuvesson 03.08.2014 04:15

Не забывайте, что вы можете ссылка на элемент с идентификатором. Помимо других преимуществ, это может быть очень важно для доступности. Это хорошая причина, почему для таких элементов макета, как заголовок, навигация, основное содержимое, нижний колонтитул, форма поиска и т. д., Вы всегда должны использовать идентификатор вместо класса (или вместе с классом).

Идентификаторы предназначены для однозначной идентификации элементов, классы предназначены для идентификации элемента как части класса элементов.

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

Проверьте Спецификация W3C, а также страницу CSS-Обсудить по этой проблеме.

Еще один полезный ресурс - это Спецификация W3C по каскадному порядку: селекторам id присваивается десять раз вес селекторов class. Это особенно важно, если вы планируете переопределить стили в зависимости от различных сценариев или изменений состояния. Чем конкретнее исходный селектор, тем больше работы вам придется выполнить, чтобы переопределить его в дополнительных объявлениях.

Нет, не десять раз, бесконечное количество раз! Прочтите спецификацию еще раз: «Объединение трех чисел (в системе счисления с большим основанием) дает конкретность». В этом предложении «большая база» достаточно велика, только если один единственный идентификатор перекрывает любое количество классов.

Edgar Bonet 18.06.2013 14:25

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

Использование идентификаторов - это плохо, как и использование глобальных переменных в коде Visual Basic. Причина в том, что идентификаторы должны быть уникальными, что приводит к ненужной и плохой зависимости между различными независимыми частями вашего кода. Лучше использовать что-то вроде .page1 .tab1> .field1, потому что вам не нужно беспокоиться об уникальности field1 внутри tab1 или уникальности tab1 внутри page1. С идентификаторами вы должны вести реестр своих идентификаторов, чтобы контролировать и избегать конфликтов.

Используйте идентификаторы только в том случае, если вам нужно, например href = '# name' или если это требует какая-то библиотека.

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

Rob 10.03.2010 01:42

в некоторых случаях вам придется использовать идентификаторы. Если вы ВСЕГДА используете классы, вы создаете файл css с множеством и множеством классов, которые имеют только одно приложение ... что очень неэффективно и кошмар для обслуживания!

Mesh 10.03.2010 13:47

@Adrian: как использование #name делает его менее кошмарным, чем использование .name? @Rob: верно, нет различий, но преимущество в том, что вы динамически включаете одну страницу в другую, которая имеет то же имя идентификатора, или если вы объединяете компоненты страницы вместе. Как вы можете написать повторно используемый компонент с использованием идентификаторов, если вы не дублируете имя компонента внутри каждого идентификатора? А если вы дублируете, какой смысл в дереве DOM, если вы организуете собственное дерево внутри идентификаторов?

alpav 10.03.2010 21:38

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

alpav 10.03.2010 21:56

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

ghoppe 10.03.2010 22:24

Кроме того, при использовании библиотеки javascript, такой как jQuery, она использует собственный метод браузера, getElementByID (), для извлечения объекта, что приводит к более быстрому выполнению сценария, чем при использовании селектора классов.

ghoppe 10.03.2010 22:26

Наконец, ваша аналогия с глобальной переменной ошибочна. Уникальность - это особенность. Идентификатор уникален для документа и относится к определенному элементу. Вы говорите, что указатели тоже плохи?

ghoppe 10.03.2010 22:37

@ghoppe: Я согласен с производительностью, но с точки зрения организации кода идентификаторы так же плохи, как и глобальные переменные. В современных браузерах разница в скорости меньше. Использование jQuery для адресации - это хитрость, которая в будущем будет устранена с помощью встроенных реализаций браузера. Использование идентификаторов для повышения приоритетов - тоже плохой прием, это лучше и больше свободы, если вы используете дополнительные корневые элементы, например, приоритет тела div span.class1 {} выше, чем body div span. Class1 {} выше, чем body span.class1 {} выше, чем span.class1 {}. ! important тоже полезно.

alpav 10.03.2010 22:45

@ghoppe на указатели: да, указатели плохи, если вы жестко закодируете абсолютный адрес памяти в своем коде. Если вы используете относительное значение, тогда все в порядке. Любой HTML-идентификатор представляет собой абсолютный адрес памяти, если мы рассматриваем дерево DOM как память и сравниваем его с использованием класса относительно элементов DOM более высокого уровня.

alpav 10.03.2010 22:53

Я действительно упускаю вашу точку зрения. Если у меня есть собака по имени Фидо, и я хочу дать ей определенную команду, я не считаю более удобным с "точки зрения организации кода" использовать .myhouse .contents .dog {position: sit}, а не #fido {позиция: сидеть}. Использование большего количества корневых элементов просто означает больше трудностей при изменении структуры страницы. Что, если я вставлю еще один div? Теперь я должен изменить свой css, чтобы учесть это, вместо того, чтобы знать, что #fido будет сидеть правильно.

ghoppe 10.03.2010 22:56

Что касается ваших комментариев к дереву DOM и абсолютной памяти, иногда (часто?) Ваше представление уникального элемента не заботится об иерархии DOM. HTML-идентификатор не эквивалентен абсолютному адресу памяти, поскольку он не «ломается» при изменении DOM (пространства памяти).

ghoppe 10.03.2010 23:01

Если у вас есть 2 уровня DIV в теле, предназначенных только для целей определения приоритетов, вам не нужно ничего помещать между ними и телом. Таким образом, они и тело становятся контейнером, и все содержимое всегда будет ниже body> div> div.

alpav 11.03.2010 00:40

@Alpav Я собираюсь придерживаться ответа Никфа, который отмечен как правильный, а также отсылаю вас к ответу Олы ниже. Я действительно не могу понять ваш последний комментарий, за исключением того, что вы можете говорить о селекторах TYPE, а не о селекторах ID или CLASS ...

Mesh 11.03.2010 13:33

Это обсуждение продолжается здесь: stackoverflow.com/questions/2420809/…

alpav 11.03.2010 20:14

Поздно к вечеринке, но использование аналогии ghoppe .myhouse .contents .dog заставит синтаксический анализатор пройти от каждой собаки, которую он найдет, обратно в корень DOM, чтобы убедиться, что она находится в содержимом дома, а затем убедиться, что содержимое находится в моем доме (пункт о добавлении div спорный, потому что это селекторы потомков, а не дочерние селекторы). Это хит производительности? Это зависит от того, сколько владельцев собак живет в вашем районе. Но, конечно, здесь мы не обращаем внимания на скорость и эффективность.

Duncan 01.06.2010 05:45

Что касается создания зависимостей с помощью идентификатора, вы также можете заявить, что вам не следует использовать первичные ключи, потому что они создают зависимость между вашим кодом и базой данных. Наконец, идентификаторы, безусловно, имеют свое место, потому что без них мне пришлось бы адресовать этот ответ парню, который заявил об использовании исключительно классов, а не более удобной метке alpav.

Duncan 01.06.2010 05:48

@Duncan: интересный момент о первичных ключах. Я предполагаю, что если данные получены из кода или данные никогда не меняются, тогда уместно жесткое кодирование первичных ключей, в противном случае - нет. Также мне интересно, предпочитаете ли вы использовать select * from users, где id = nnn, или select * from <all tables in database>, где id = guid? Я утверждаю, что первое лучше, чем второе, точно так же, как .users> ._ nnn лучше, чем ._guid Насчет того, что "вопрос о добавлении divs спорный": div div {attr: val} имеет более высокий приоритет, чем div {attr: val}, поэтому мы может контролировать приоритеты, почему это спорный?

alpav 10.06.2010 21:25

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

alpav 10.06.2010 21:26

Пожалуйста, обратитесь к:

Не используйте селекторы идентификаторов в CSS: http://screwlewse.com/2010/07/dont-use-id-selectors-in-css/

Не использовать идентификаторы в селекторах CSS ?: http://oli.jp/2011/ids/

Другие вопросы по теме