Як поєднати клас та ідентифікатор у селекторі CSS?


221

Якщо у мене є такий div:

<div class="sectionA" id="content">
    Lorem Ipsum...
</div>

Чи є спосіб визначити стиль, що виражає ідею "Діл з id='content'І class='myClass'"?

Або ви просто підете в той чи інший бік, як в

<div class="content-sectionA">
    Lorem Ipsum...
</div>

Або

<div id="content-sectionA">
    Lorem Ipsum...
</div>

2
якщо ви збираєтесь вибрати за ідентифікатором, не потрібно також вибирати за класом, тому що id унікальний, тому відповідає лише один елемент. Тож додавання класу до того ж селектора є лише додатковим набором тексту
TStamper

20
@TStamper: Не обов’язково. Ви думаєте лише з точки зору статичних документів. У конкретному випадку, img#Inboxна вашій сторінці може бути значок, який зазвичай встановлений на 50% непрозорості. Однак, коли у користувача є повідомлення, ви хочете, щоб воно було встановлено на 100% непрозорість, і бекенд вказує на це, додаючи activeелемент до елемента. У такому сценарії має сенс мати селектор, який поєднує в собі ідентифікатор, і ім'я класу.
Lèse majesté

@TStamper: Крім того, чи не має більш конкретний комбінований селектор id + class, що надає йому більше ваги / переваги, ніж лише версія id? AFAIK, це повинно. (IOW, правила комбінового селектора id + class будуть перевершувати правила вибору id combo Selector. (Це була моя причина / потреба зараз знайти цю тему.)
govinda

Отже, у мене схожа ситуація. Наприклад, у мене є багато продуктів, які мають описи, але також хотіли б конкретного контролю над окремими продуктами, тож чи можу я зробити: code<p id = Product_1 class = Продукт> Продукт 1 </p> <p id = Product_2 class = Продукт> Продукт 2 </p> code Це дозволяє дозволити загальний стиль усіх продуктів, але також дозволити індивідуальний стиль для конкретних продуктів?
Тамер Зядій

Відповіді:


327

У вашому аркуші стилів:

div#content.myClass

Редагувати: Вони також можуть допомогти:

div#content.myClass.aSecondClass.aThirdClass /* Won't work in IE6, but valid */
div.firstClass.secondClass /* ditto */

і, на ваш приклад:

div#content.sectionA

Редагувати, 4 роки потому: Оскільки це дуже давно, і люди продовжують його знаходити: не використовуйте тегНазви у своїх селекторах. #content.myClassшвидше, ніж div#content.myClassтому, що tagName додає крок фільтрації, який вам не потрібен. Використовуйте tagNames у селекторах лише там, де потрібно!


31
Вказівка ​​того, що ідентифікатор належить до div, може завдати шкоди тільки продуктивності візуалізації (хоча і в значній мірі незначною) без жодної вигоди для нього, оскільки ідентифікатор вже унікальний. Я б замість цього вийшов # content.myClass, щоб очистити його.
mystrdat

3
div.class#idмає бути рівнозначним, хоча і менш рекомендованим; спочатку використовуйте більше унікальних частин селектора.
СФ.

1
Ну дякую за ваші зусилля, навіть через роки :). Досі допомагаю хлопцям, як я. Щойно використала його для свого проекту. Оновлено точно.
C4d

76

Існують відмінності між #header .calloutі #header.calloutв css.

Ось "звичайна англійська мова" #header .callout:
Виберіть усі елементи з назвою класу, calloutякі є нащадками елемента з ідентифікатором header.

А це #header.calloutозначає:
Виберіть елемент, у якого є ідентифікатор, headerа також ім'я класу callout.

Ви можете прочитати більше тут css трюки


Я помилився з пробілом: #id .class vs # id.class
ERJAN

5

Немає нічого поганого в поєднанні ідентифікатора та класу на одному елементі, але вам не потрібно ідентифікувати його обома за одним правилом. Якщо ви дійсно хочете, ви можете зробити:

