Вложение стилей CSS — правильная форма?

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

.mainbody #container #header #toprightsearch .searchbox {}

Итак, здесь у нас есть класс searchbox в идентификаторе toprightsearch, в идентификаторе заголовка, в идентификаторе контейнера, в классе mainbody.

Но, похоже, он работает правильно, если я опускаю некоторые идентификаторы.

Каков правильный способ их перечисления?
Если я включу всех родителей, будет ли это более конкретным? Может ли быть ошибка в разных браузерах, если я не включу все?

И буду признательна за любую дополнительную информацию по этой теме.

Спасибо


person user103219    schedule 07.06.2009    source источник


Ответы (6)


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

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

В вашем примере вы должны указать .mainbody #container #header #toprightsearch .searchbox, если вы имеете в виду, чтобы стиль применялся только к .searchboxes, которые находятся внутри всей этой иерархии. Если, наоборот, вы хотите, чтобы .searchboxes, существующие в других условиях, получили тот же стиль, вы должны быть менее строгими в иерархии. Это только о том, чего вы пытаетесь достичь.

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

person chaos    schedule 07.06.2009
comment
Хорошо, а есть ли разница в исключении идентификаторов и классов? - person user103219; 07.06.2009

.searchbox {}

Стилизует что угодно с .searchbox

.mainbody .searchbox{}

Стилизует любой .searchbox, происходящий от любого .mainbody, прямого потомка, внука, четверного правнука, не имеет значения.

#toprightsearch > .searchbox {}

Стилизует только поля .search, являющиеся прямыми дочерними элементами #toprightsearch.

#container * .searchbox {}

Стили .searchbox, которые являются внуками или более поздними версиями #container.

Вот хороший документ по теме: селекторы w3C

person Ryan Florence    schedule 07.06.2009

Идентификаторы специфичны для страницы. Так что вы бы просто использовали

#toprightsearch {
 stylename: stylevalue;
}

Если вы ищете вложенные классы, то правильный формат

.header .textBoxes {
  stylename: stylevalue;
}

Если вы точно знаете дочерний элемент родителя, вы используете знак >. Итак, если ваш документ был таким:

<div class="header">
    <div class="menu">
         <input type="text" class="textBox" />
    </div>
</div>

Вы можете использовать это:

 .header > .menu > .textBox {somestyle:somevalue;}

Это означает только элементы с классом .textBox непосредственно внутри элемента класса .menu, который сам находится непосредственно под элементом с классом .header.

person David    schedule 20.08.2012

Из Документации по селекторам W3:

Селекторы потомков выражают такую связь в шаблоне. Селектор-потомок состоит из двух или более селекторов, разделенных пробелом. Селектор потомков формы «A B» соответствует, когда элемент B является произвольным потомком некоторого элемента-предка A.

Короче говоря, нет, вам не нужно включать все родительские элементы, и это не должно вызывать кроссбраузерных проблем. Однако с этим селектором:

.mainbody .searchbox {}

Определенные стили будут применяться к любому элементу с классом searchbox независимо от того, происходит ли он прямо или косвенно от элемента с классом mainbody.

Однако с предложенным вами селектором:

.mainbody #container #header #toprightsearch .searchbox {}

Определенные стили являются более конкретными, поэтому только элементы, которые происходят от элемента с классом mainbody, а затем элементы с идентификаторами #container, #header, #toprightsearch в этом порядке и которые имеют имя класса searchbox, будут иметь определенные стили.

person Alex Rozanski    schedule 07.06.2009

Теоретически идентификатор следует использовать только для одного конкретного элемента на странице. Таким образом, у вас должен быть только один элемент с идентификатором toprightsearch, поэтому для работы вашего CSS вам нужно только указать:

#toprightsearch .searchbox {}

поскольку на вашей странице есть только один элемент с идентификатором toprightsearch, все остальные селекторы не нужны.

Если на вашей странице есть два элемента с идентификатором toprightsearch, то это плохая практика кодирования.

person Neptune704    schedule 24.10.2017

Код ниже делает то, что он говорит (по крайней мере, в Firefox). он окрашивает ввод в красный цвет

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Document</title>
<style type="text/css">
.mainbody #container #header #toprightsearch .searchbox {
    background-color:red;
}
</style>
</head>

<body class="mainbody">

<div id="container">
    <div id="header">
        <div id="toprightsearch">
            <input type="text" class="searchbox" />
        </div>
    </div>

</div>
</body>
</html>

Я думаю, вы должны посмотреть, не пошло ли что-то не так в написании идентификаторов и классов.

person jao    schedule 07.06.2009
comment
спасибо, но у меня нет проблем с его работой. Я только что заметил, что иногда это работает, если я опускаю родительские идентификаторы и классы. Поэтому я ищу правильный способ перечисления правил. - person user103219; 07.06.2009
comment
У того, кто проголосовал против этого, есть проблемы. Это был очень хороший ответ на вопрос, который, как казалось, задавал razass. - person Chuck; 07.06.2009
comment
Вопрос заключался в том, почему вы можете опустить некоторые комбинаторы и все равно получить тот же результат - вопрос не в том, что это не работает, а в том, почему это все еще работает? вопрос. Вероятно, за него проголосовали против, потому что кажется, что Джао невнимательно прочитал вопрос (однако я не проголосовал за это) - person Ryan Florence; 08.06.2009