css - 为什么在 CSS 中不推荐通过 ID 选择?

标签 css css-selectors methodology csslint

<分区>

CSS Lint ,他们不建议使用 id 来选择元素。我信任 CSS Lint,因为它是由精通 CSS 的聪明人编写的。但我想知道这是什么原因?为什么选择 id 不是一件好事?

最佳答案

我不同意从不使用 ID 来选择元素的想法,但我确实理解其中的原因。

当通用形式就足够时,开发人员通常会使用非常高特异性的选择器:

#foo #bar #baz .something a {
    text-decoration: underline;
}

最好写成

.something a {
     text-decoration: underline;
}

此外,写作风格如下:

#foo-1,
#foo-2,
#foo-3,
#foo-4 {
    color: #F00;
}

最好写成:

.foo {
    color: #F00;
}

我与 CSLint 的不同之处在于重复使用的结构 ID。

我经常用这种结构标记页面:

<div id="page">
    <div id="page-inner">
        <header id="header">
            <div id="header-inner"></div>
        </header>
        <nav id="nav">
            <div id="nav-inner"></div>
        </nav>
        <div id="wrapper">
            <div id="wrapper-inner">
                <div id="content">
                    <div id="content-inner">
                        <article></article>
                        ...
                    </div>
                </div>
                <div id="sidebar">
                    <div id="sidebar-inner">
                        <div class="module"></div>
                        ...
                    </div>
                </div>
            </div>
        </div>
        <footer id="footer">
            <div id="footer-inner"></div>
        </footer>
    </div>
</div>

而且因为我知道结构是一致的,所以我不介意使用 #page , #header , #nav , #wrapper , #content , #sidebar , 和 #footer在我的 CSS 中,用于清除特定于区域的样式。这些样式与此特定结构紧密耦合,这使得它们不易重用;因为我重用了结构,所以它们 是可重用的。要记住的重要一点是,在选择器中使用 ID 是非常具体的,应该谨慎使用。


关于 specificity 的几句话:

一般来说,应该使用做出正确选择的尽可能低的特异性选择器:

如果您要定位所有 <a>元素,那么使用 a 是有意义的.
如果您要定位所有 <a> <div class="foo"> 中的元素, 那么使用 .foo a 是有意义的.
如果您要定位所有 <a> <div id="bar"> 中的元素, 那么使用 #bar a 是有意义的. 但是,您可以使用较低特异性的选择器。 [id="bar"] a.foo a 具有相同的特异性,这意味着您仍然可以通过 ID 定位特定元素,而无需创建具有不必要的高特异性的选择器。

通常建议使用[id="XXXX"][id] 上进行选择的选择器属性,因为它很冗长,可能会引起混淆。我确实推荐使用[data-id="XXXX"]基于 custom [data-*] attributes 选择的选择器将样式与 DOM 节点的当前状态更紧密地联系起来。

关于css - 为什么在 CSS 中不推荐通过 ID 选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8084555/

相关文章:

javascript - 显示错误的动态生成表

javascript - 脚本不显示原始图像

javascript - Jquery-从 <td> 内的输入获取值到数组中

methodology - 有哪些单独的开发人员编程方法?

jQuery 类过滤和 css 转换延迟/阻塞动画在下面的部分

javascript - 如何使用 Javascript 从 CSS 选择器字符串中删除所有伪选择器?

css - CSS是否有一个:blur selector (pseudo-class)?

agile - 小团队的项目方法

git - 在 git 中,如何找到创建分支的修订版本?

css - CSS 着色器的浏览器?