代码之家  ›  专栏  ›  技术社区  ›  L. Cornelius Dol

CSS选择器样式

  •  2
  • L. Cornelius Dol  · 技术社区  · 17 年前

    这个问题很简单,可能反映了我对CSS的缺乏经验,但是。。。

    创建样式表时,我喜欢显式指定“*”通配符,因此:

    *.TitleText {
    

    而不仅仅是

    .TitleText {
    

    我发现它提醒我TitleText应用于“any”标记,并且可以被后续的h1.TitleText覆盖。也许我只是喜欢这个,因为在很长一段时间里,我没有正确理解整个CSS选择器的概念,当我意识到第二个(上面的)只是第一个的简写时,很多东西“点击”。

    我所做的是坏习惯,好习惯,还是既不在这里也不在那里?

    12 回复  |  直到 14 年前
        1
  •  7
  •   ahockley    17 年前

    我不知道这是好是坏,但我已经做了几年的CSS工作,作为web应用程序开发的一部分,我已经 从不 看到有人使用*字符。

        2
  •  2
  •   0b10011 Dragos.    14 年前

    * 增加文件大小

    如果您不使用CSS缩小器(消除多余的数据,如额外的空白)来删除不需要的星号,请使用 每次未指定标记都会导致文件中有相当多的额外字符,这将导致更长的加载时间(以及更多的带宽使用)。虽然我不会浏览一个大文件并删除已经存在的星号(除非你真的有时间这样做,并且喜欢可能会导致一个多年都不会发现的错误的繁琐任务),但我建议在编写新样式时不要包含不需要的星号,在编辑旧样式时删除不需要的星号。

    使用 *

    使用 * * 在不需要的时候出现(这很常见)。

    实例

    /** 
     * This matches an element with the class `alert` within
     * any element within an `article` element
     */
    article * .alert { /* ... */ }
    

    /** 
     * This matches an element with the class `alert` within
     * an `article` element
     */
    article *.alert { /* ... */ }
    

    如果在一个项目中有100%的一致性(并且项目中的所有工作人员都知道这种风格),那么第一个例子就永远不会发生(它将是 article * *.alert 唯一地 )在项目和网站中:

    如果不需要,请使用星号 .

    快速查看一些知名网站(如Facebook、Google、Yahoo等)的来源就会发现,除非必须使用星号,否则它们不会使用星号(即使是在非缩略样式中)。您还可以在上查看一些开源项目 GitHub .

    结论

    星号只能在绝对需要时使用(例如。, body * p 匹配具有父级而非正文的段落)。这不仅是不成文的标准(而且不太可能引起混淆),而且还减少了样式表的文件大小,从而提高了网站的加载速度。

        3
  •  1
  •   seanb    17 年前

    就我个人而言,我倾向于在将规则应用于所有标记时使用*。它在*.class{}的情况下是多余的,但在.class*{}的情况下很有用。

    我在一些地方读过,但没有证实,*选择器会影响性能。除非我需要,否则我不会使用它,因为我通常更喜欢更明确一点,但这只是我个人的偏好。

        4
  •  1
  •   da5id    17 年前

    它既不好也不坏,但(完全)是多余的。

        5
  •  1
  •   BoltClock    14 年前

    根据 CSS 规范:

    5.3通用选择器

    通用选择器,写为“*”, 匹配任何元素类型的名称。 文档树。

    如果通用选择器不是 简单选择器的唯一组件, 可以省略“*”。例如:

    • *[lang=fr] [lang=fr] 它们是等价的。
    • *.warning .warning 它们是等价的。
    • *#myid #myid 它们是等价的。

    因此,.TitleText和*.TitleText是等效的。对于*.xxx,任何实现都不太可能考虑性能因素,而对于.xxx,则不考虑性能因素。

    这就归结为一个风格问题。由于其他答案提出的风格考虑似乎在很大程度上是没有意义的,我相信我会继续明确说明*。

        6
  •  0
  •   Grant Wagner    17 年前

    我不认为这有什么关系,但我在学习时看到的例子都没有使用通配符格式,所以我学会了不用星号。

    而且,没有一个生成CSS的工具是这样做的,因此使用星号,如果您选择将CSS放入这样一个工具中,您可能会面临自动工具清除格式的风险。

    为了与大多数其他web开发人员保持一致,我可能会建议您删除星号,这样您就不必与其他开发人员打交道,问您为什么要在其中添加星号。

        7
  •  0
  •   WillCodeForCoffee    17 年前

    我认为*是隐含的,所以他们做同样的事情。

    我不确定,但如果您这样做可能会导致一些问题:

    span.style { color: red; }
    *.style { color: blue; }
    

    *样式可能会替代跨度样式。但我可能错了,因为span.style是一个更具体的选择器。

    我觉得你这么做很有趣,尽管我完全明白为什么!在CSS中使用DOS提示符/shell语法。最后,您可能会进一步混淆自己,因为在Shell中,您看到的是文件扩展名,但在CSS中,它实际上映射到一个类。

    所以我的意思是,它适用于类选择器,但也有点适用于ID选择器。例如:

    span#id { ... }
    *#id { ... }
    

    …而且它看起来不再像Shell语法。:)就我个人而言,我不会像你那样做,因为这可能会让人困惑,但我认为你没有破坏任何东西。

        8
  •  0
  •   questzen    17 年前

        9
  •  0
  •   BeWarned    17 年前

    我从未见过有人使用这样的通配符,我怀疑它会优先于只指定类。其他修改样式的人可能会被迫继续使用这种语法。如果他们明白为什么他们的课程不起作用。

        10
  •  0
  •   Martijn Laarman    17 年前

    我认为*.class没有实际用途,应该使用!重要的声明,而且只是稀疏的。

    我使用*的唯一原因是删除所有的填充和边距,实际上我总是这样做,这是我写下的第一条css语句:)。

    我会把它标记为坏习惯。

        11
  •  0
  •   Ben Blank Jarret Hardie    17 年前

    就CSS规范而言,您的两个示例具有相同的含义。然而,在实践中也存在潜在的问题。我能看到的最大的问题是,一些浏览器可能会滥用 * 在规则权重方面,因此可能会偏离优先顺序(尽管我不知道有哪一个,在我的头脑中,这样做不会让我感到惊讶)。人们也普遍认为,出于性能原因,类选择器应该始终包含一个特定的标记名,尽管我不能详细地引用。应用带有标记名的类选择器显然更快( span.foo )与不带标记名的ID选择器相比,应用不带标记名的ID选择器更快( #bar

        12
  •  -1
  •   Steve Perks    16 年前

    编辑:这表明可能存在性能问题。有些人似乎认为我是某种在外面咆哮的人。。。


    div#foo a.bar {}
    

    我听说,例如jQuery,它使用css,在上面的例子中,它会遍历DOM,首先查找div,然后检查它们是否有一个#foo的id,然后查找一个A标记,最后再查看它是否为classed.bar。

    我对*的担心是,浏览器可能会遍历DOM查找所有标记,然后查找.bar,而不是本质上只查找“bar”属性——这是DOM的两个扫描,而不仅仅是一个扫描。这可能是一个极小的区别,但如果你的语法出现在电波中,那就是我们需要安装更多的太阳能电池板。