【问题标题】:CSS selector for numbered class/id编号类/id 的 CSS 选择器
【发布时间】:2015-06-23 00:29:53
【问题描述】:

我有以下情况:

<div id="myMenu">
   <div id="menu0">stuffs</div>
   <div id="menu1">stuffs</div>
   <div id="menu2">stuffs</div>
   ...... and so on
</div>

我的要求是访问除 menu0 之外的 myMenu 内所有 id 为 $=menu 的 div,因为我的菜单可以有 10 到 15 个项目,所以一种方法是:

 #myMenu > menu1 {style}
 #myMenu > menu2 {style}
 so on... 15 times

但由于我必须为所有这些都赋予相同的样式,这似乎没有必要,我正在寻找适合我的要求的 CSS 选择器,它也兼容 IE8。

非常感谢任何帮助。

【问题讨论】:

  • 它是否总是第一个您不想设置样式的包装元素?
  • 为什么不给每个你想要设置样式的元素添加一个类?
  • 是的,大卫它总是 Menu0 没有 Der,我不能,它是自动生成的代码,我不能在 HTML 中添加任何东西。

标签: html css cross-browser css-selectors


【解决方案1】:

如果你总是有 #menu0 元素,你可以使用兼容 IE8 的通用兄弟选择器

    #menu0 ~ [id^="menu"] {
        color: red;
    }
<div id="myMenu">
   <div id="menu0">stuffs</div>
   <div id="menu1">stuffs</div>
   <div id="menu2">stuffs</div>
</div>

或使用更适合的classes(连同ids)。

【讨论】:

  • 我已经添加了代码 sn-p 以便您现在可以看到它:)
  • 太棒了,它成功了,谢谢安德里亚。并感谢您的快速响应。
【解决方案2】:

这个css3规则会得到不带#menu0的列表:

div#myMenu > div:not(#menu0)
{
}

或者,您可以使用这两个:

div#myMenu > div
{ 
    /*new values*/ 
}

div#myMenu > div#menu0
{ 
    /*reset with the original values*/ 
}

此代码将命中所有子 div,然后第二条规则将覆盖前一条,因为它位于级联的后面并将 #menu0 重置为其原始状态。

【讨论】:

  • OP 要求排除 #menu0。您的代码将为包括#menu0在内的所有元素设置样式。
  • 哦,错过了那部分。我添加了 css3 :not()
  • @Vivek 我做了一个小改动,可能会更好地处理它。
  • 由于 IE8 对 :not 伪类的部分支持/缺失支持,我建议在这个答案中使用 css 重置。
  • 是的,覆盖是一种好方法,如果我找不到更好的方法,我会试试这个。
【解决方案3】:

你可以使用类,但你也可以:

#myMenu div[id^="menu"]:not(#menu0) {
  color: red;
}
<div id="myMenu">
  <div id="menu0">stuffs</div>
  <div id="menu1">stuffs</div>
  <div id="menu2">stuffs</div>
  <div id="menu3">stuffs</div>
  <div id="menu4">stuffs</div>
  <div id="menu5">stuffs</div>
</div>

这个选择所有id,它以单词'menu'开头并且是id为#myMenu的元素的子元素,但排除了id为#menu0的元素

在旧浏览器的注释后,例如ie8 你可以使用:

#myMenu div[id^="menu"] {
  color: red;
}
#myMenu #menu0 {
  color: #000;
}
<div id="myMenu">
  <div id="menu0">stuffs</div>
  <div id="menu1">stuffs</div>
  <div id="menu2">stuffs</div>
  <div id="menu3">stuffs</div>
  <div id="menu4">stuffs</div>
  <div id="menu5">stuffs</div>
</div>

因为 id 是唯一的。

【讨论】:

  • 我建议使用类和startswith选择器...该死的你很快:S :)
  • > “menu0”除外,。 @Vivek 不想为 menu0 设置样式
  • 它也会选择“menu0”,我不想选择menu0。
  • 是的,修复它。感谢反馈家伙
  • 我建议不要使用!important,而只使用特异性:#myMenu #menu0 { color: #000; }
【解决方案4】:

添加另一个类:

<div id="myMenu">
   <div id="menu0">stuffs</div>
   <div id="menu1" class="sub">stuffs</div>
   <div id="menu2" class="sub">stuffs</div>
   ...... and so on
</div>

然后选择:

#myMenu > .sub{ ... }

或简单

#myMenu  .sub{ ... }

【讨论】:

    【解决方案5】:

    如果正如 cmets 对问题所暗示的那样,它始终是不应该选择的第一个孩子:

    /* selects all the <div>s with an id beginning with 'menu',
       that follow a <div> with an id beginning with menu, that
       are the direct-children of the element with an id of 'myMenu': */
    #myMenu > div[id^=menu] + div[id^=menu] {
        /* css here */
    }
    

    或者:

    /* selects all <div> elements that are not the :first-child
       that are direct children of <div id="myMenu">: */
    #myMenu > div:not(:first-child)
        /* css here */
    }
    

    或者:

    /* selects all <div>s with an id beginning with menu that
       have a previous sibling <div> with an id beginning with
       'menu' that is the direct child of <div id="myMenu">: */
    #myMenu > div[id^=menu] ~ div[id^=menu] 
        /* css here */
    }
    

    【讨论】:

    • 哦,这很棘手,它不会选择menu0吗?它是否兼容IE8。
    • 不能选择第一个元素(这就是我在 cmets 中问这个问题的原因)。因为#menu0 是第一个子元素(它被:not(:first-child) 排除在外,并且因为第一个元素不能被兄弟组合器匹配,+~)。至于IE8我不知道;我没有可以尝试的副本。
    • 感谢大卫的快速回复。
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2016-08-24
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多