2013-10-07 3 views
2

У меня есть случай, когда у меня есть .menu внутри #header и когда доступ .menu «s детей с помощью селектора CSS, как .menu a, он использует #header a вместо.`#parent span` стиль переопределения` .child span` стиль

Я ожидал, что .menu a переопределить #header a, поскольку он ближе к элементу a. Почему это не происходит? Я предполагаю, что он имеет класс, сравнимый с id, основанный на приведенном ниже примере.

В примере, есть ли хороший способ переопределить #red span css в пределах .blue span без ограничения родительского стиля?

Под «хорошим способом» я полагаю, что я имею в виду гибкость. Например, .blue может быть элементом, созданным инфраструктурой php, которая используется во многих местах (возможно, не в родительском элементе, образованном идентификатором, или, возможно, в родительском стиле, созданном на другом идентификаторе).

Адрес example. Все, кроме #green еще будет красным:

HTML:

<div id="red"> 
    <span>red</span> 
    <div class="blue"> 
     <span>blue(class) - should be blue</span> 
    </div> 
    <div id="green"> 
     <span>green(id) - should be green</span> 
    </div> 
    <div class="green"> 
     <span>green(class) - should be green</span> 
    </div> 
    <div> 
     <span>no child div style - should still be red</span> 
    </div> 
</div> 

CSS:

#red span { 
    color: red; 
} 
.blue span { 
    color: blue; 
} 
.green, #green span { 
    color: green; 
} 
+0

Основываясь на ответах (хотя полезно - я дал '+ 1') и то, что я видел в другом месте ... кажется, нет практического решения для этого с гибкостью, которую я искал без изменения DOM или использования '! important'. Мне просто нужно найти способы обойти эту функцию CSS, в моем текущем сценарии я думаю, что я добавлю класс родительскому и стилю, а не идентификатор. – smerny

+0

В первых двух параграфах описывается сценарий, отличный от другого, представленного в вопросе. Заголовок вопроса вводит в заблуждение, так как речь идет не о «родительском стиле», который переопределяет что-либо. –

+0

@smerny проверить новое дополнение к моему ответу. –

ответ

2

приоритет применения правила CSS (без !important) является:

  1. Количество идентификаторов в селекторе. Если ничья,
  2. Количество атрибутов и классов. Если ничья,
  3. имена или псевдоэлементы. Если ничья,
  4. последнее объявление в файле CSS. Это, конечно, никогда не рисует.

С #red span имеет идентификатор, и .green не имеет какого-либо, #red span применяется.

Для дальнейшего объяснения которых правила CSS является первым применить, проверить это nice article on smashing magazine

Чтобы обойти, вы можете use a more specific rule. Таким образом, он становится привязанным к первому, но поскольку у него есть дополнительные классы, ваше правило выигрывает из-за второго.

+0

Спасибо за список, но это на самом деле не пытается решить мою проблему ... хотя кажется, что невозможно сделать то, что я хочу, с данным dom :( – smerny

+0

@smerney, если вы не можете/t изменить красную часть, единственный способ добиться этого - использовать «важный» или установить цвет, используя хотя бы один идентификатор в правиле CSS (например, изменение класса по идентификатору). – fotanus

+0

Это [** появляется **] (http://jsfiddle.net/f4ke2/4/), чтобы работать нормально. Надеюсь избежать этого, но на самом деле может пойти так. – smerny

1

Selector специфика диктует, что идентификатор имеет приоритет над классом. Несмотря на то, что синий класс после красного цвета в каскаде, красный имеет приоритет из-за специфики. Вы можете использовать селектор #red .blue span при необходимости

+0

Что делать, если '.blue' является обычно используемым элементом в php-фреймворке, и он не всегда находится в' # red' (может даже быть внутри другого элемента, созданного id)? Есть ли гибкий способ сделать это? – smerny

+0

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

+0

@smerny рекомендуется избегать выбора по этой причине –

1

самый простой и чистый:

http://jsfiddle.net/f4ke2/7/

#red { 
    color: red; 
} 
.blue span { 
    color: blue; 
} 
.green, #green span { 
    color: green; 
} 

ИЛИ Что делать, если вы сделаете это?:)

#red > span { 
    color: red; 
} 

ИЛИ

#red .blue span {color: blue;} 

ИЛИ

.blue span { 
    color: blue !important; 
} 

ИЛИ для "гибкости"

#red .blue span, .blue span, #someotherID .blue span {color: blue;} 

или что-то, как ужасно, как это

var id = $("#red"); 
id.addClass(id.attr("id")).removeAttr("id"); 
+0

Я тоже подумал об этом, однако проблема заключается в том, что он не удовлетворяет части «без ограничения размера родительского стиля». См. [** здесь **] (http://jsfiddle.net/f4ke2/3 /) – smerny

+0

В этом случае вы просто делаете #red .blue span {color: blue;} в большинстве реальные сценарии жизни - это то, что вы делаете. Каскадирование - это ключевое слово. –

+0

Затем я сталкиваюсь с проблемами гибкости (см. OP и комментарии к ответу @ExplosionPills). Кажется, не может быть способа сделать это с моим текущим dom. – smerny

0

Если вы используете таблицы стилей (в каркасе или иначе), которые присваивают свойства элементам по классу, то есть с помощью селекторов классов, вы просто должны учитывать это при написании других правил CSS. Так что это вопрос дисциплинированного кодирования (HTML и CSS), а не использование какого-либо трюка, чтобы избавиться от обычных принципов CSS.

В принципе, задайте свойства только для тех элементов, которые вы хотите затронуть, без использования селекторов со слишком широким охватом. Скажем, если вы хотите установить текст внутри какого-либо элемента красного цвета, установите только этот элемент color: red, а не его потомки, если вы действительно не хотите переопределять все параметры, которые они могут иметь.

Например, если есть таблица стилей с .foo { color: blue }, это повлияет на любой элемент класса foo, если только это не переопределено другим правилом в соответствии с каскадом CSS. Поэтому, если вы не хотите, чтобы это было переопределено в такой ситуации, как <div id=xxx>...<span class=foo>...</span>...</div>, вы просто не можете установить #xxx span { color: red }, потому что тогда вы переопределите это правило в силу более конкретного селектора. Использование #xxx { color: red } было бы безопасным в этом смысле, поскольку span (имеющий свой набор цветов) не наследует цвет своего родителя.

Использование !important как в .foo { color: blue !important } может показаться проблемой, но !important упрощает управление таблицами стилей. Это также создает проблемы, когда вам нужен инструмент для переопределения эффекта специфичности, но он не может, потому что вы уже стреляли из оружия. Правило .foo { color: blue !important } не действует против #xxx span { color: red !important }.

Смежные вопросы