Использовать имена HTML-тэга, классы или идентификаторы в CSS?

Оба делают то же, но каждый использует ссылки, и каждый использует указатели.

См. мой ответ здесь для всестороннего списка всех различий .

7
задан Community 23 May 2017 в 11:33
поделиться

11 ответов

В общем, вы должны быть настолько конкретны, насколько требует предмет .

Нет общего правила, это зависит от рассматриваемого стиля.

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

Лучшее руководство, которое я всегда предлагаю, - это попробовать думать о CSS в терминах объектно-ориентированного подхода: селекторы классов сопоставляются с интерфейсами больше или меньше, теги сопоставляются с классами, а селекторы идентификаторов сопоставляются с экземплярами. Следовательно, решите, действительно ли стиль, который вы хотите применить, применим к этой вещи, всем подобным вещам или ко всему, что этого хочет.

Я также настоятельно рекомендую вам использовать высокоуровневые идентификаторы в элементах оболочки, чтобы вы могли писать селекторы в пространство имен, такое как мода (например, #foo .bar , #foo .baz , где #foo является уникальным для страницы или набора дизайнов страниц), которое позволяет вам как уровень специфичности, который снижает загрязнение кросс-дизайна, так и уровень универсальности, который позволяет максимально эффективно использовать каскадное повторное использование CSS.

Лучшее из обоих миров.

baz , где #foo уникален для страницы или набора дизайнов страниц), что позволяет вам как уровень специфичности, который снижает загрязнение кросс-дизайна, так и уровень универсальности, который позволяет вам максимально использовать каскадное повторное использование CSS.

Лучшее из обоих миров.

baz , где #foo уникален для страницы или набора дизайнов страниц), что позволяет вам как уровень специфичности, который снижает загрязнение кросс-дизайна, так и уровень универсальности, который позволяет вам максимально использовать каскадное повторное использование CSS.

Лучшее из обоих миров.

16
ответ дан 6 December 2019 в 06:03
поделиться

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

  • #idName для уникальных элементов на странице. Хорошими примерами являются #header и #footer
  • TAGNAME для стилизации страницы общего назначения.
  • TAG.classname и .classname для исключений / отменяет указанные выше правила.

И не забывайте об использовании расширенных селекторов. Плохой пример:

<style>
    H1{ font-size: 200%; color: #008; }
    #mainMenu { color: #800; }
    .in_the_menu { color: #800; font-size: 150%; }
</style>

<h1>Hello World!</h1>
<div id="mainMenu">
    <h1 class="in_the_menu">My Menu</h1>
</div>

То же самое могло быть достигнуто с помощью:

<style>
    H1{ font-size: 200%; color: #008; }
    #mainMenu { color: #800; }
    #mainMenu H1 { color: #800; font-size: 150%; }
</style>

<h1>Hello World!</h1>
<div id="mainMenu">
    <h1>My Menu</h1>
</div>

Второй пример избавляется от лишнего атрибута "class" в элементе H1 в div "mainMenu". Это дает два важных преимущества:

  1. HTML-код меньше и чище
  2. Вы с меньшей вероятностью забудете добавить атрибут class

Если вы хорошо позаботитесь о своем CSS, и использовать надлежащие расширенные селекторы, вы можете почти полностью исключить классы CSS. И сохраните их только для исключений / переопределений.

Возьмем этот пример, который рисует поля с заголовками:

#content H2{
   border: 1px solid #008789;
   padding: 0em 1em;
   margin: 0.2em 0em;
   margin-bottom: 1em;
   font-size: 100%;
   background: #cccb79
}

#content H2 + DIV{
   margin-top: -1em;
   border-left: 1px solid #008789;
   border-right: 1px solid #008789;
   border-bottom: 1px solid #008789;
   margin-bottom: 1em;
}

Теперь, как только вы выполните H2 с DIV в Элемент #content , у вас хорошая коробка. остальные DIV и H2 остаются в покое:

<div id="content">

    <h2>Hello Box!</h2>
    <div>Some text</div>

    <div>Some more text</div>

    <div>Some more text</div>

    <h2>And another title</h2>

</div>

Если вы правильно понимаете эти правила, вам вряд ли когда-либо понадобятся классы, и вы сможете работать только с идентификаторами и именами TAG. И, как дополнительный бонус, ваш HTML будет намного удобнее читать и поддерживать.

как только вы последуете за H2 с DIV в элементе #content , у вас будет красивый прямоугольник. остальные DIV и H2 остаются в покое:

<div id="content">

    <h2>Hello Box!</h2>
    <div>Some text</div>

    <div>Some more text</div>

    <div>Some more text</div>

    <h2>And another title</h2>

</div>

Если вы правильно понимаете эти правила, вам вряд ли когда-либо понадобятся классы, и вы сможете работать только с идентификаторами и именами TAG. И, как дополнительный бонус, ваш HTML будет намного удобнее читать и поддерживать.

как только вы последуете за H2 с DIV в элементе #content , у вас будет красивый прямоугольник. другие DIV и H2 остаются в покое:

<div id="content">

    <h2>Hello Box!</h2>
    <div>Some text</div>

    <div>Some more text</div>

    <div>Some more text</div>

    <h2>And another title</h2>

</div>

Если вы правильно понимаете эти правила, вам вряд ли когда-либо понадобятся классы, и вы сможете работать только с идентификаторами и именами TAG. И, как дополнительный бонус, ваш HTML будет намного удобнее читать и поддерживать.

4
ответ дан 6 December 2019 в 06:03
поделиться

вам следует использовать селектор, лучше всего описывающий ваши правила

  • id: когда вы хотите выбрать один единственный элемент

  • .classname: когда вы хотите стилизовать элементы независимо от их тега
  • tag.classname: если вы хотите стилизовать только теги с заданным классом
  • tag tag tag: если вы хотите стилизовать все подэлементы тега
3
ответ дан 6 December 2019 в 06:03
поделиться

Вы должны отдавать предпочтение в порядке от наибольшего к наименьшему:

  1. id

  2. tag
  3. tag.className
  4. .className

Селекторы идентификаторов работают быстро. Селекторы тегов работают достаточно быстро. Селекторы чистого класса работают медленно, потому что браузер, по сути, должен опросить каждый элемент и посмотреть, есть ли у каждого этот класс. Получение элементов по идентификатору или имени тега - это «собственные» операции из контекста браузера.

Кроме того,

2
ответ дан 6 December 2019 в 06:03
поделиться

Селекторы классов

.className

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

<a href="#" class="className"></a>
<p class="className"></p>
<img src="/path/to/image.png" class="className" />

Но вы также можете ограничить его следующим образом:

img.className

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

HTML-код будет выглядеть следующим образом:

<img src="/path/to/image.png" class="className" />

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

Итак, повторяя приведенный выше пример:

<a href="#" class="className"></a>
<p class="className"></p>
<img src="/path/to/image.png" class="className" />

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

Селекторы ID

#idName

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

2
ответ дан 6 December 2019 в 06:03
поделиться

Стоит отметить одну вещь: некоторые технологии сценариев на стороне сервера (в первую очередь ASP.NET) не работают с использованием идентификаторов для вашего стиля. Если есть вероятность, что ваш дизайн будет использоваться с такой технологией, я рекомендую забыть о селекторах #id и использовать вместо них tag.className .

Причина в том, что ASP. NET фактически изменяет идентификатор, который попадает в HTML на основе ряда критериев, если тег выводится элементом управления на стороне сервера.

1
ответ дан 6 December 2019 в 06:03
поделиться

Это действительно зависит от ситуации:

.error{
  color:red;
}

p.error{
  background-color:yellow;
}

div.error{
  background-color:grey;
}

Всегда используйте каскадный эффект C SS в ваших интересах.

0
ответ дан 6 December 2019 в 06:03
поделиться

Хорошей практикой является использование наименее конкретных правил для каждого правила.

То, как вы структурируете свой CSS, будет зависеть от конкретных потребностей дизайна.

0
ответ дан 6 December 2019 в 06:03
поделиться

Когда использовать, что зависит от того, что вы хотите выбрать. img.className ( селектор типа + селектор класса ) выбирает только элементов IMG, которые находятся в классе «className», а . className (просто селектор класса) выбирает любой элемент , который находится в этом классе, и #idName ( селектор id ) любой элемент с ID «idName».

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

Итак, если у вас есть элемент IMG с идентификатором «idName» из класса «className»:

0
ответ дан 6 December 2019 в 06:03
поделиться

Да. Возможно, вы захотите использовать одно и то же имя класса для двух элементов в будущем. Будьте ясны и ясны. Это также предотвратит наложение правил класса на непредусмотренные элементы.

h1.title { font-size:18px; } /* My h1's are big */
 p.title { font-size:16px; } /* My p's are smaller */

  .title { color:#336699; }  /* All titles are blue */

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

0
ответ дан 6 December 2019 в 06:03
поделиться

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

1
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: