web-dev-qa-db-ja.com

CSSクラスの優先順位

今日問題が発生した後、CSSクラスの優先順位について質問があります。状況は次のとおりです。

クラスが関連付けられている順序付けられていないリストがあります。 LIタグにもいくつかのスタイルが定義されています。クリック後にLIsのスタイルを(追加された"selected"クラスを介して)変更したいのですが、追加されたクラスのスタイルが適用されません。これは正常な動作ですか、それともこのコードは機能するはずですか?

CSS:

.dynamicList
{
    list-style: none;
}

.dynamicList li
{
    display: block;
    width: 400px;
    height: 55px;
    padding: 10px 10px 10px 10px;
    border: 1px solid #000;
    background-color: #ff0000;
}

.selectedItem
{
    background-color: #0000ff;
}

HTML:

<ul class="dynamicList">
  <li>First Item</li>
  <li class="selectedItem">Second (Selected) Item</li>
</ul>

"selected"リスト項目の背景色は変更されません。これは、スタイルをLI要素に適用せずに、別のクラスを作成し、それをすべてのリストアイテムに適用して読み取る場合にも当てはまります。

<li class="listitem selectedItem">xxxx</li>
25
Stuart

これは CSSの特異性 の問題のように聞こえます。 .selectedItemルールセットを次のように変更してみてください:

.dynamicList li.selectedItem {
  background-color: #0000ff;
}
26
John Topley

簡単に言うと、以前のスタイルはより具体的であり、優先度が高いため、.selectedItemスタイルは適用されません。 まともなランダウン

それでは、CSSの内部優先度の一般的なリストを作成しましょう(3が最高の優先度です)。

element
.class
#id

これがデフォルトの優先順位です。これに加えて、特異性もカウントされ、f.ex ulliはliをオーバーライドします。 W3Cは、内部重量の計算方法について適切な表を作成しました。

LI            {...}  /* a=0 b=0 c=1 -> specificity =   1 */
UL LI         {...}  /* a=0 b=0 c=2 -> specificity =   2 */
UL OL LI      {...}  /* a=0 b=0 c=3 -> specificity =   3 */
LI.red        {...}  /* a=0 b=1 c=1 -> specificity =  11 */
UL OL LI.red  {...}  /* a=0 b=1 c=3 -> specificity =  13 */
#list         {...}  /* a=1 b=0 c=0 -> specificity = 100 */

そしてここに W3C仕様 があります。

17
cletus

selectedItemルールを次のように変更します。

.dynamicList li.selectedItem
{
    background-color: #0000ff;
}
7
Matt Bridges

Cletusの投稿では言及されていない小さな追加。
W3Cリンクによると、最高の優先順位は、html要素/タグで使用されるstyle属性です。

例えば。あなたが持っている場合

<a id= bar style="color: red">foo</a>

そして

<style>
#bar {
    color: blue;
}
</style>

インラインHTMLスタイルの優先度が最も高く、#よりも高いため、色はredになります。

3
Timo