#content.sectionA{some rules}

divПеред ідентифікатором не потрібно, як пропонують інші.

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

Це зводиться до цього:

 .sectionA{some general rules here}
 #content{specific rules, and overrides for things in .sectionA}

Мати сенс?


4

Ну загалом, вам не потрібно класифікувати елемент, вказаний id, тому що id завжди унікальний, але якщо вам дійсно потрібно, слід працювати наступним чином:

div#content.sectionA {
    /* ... */
}

1

Ви можете комбінувати ідентифікатор та клас у CSS, але ідентифікатори мають бути унікальними, тому додавання класу до селектора CSS перевищить його.


Це хороший момент. Я думаю, якщо, можливо, у вас є набір дуже загальних класів (встановлення таких речей, як поплавок, висота / ширина, можливо, такі, як шрифт), і ви хочете щось змінити в них за цим унікальним винятком?
айм

5
Якщо ви не використовуєте один і той же аркуш стилів на різних сторінках. :-)
Патрік МакЕлхані

5
Ще один приклад: коли класи додаються динамічно за допомогою Javascript (# optionalFields.enabled)
Патрік МакЕлхані

Навіть якщо ви використовуєте один і той же таблицю стилів на різних сторінках, було б дійсно краще поставити клас на корпус або мати один стиль для ідентифікатора, а потім розділити визначення класів для класів із відповідними стилями переосмислення.
Ерік Венделін

Так, я думаю, що це досить часто робиться. наприклад, li # SomeTab.state-вибрано
Yablargo


0

Ідентифікатори повинні бути унікальними для документа, тому ви не повинні вибирати на основі обох. Ви можете призначити елементу кілька класів, хоча зclass="class1 class2"


1
Клас може змінюватися. Наприклад, ви можете мати div # id.active та div # id.inactive.
Даніель Моура

досить чесно, придумайте це, я використав цю функціональність, але я неправильно зрозумів, що таке бажана поведінка.
Бен Х'юз

0

Я думаю, ви все помиляєтесь. Ідентифікатори проти класу - це не питання конкретності; вони мають абсолютно різні логічні використання.

Ідентифікатори повинні використовуватися для ідентифікації конкретних частин сторінки: заголовка, рядка навігації, основної статті, атрибуції автора, колонтитула.

Класи слід використовувати для застосування стилів до сторінки. Скажімо, у вас є загальний сайт журналу. Кожна сторінка на сайті матиме однакові елементи - заголовок, nav, основна стаття, бічна панель, колонтитул. Але ваш журнал має різні розділи - економіка, спорт, розваги. Ви хочете, щоб три секції мали різний вигляд - економічно консервативний і квадратний, спортивні дії-у, розваги яскраві та молоді.

Ви використовуєте для цього заняття. Вам не потрібно робити кілька ідентифікаторів - # економіка-стаття та # спорт-стаття та # розвага-стаття. Це не має сенсу. Швидше, ви б визначили три класи: .economics, sports та .entertainment, а потім визначите ідентифікатори #nav, #article та #footer для кожного.


Насправді ви можете використовувати семантичні теги HTML замість ідентифікаторів для більшості згадуваних вами елементів. Теги заголовка, колонтитула, наві, секції тощо існують чомусь.
Вальтер Шварц

Але дійсно слід використовувати лише ідентифікатори для елементів, які мають бути унікальними, одинаковими. Але навіть тоді це єдине дійсно корисне, якщо вам потрібно отримати доступ до цього елемента через JavaScript, оскільки використання ідентифікаторів робить ваш CSS занадто специфічним і важким для подальшого злиття з іншими CSS та / або HTML. Існує також аргумент, що ідентифікатори швидші, ніж класи, але різниця справді незначна.
Вальтер Шварц

-1
.sectionA[id='content'] { color : red; }

Не працюватимуть, коли тип файлу - HTML 4.01, хоча ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.