如果您是一位专业人士,很容易忘记在刚开始学习 CSS 时遇到的困惑。 只是为了好玩,让我们尝试回忆一些那些奇怪且令人困惑的时刻。 我先列出一些我记得的以及最近在帮助他人时遇到的随机例子。 然后大家在评论中继续讨论。
这些都不是像 IE 中的布局错误或应该使用哪些供应商前缀这样的大问题。 而是那些小的基础知识,比如语法上的细微差异,却会带来很大的意义变化。
标签限定
这两者有什么区别?
.class { }
p.class { }
第一个将选择具有该类名的任何元素。 第二个只会选择具有该类名的段落元素。
第一个更通用。 使用该类应用的样式可能对多种类型的元素有用。 即使今天没有,明天也可能会有。 对于浏览器来说,理解和应用它也更快。
很少有情况需要使用第二个示例。 只有当您想对多个元素重复使用相同的类名,但希望它们执行不同操作时才会用到。
p.stand-out { background: yellow; }
span.stand-out { font-weight: bold; }
选择器顺序很重要
为什么它们如此不同?
.class div { color: red; }
div.class { color: green; }
第一个示例之所以如此不同,是因为 .class 和 div 之间存在空格字符。 空格之前的内容和空格之后的内容选择不同的元素。 第一个部分是“选择任何具有此类名的元素”,第二个部分是“选择任何 div”。 将它们与空格放在一起,您将得到“选择任何作为具有此类名的任何元素的后代的 div”。
第二个不涉及任何后代业务。 它是一个像上面讨论的那样的标签限定选择器。
如果上面的 CSS 是页面上唯一的 CSS,则结果将如下所示
<div class="class">
<h2>
<div>Would be red</div>
</h2>
<div>Would be red</div>
Would be green
</div>
<div>Would be black</div>
为什么要使用 ID?
就 CSS 而言,使用类和使用 ID 看起来似乎完全相同。
#id { color: red; }
.class { color: green; }
它只是一个属性,并且根据您使用哪一个,语法上的差异似乎是任意的。 结果是可预测的
<div id="id">Would be red</div>
<span id="id">Would be red</span>
<div class="class">Would be green</div>
<span class="class">Would be green</span>
您可能已经了解到 ID“应该”是唯一的,也就是说,每个页面上只有一个元素使用它。 但是您之前可能犯过错误,而且似乎无关紧要,CSS 仍然可以正常应用。
然后您开始获得相互矛盾的信息。 一些 工具 和 理念 教导说 ID 不适合用于样式化。 一些 文章 告诉您它们是最有效的。 也许您与 JavaScript 开发人员合作,他们告诉您需要在所有内容上使用 ID,因为这使他们的工作变得更容易。
这里充满了困惑。 事实证明,每个人都多少是对的。 以下是事实
- 就实际应用样式而言,CSS 并不太关心您使用哪一个。 从技术上讲,ID 对浏览器渲染引擎来说更快,但除了最极端的情况外,您可能永远不会注意到速度差异。
- JavaScript 非常关心 ID。 JavaScript 通过 ID 查找元素的速度明显更快。 这就是“唯一性”非常重要的原因。 JavaScript 只会找到具有该 ID 的“第一个”元素,因此,如果您在页面上有多个,可能会导致混乱。
- ID 具有比类更高的 特异性值。 如果一个元素同时具有 ID 和类,并且两者都应用了样式,则 ID 应用的样式将优先于类应用的样式。 这可能很有用,也可能是一个障碍。
我个人的理念是在绝对知道只有一个且不会从与其他元素共享的类名属性中受益的内容上使用 ID。
隐藏的悬停效果
这里发生了什么?
div { color: red; }
div:hover div { color: green; }
:hover 是一个选择器,只有当鼠标悬停在特定元素上时才会应用自身。 奇怪的是,您不一定非要将样式应用于正在悬停的元素。 在这种情况下,我们只在父 div 悬停时将样式应用于后代 div。 所以
<div>
I will be red all the time
<div>
I will be red, unless that top
div is hovered (but not necessarily me)
and then I'll be green.
</div>
I will be red all the time
</div>
空格符无关紧要
这个
div{color:red}
与这个完全相同
div {
color : red
}
您确实需要在选择器中使用空格来创建后代选择器(例如 ulli { } 与 ul li { } 完全不同),但除此之外,您可以根据使查看和使用 CSS 更舒适的方式使用空格。
请注意上面示例中缺少的分号。 如果它是组中的最后一个属性,则可以省略它。 我个人从不这样做,因为如果您稍后添加更多属性/值并忘记在上一行添加分号,就会出现问题。 因为空格是如此自由,它会继续将下一行读取为上一行值的组成部分。
问题示例
div {
-webkit-border-radius: 10px
-moz-border-radius: 10px
border-radius: 10px
}
空格是可以的。 最后一个没有分号是可以的。 但是前两个属性/值对没有分号,并且会完全搞砸并且无法工作。
属性覆盖
div 将具有什么字体大小?
div {
font-family: Sans-Serif;
font-size: 18px;
font-weight: bold;
font-style: italic;
color: red;
margin: 0 0 20px 0;
font-size: 21px;
padding: 10px;
}
将是 21px。 您不小心列出了两次,第二个将获胜。
CSS 文件中的顺序很重要
如果您有两个具有完全相同特异性的选择器,如下所示
.red { color: red; }
.green { color: green; }
然后它们应用于相同的元素,CSS 中后面的选择器将始终获胜。 HTML 中的类名顺序无关紧要
<div class="red green">Will be green</div>
<div class="green red">Will be green</div>
什么是语义类名?
前面的示例使用“red”和“green”作为类名。 这不是很有语义。 为什么不呢? 这是一个很大的话题,留到下周讨论! 大概吧!
不错的文章,Chris。 学到了一些关于 CSS 文件中的顺序以及 HTML 中的类名无关紧要的新知识 :) 谢谢!
让我想起了我刚开始的时候。 现在,当我们使用新的 HTML5 元素时,我们会遇到困难!
对于初学者来说,这是一篇很棒的文章,并且分解得很好。
我总是喜欢找到像这样的文章与我试图帮助学习更多关于 CSS 的人分享。 我发现大多数人在将多个选择器组合在一起以使其更具体时会遇到麻烦。 还有 CSS 的“层叠”部分。
谢谢,Chris!
谢谢 Chris,很棒的文章。
我理解对于 CSS 大神来说,阐述这些基础知识可能有点枯燥。但对于像我这样的 CSS 菜鸟来说,它们非常有用。
干杯
谢谢 Chris。我们大多数人都会感谢在犯错之前就了解这些常见的错误!
再次感谢 Chris,我总是喜欢阅读你的文章。你真的是一位很棒的老师。
确实,我们不能忘记我们每个人都曾是新手,所以即使这些是基本的 CSS 提示,你分享它们也很棒,并且可以肯定地帮助到刚起步的很多人。
我在新手开发者编写的代码中经常看到以下情况:#header #nav ul li a { },它可以用 #nav a { } 来简写。
我也见过这种情况,我相信这被称为标签过度限定。绝不应该使用多个 id 选择器,这可能意味着 HTML 结构不佳。
但是需要注意的是,你写的选择器顺序并不一定相同,并且会以不同的方式影响样式。
#header #nav ul li a { }会定位 #nav 中任何列表项的 a 标签,而#nav a { }会定位 #nav 元素中的所有 a 标签。有人可能希望以不同于整个包含元素中的链接的方式来设置列表中链接的样式。考虑到这一点,我认为最多可以将 #header #nav ul li a 简化为:#nav li a,假设 #nav 不是无序列表 (ul</pre) 的 id。我要在这里为“新手”设计师辩护……并且我不同意 Jeremy 的观点。很多时候你确实需要使用多个选择器。
这里有一个很好的例子。只使用 #nav a {} 无法实现目标,而需要更具体的 #nav ul li a {}。
此外,就阅读 CSS 而言,我欣赏这些“额外的”选择器。它更清晰地告诉我们第一位编码人员的最初意图,这绝不是坏习惯。
谢谢 Chris!太棒了 ;-)
优秀的图形设计博客!对我来说确实很有帮助 :) 谢谢分享。。
刚开始学习 CSS 时,让我编码变得更容易的一件事是学习速记属性,特别是:background、font、border、margin 和 padding。
关于“CSS 文件中的顺序很重要”的补充说明
如果我们有如下所示的类
.red.green{color:#03F;} // 两个元素都会显示蓝色
颜色应该为绿色,但实际上显示为蓝色……
颜色应该为红色,但实际上显示为蓝色……
以及
.red.green{color:#03F;} // 两个元素都会显示蓝色
.green.red{color:#C0C;}// 即使在上面,两个元素也会显示粉色
// 类首先添加。
颜色应该为绿色,但实际上显示为粉色……
颜色应该为红色,但实际上显示为粉色……
希望这有帮助!
什么鬼?!
为什么当你命名一个类时颜色会变成绿色?如果像你说的那样,告诉我颜色“house”或“tom”是什么样子:D
你好,
感谢这篇文章!网上有很多很棒的资源。我只是想知道。
你们中有多少人在大学学习过网页设计/开发?
有没有可能在没有任何高等教育的情况下成为一名专业的网页设计师?你们中有谁只是通过坚持不懈并借助于此类网站而成为专业人士的吗?
我个人是自学的,除了在职业学校上过一门关于基础 HTML 的课程。
根据 Chris 做的一项调查,大约 40% 的网页工作者(至少是阅读此网站的人)都处于同样的境地。查看调查结果。
我也自学成才,没有任何正式的培训。我从图形设计开始(也是自学的),然后在 10 多年后开始学习 CSS/HTML。在我编写第一行 HTML 代码几个月后,我与一位朋友一起创办了一家网页设计公司,被迫在现实世界中学习(否则就会饿死)。这会让你快速掌握速度 :)
我已经编写和设计 HTML 大约 3 年了,这让我在一家相当大的 .com 公司找到了一份工作。
很棒的文章 Chris,即使对于非新手来说,偶尔回顾一下也是好的,因为多年来一些坏习惯可能会潜移默化地出现!
嗨 Chris,
不错的总结!那这个呢
或者
这意味着什么?
问好!
第一个:括号用于“属性选择器”,因此这个特定的选择器表示“选择任何类名以“grid-”开头的元素”(例如
<div class="grid-25">)。向上箭头 (carret) 字符表示“以…开头”。有关属性选择器的更多信息:https://css-tricks.org.cn/5591-attribute-selectors/第二个:大于号称为“子”选择器。正如你可能知道的,HTML 元素可以嵌套。因此,你有一个 body 元素,在其中有一个 div,在其中有一个段落。嵌套可以比这更深,比如说:body > div > div > div > span。现在假设你想要设置这些 div 的样式,但只设置层次结构中较高的那些,而不是较低的那些。如果你使用
body div { },它会从字面上选择整个层次结构中的所有 div。如果你使用body > div { },它只会选择 body 的直接子元素(只有一级深度)的 div。有关子选择器的更多信息:https://css-tricks.org.cn/5514-child-and-sibling-selectors/感谢 Chris 对这些内容的详细分解。对于功能性 CSS 来说,这是一个非常有用的概念,需要理解和使用。
很棒的总结!
谢谢
子组合器。
优秀的 CSS 词汇概述:http://nimbupani.com/css-vocabulary.html
我建议以评估顺序来解释它。即从右到左。它指示了引擎盖下实际发生的事情,并且它也从最终匹配的主题开始。(规范也是这样做的,顺便说一下。)
body div { }匹配每个作为
body的后代(空格是后代组合器)的div。body > div { }匹配每个作为
body的子元素的div。不错!谢谢。非常有帮助。
现在已经疑惑了很长一段时间了!谢谢!
很棒且有用的文章,非常感谢!
很棒 Chris。ID 与类之间的区别特别有趣,因为我读过一篇文章(在这里)指出 ID 更快,但又在其他地方读到文章说 ID 不应该用于 CSS。
就像你一样,我倾向于只在知道不会共享类时才使用它们。主要用于我的主要布局 div,例如我的 header、footer、navbar 和 main-content div。也许这纯粹是个人喜好,但对于这些主要布局项,我更喜欢使用 ID 并将它们放在 CSS 文件的顶部,以便于识别。
总而言之,这是一篇不错的文章,谢谢。
嗨,chris,
很棒的文章 :)
我想让你发布一些关于电子商务解决方案的内容。(如果可能的话。)
[来自Reddit的自我复制粘贴]
只有当 ID 是关键选择器(最右边的简单选择器)时,它们才会更快。在现实世界中,一页上最多只有 3-10 个这样的匹配。即使它无限地更快,它也不会节省一毫秒。
这种推理是反过来的。你应该始终首先关注好处。如果没有,就不要做。
中性:没有性能优势,也没有生产力优势。
负面:增加了特异性的额外数字。鼓励你以特定于位置的风格编写规则,这意味着它们永远无法重用。
ID 对 CSS 端没有任何好处。
当然,这并不意味着它们不应该在标记中使用。你绝对需要它们用于片段链接,它们对于 JavaScript 也很有意义。
现在,你可能会倾向于使用它们,仅仅因为它们已经存在。但是,这会对你的 CSS 架构产生负面影响。在那里划一条清晰的界限。尽可能地保持事物的分离。抵制重用钩子的冲动,这些钩子是为完全不同的目的添加的。
如果可以避免,请不要引入任何类型的耦合(尤其是在堆栈完全无关的部分之间),更不用说根本没有任何好处的情况了。
我的理解是,选择器末尾的常规标签选择器性能不佳,因为渲染引擎对选择器的工作方式是从右到左,而不是从左到右。例如
#banner nav a {...
}
你可能会认为渲染引擎会找到
#banner,然后找到它包含的任何nav元素,然后找到它们包含的任何a并对其进行样式设置,但实际上情况正好相反——它逐个查看文档中的每个a,查看它们是否是nav的后代,如果是,则查看该nav是否是#banner的后代,如果是,则设置a的样式。(感谢 Steve Souders 的更快的网站教会了我这一点)。
是的,最右边的简单选择器(所谓的关键选择器)是入口点。它匹配的元素越少,选择器就越快。此外,越快识别出误报(即部分匹配)(例如,通过使用子组合器而不是后代组合器),浏览器就可以越快继续执行有用的操作。
但是,如果你只查看 CSS,则无法确定关键选择器是否会匹配太多(数千个)元素。为此,你需要标记的典型排列。因此,从静态代码分析的角度(使用 CSS Lint 等工具对 CSS 执行),这不是你实际可以检查的内容。可用的信息太少。
唯一的例外是通用选择器(
*)。因为它匹配每个元素,所以它通常会匹配太多元素。将它与后代组合器一起用作关键选择器始终是一件糟糕的事情——如果节点很多并且平均深度很高,则更是如此。Chris,你做的很棒——大多数人真的会弄错这一点,或者忘记它的工作方式——我自己也学到了一些东西 :)
顺便说一下,
:hover在 IE6 中除了链接之外对任何其他内容都不起作用。因此,div:hover在 IE6 中不起作用。顺便说一下,你应该不再支持 IE 6 了;)
大多数时候都不应该支持 IE6,但是与大型国际公司合作时,分析应该并且将会决定浏览器支持。相信我,我迫不及待地想让 IE6 消失,但在中国这样的市场,IE6 的市场份额仍然超过 25%,这是一个太大的市场,不容忽视。
虽然我现在已经通过经验学习了所有这些,但当我还是新手的时候,这篇文章对我来说非常有用。
我实际上没有任何这些困惑。我开始阅读几本书,然后逐步学习。所以没有困惑。
虽然在同一网页上使用相同“id”的多个div从css的角度来看可能工作正常——但它们在严格模式下不会通过验证。这就是为什么在这种情况下我更喜欢为它们使用“class”属性的原因。
干杯
我
出于某种原因,我总是对以下内容感到困惑
.example .another { }以及
.example, .another { }现在我知道第一个会针对
而第二个会针对
非常棒的文章。对旧时光来说令人耳目一新。谢谢。
当我准备开始教授 CSS 时,这些提醒很棒,Chris。谢谢。
“隐藏悬停”很有趣。我以前从未真正想过它,但使用绝对定位——例如——你可以,比如说,在鼠标悬停在页面其他位置的菜单项上时,更改文本块的内容。
我花了一段时间才偶然发现特异性,如果你想正确地级联你的样式,这是一个非常重要的概念。
我最喜欢的文章,它很好地澄清了我的问题:http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html
——
在你开始识别创建可重用类的最佳机会之前,需要一些练习,但这也是一个重要的飞跃。
——
当可重用类由于某种原因难以或不可能实现(你无法直接控制的动态生成的标签)时,你仍然可以通过识别模式并将它们组合在一起使你的 CSS 更易于维护。这对于共享共同特征的规则(如标题)特别有用
CSS Lint 工具建议你不应该多次设置标题的样式。
虽然我同意为所有标题定义字体系列、颜色(任何通用样式)然后为每个标题定义字体大小更有条理。
为什么这会错?也许 CSS Lint 没有理解标题仍然是“唯一的”?
我将补充 Jonathan 指出的内容。当你有一系列共享相同属性的多个选择器时,很容易错过非常重要的逗号。我仍然有时会忘记把它们放在它们应该在的地方,突然我的页面变得很奇怪。
隐藏悬停是跨浏览器的吗?:DD
我不确定隐藏悬停,但我可以告诉你
:hover只能在 IE6 及更低版本中用于<a>标签,但据我所知,随着人们放弃尝试支持 IE6,这正变得不再重要。是的,忘记 IE 6(你不应该支持它)。
赞同为 Javascript 开发人员使用 ID!与类相比,jQuery 在选择 ID 时速度飞快。跨越几个级别的 DOM 遍历感觉很臃肿。
为什么要使用 ID?类是否更适合于对经常重复的事物进行样式设置?
以及 ID 用于,正如你所说,唯一的事物,或者我错过了什么?
例如,一些常见的类似乎是
.clearThis { clear: both; }
.alignLeft { text-align: left; }
你可能希望将 ID 用于同一页面导航,或作为 javascript 选择器。
很棒的文章,Chris!非常感谢。
只是我一个人,还是在最后的例子中,这行
将是绿色的
实际上应该是
将是红色的
正如文章所说,标记中的顺序完全无关紧要(除非你做了一些愚蠢的事情,比如
[class="red green"]{...})。在相同特异性下,CSS 中的顺序决定了哪一个会覆盖其他规则。几年前我经历了两个顿悟的时刻。
1) 使用众多 CSS 重置方案中的一个来重置你的 CSS。这将使所有浏览器默认样式标准化,并在所有浏览器中为你提供一个公平的开发环境。
2) 如果你发现父元素无法包含其浮动子元素,尝试向父元素应用“overflow: hidden”或“clearfix”。
1) 看看 normalize.css 而不是重置方案。
2) 我建议使用 clearfix 技术而不是设置 overflow: hidden;因为它可能导致一些不必要的问题。
感谢你向我指出 normalize.css。我以前从未听说过它。看起来很有希望。
我记得我刚开始使用 CSS 时,一位英国开发者给了我一堆文件然后消失了!我当时很慌张,哈哈!
我一直练习,最终学会了它的精妙之处。我记得学习了所有这些内容,需要一段时间,但掌握 CSS 的这些知识和能力真是太棒了。
一篇很棒的文章。继续发布一些有用的内容。非常感谢
很棒的文章,谢谢!:-)
不错的文章
谢谢
很棒的文章。感谢你写这篇文章。这篇文章确实简化了我的一些理解。另外,我从未想过隐藏的悬停效果。
继续努力……
这是我遇到的那些罕见的文章之一,你会认为“这正是我一直在寻找的东西!”
我当时真希望有这篇文章!
很棒的文章!我接触 CSS 仅仅一年,我感觉自己在这段时间里进步了很多,但我一直在学习这些基础文章。所以谢谢。
关于 ID 与类,我喜欢抽象所有元素,然后确定是使用类还是 ID,并尝试正确嵌套属性。
最好的
这是一篇很棒的文章!回顾并思考这些看似基本的东西令人耳目一新——我确实从这篇文章中学到了一两件事。
好文章,Chris,我总是记得过去的日子有多么令人困惑!
我清楚地记得曾经被链接悬停效果困扰,因为我不知道链接伪类的顺序有多重要。
然后我学会了,并想出了这个难忘的短语来指导我:“Latex Volatile Histologist Aglitter”
好吧,不是真的;) 我只是在几分钟前借助 Jason Schramm 优秀的首字母缩略词创建器创建了它:http://www.jschramm.com/acreator/index.php
我从未对此感到困惑,除了我过度使用了 ID,我使用了诸如 #block_1、#block_2 之类的东西而不是通用的类。我对此有点羞愧,因为它导致代码膨胀,并且后来接手我代码的其他人也遇到了问题。
你好朋友,你能教我一些简单的 CSS 吗?
非常有用的帖子..谢谢!
对我来说,特异性(是这个词吗?哈哈)是最令人困惑的。
我总是试图尽可能简洁地为元素设置样式(尽管结果很少如此!),所以我经常像这样开始为首页设置样式
我不知道为什么,但我只是认为这样写可以提高可读性……一点点哈哈。当然,当我转到具有不同布局的其他页面时,就会出现问题。假设我在“图库”页面上,其中 #left 标题的颜色将与首页标题不同。因此,对于图库页面中的 h1,我添加了一个 class=”gallery-heading”,然后
当然,它不起作用,因为 #content #left h1。因此,我必须要么添加 #content #left .gallery-heading 规则,要么省略 #content #left h1 规则并将其更改为更具体的规则(例如添加类 home-heading 或其他内容),这两种方法都同样令人头疼。
这个词是特异性。
http://www.w3.org/TR/css3-selectors/#specificity(解释了如何计算它)
你正在与自己进行特异性战争。诀窍是让所有东西都不那么具体——而不是更具体。
让我用一个简单的例子来演示一下
现在你想在你的主要内容中添加某种任务列表。可以有多个这样的列表,因此你为此使用一个类。
糟糕。不够具体!
可以工作,但它比需要的更具体。
如果你为“main”使用了类,那么一开始就不会遇到这个问题。
这个方法效果很好。
是的。那是真的。这只是我的一些坏习惯,我无法完全避免。
当我开始学习 CSS 时,它看起来很容易。但随后你需要学习一些技巧来使用它,例如使用 overflow: hidden 或使用 clearfix 即使对于简单的两列布局。我想知道为什么 CSS3 没有解决这个问题?
查看伪选择器 :after 来清除你的 2+ 列布局。
不需要额外的标记,示例如下
http://nicolasgallagher.com/micro-clearfix-hack/demo/
感谢链接,Tim。
我了解过类似的 clearfix,因为它之前在这个网站上发布过。
我希望我们很快就能停止使用这些 hack,并只使用简单易懂的 CSS 来完成浮动和所需的布局,至少对于现代浏览器来说是这样,即使是旧版本的 IE 也一样。
很棒。我从事网页开发才 6 个月,我第一次感到聪明,因为我实际上了解了你解释的所有内容。如果你回想起自己刚入门时,在这个领域里,你并不经常觉得自己了解很多东西。干杯
一个小问题,但你说“ID 的特异性值比类高出无限倍”。
不正确。它并没有无限大。ID 的特异性只是类的 10 倍。我建议在这里删除“无限”一词,它具有误导性。
你可以在一个元素上拥有 11 个类名,但这不会“战胜”单个 ID。它不是一个以 10 为底的系统,而是以 ∞ 为底的系统。
Chris,
你的意思是属性中的 11 个类,像这样
还是选择器中的 11 个类,像这样
.1 .2 .3 .4 .5 .6 .7 .8 .9 .10 .11 { }其中 1 到 11 分别是最后一个元素的后代?
此外,我想知道像这样的多类选择器的“特异性强度”是多少
1.2.3.4.5.6.7.8.9.10.11 {} /* no gaps */了不起的网站,顺便说一句。我不知道你如何抽出时间来创作如此高质量的内容。干杯!
抱歉,第一个“pre”部分是空白的,但你知道我的意思;)
元素上是否有 11 个或 100 个类选择器并不重要,一个 ID 选择器将胜过它。
没有间隙的示例(在一个元素上选择多个类)也将输给 ID 选择器。但如果你在一个元素上放置了 11 个类,并且你仍然试图用 ID 选择器来设置该元素的样式,那么你遇到了更大的问题。:)
哦,顺便说一句——对于另一个新手提示——你不能以数字开头类或 ID 名称。
我知道这只是一个例子,但值得注意的是 .1 { } 将永远不会起作用。
它们可以以数字开头。但是,您必须在 CSS 端将其转义为 Unicode。例如:
<div class="5">...</div>.\35{background:#f00}更多信息:http://mothereffingcssescapes.com/
这篇文章的想法很棒,我也在这里对特异性有了更多了解(关于属性中多个类的顺序不影响特异性)。我认为在学习特异性时,“特异性战争”(使用星球大战的隐喻)值得一笑。
对于我来说,CSS 最令人困惑的一个方面是伪类——特别是“:active”,因为我最初的假设是它充当“您在此处”的指示器(就像 Drupal 开箱即用的在“当前”菜单链接上使用活动 CLASS 一样)。
无论如何,我写了一篇关于它的文章,名为“伪类欺骗”
http://www.heydonworks.com/pseudo-class-deception
你忘了这个错误!
p {
color: blue
background: red;
}
(忘记分号了)
HTML
将使用浏览器默认颜色,并且没有背景颜色。
只想补充一点,虽然您可以多次使用 ID,但这是一种糟糕的做法,毫无疑问会无法通过 W3C 验证。对于那些认为验证无关紧要的人来说,它很重要。我还没有遇到过无法编写成可验证的实例。
对于那些认为在 CSS 中根本不应该使用 ID 的人,我完全不明白。
它是速度最快的选择器,如果它用于目标区域,例如背景图像或焦点区域,我认为这没有问题。
但是,像任何其他语言一样,CSS 应该尽可能抽象和可重用。但就像那些为一项任务编写超级重量级的 PHP 类或 JS 函数的人一样,这并不总是必要的。
代码应该始终尽可能简单地完成目标,少即是多,并保持事物分离。
另一方面,我刚开始时经常犯的一个错误是内联样式,太糟糕了!很少有必要使用它。
是的,每个人都这么认为,但实际上并非如此。首先,如果它是关键选择器(最右边的简单选择器),则只有少量收益(与类相比)。如果您有 1000 个这样的选择器而不是 1000 个使用类的选择器,您将获得大约 1 毫秒的收益。
但是,在现实世界中,您通常每页只有大约 3-10 个 ID 关键选择器,这意味着在理想条件下,您将获得大约 0.01 毫秒(不是秒!)的收益。
澄清一下
#foo{}或.foo #bar{}速度极微地快。像#foo .bar{}这样的东西在性能方面与.foo .bar{}完全相同。这意味着出于性能原因使用 ID(在 CSS 端)几乎是您可以想到的最不值得的微优化。它太无关紧要了,甚至都不好笑了。
是的,某些东西并不总是需要可重用,但阻碍重用的意义何在?请记住,您根本没有得到任何回报。您只会使事情比需要更复杂。
顺便说一句,你弄反了。最大化重用等于更少的工作。这也意味着 CSS 会更少(自然而然)并且标记会更少(令人惊讶)。需要编写的内容更少,需要测试的内容更少,并且所有内容始终看起来一致,无需任何额外的工作(毕竟所有内容都是用相同的积木构建的)。
不错,克里斯。我已经使用 CSS 几年了,它仍然让我头疼!也就是说,它的强大功能也经常让我惊叹。
我不应该在这么多懂 CSS 的人面前这么说,但我经常发现试错法比弄清楚到底发生了什么事要快。:)
不过我想知道,为什么这些不同
.myclass1 .myclass2 {}
以及
.myclass1.myclass2 {}
谢谢
在这种情况下,空格造成了所有不同。第一个选择类名为“myclass2”且是类名为“myclass1”的元素的后代的元素。第二个选择同时具有这两个类名的元素。
太棒了!明白了!谢谢!
有趣的文章。今天学到了一些新东西。谢谢!
亲爱的克里斯
非常棒且有帮助。
有时每个人都需要回到基础知识。
id 与 class。ID 特别适用于强调以下语句的重要性。
div{ 此语句值 1 继承点 }
.classname{ 此语句值 10 继承点 }
#idname{ 此语句值 100 继承点 }
因此,在标记中策略性地分配 ID 对于保持大规模样式表易于使用并在长期内保持简单至关重要。创建复杂的 !important 垃圾邮件网络?
h2{font-size: 1.2em} = 1
h2.Title{color: red} = 11
#Content h2{color: blue} = 101
因此,从上面的示例中,具有类 .Title 且在 #Content 容器内的标题 2 将为蓝色。
特异性不是 10 为底。只是说一下。
经验数据指向相反的方向。
ID 并不是魔鬼。它们只是让你以一种导致解决方案的方式思考,而这些解决方案会导致否则不存在的烦人问题。
只需观察一些经常更新的网站在几年内的发展,您应该就能看到这些模式。总是相同的。它始于糟糕的抽象,然后将新内容堆叠在旧内容之上。很快,人们就无法分辨哪些部分仍然需要,并且任何内容都不会被删除。
不使用 ID 可以减缓退化速度。使用约定、指南和工具,您甚至可以完全停止退化。
很棒的文章!谢谢<3!
对于新手来说,这是一篇非常好的文章
克里斯——非常有用。请多写一些这样的文章!
内容不错,值得转发。感谢你的写作。
一个建议:在你的最后一个副标题中,你有
CSS 文件中的顺序很重要
如果您有两个具有完全相同特异性的选择器,如下所示
.red { color: red; }
.green { color: green; }
然后它们应用于相同的元素,CSS 中后面的选择器将始终获胜。 HTML 中的类名顺序无关紧要
将是绿色的
将是绿色的
我认为在这个示例中,你最后一行应该写
将为红色
干杯!
不,它们都将为绿色 =) 试试看!
好吧,我必须弄清楚如何在评论中更好地引用 html,但是替换括号,我认为最后一行应该写
[div class=”green red”]将为红色[/div]
这是一篇你不太常看到的文章;面向初学者的基础知识!
温习基础知识很有趣!
不错,克里斯。
对于 CSS 新手来说,这篇很棒。人们确实经常问这些问题 :)
克里斯
谢谢。再次阅读这些内容让人耳目一新。细节仍然让我措手不及。我需要从头到尾完成更多项目,而不仅仅是修改其他人的项目。
谢谢克里斯,
从你的文章中学到了新东西。细微的差别会产生影响。感觉像是在 CSS 阶梯上又迈出了一步
我还在努力学习 CSS;鉴于我是自学的,并且主要通过浏览一行又一行(以及一行)的代码来学习,您这些大师给我们这些新手送来的这样的小礼物,就像这篇文章一样,真的非常感谢。谢谢!
一个很好的入门介绍,供新手学习和开始。你为他们很好地分解了 CSS,以便他们能够完全理解。
也许你可以做一些后续文章,提供其他技巧?
拥有这样的复习总是好的,因为那些小东西有时会让我感到恶心。
很棒的文章,克里斯!对于“不太新手”的 CSS 人员来说,也是很好的提醒。我忘记了最后一个——CSS 中的顺序很重要。我也感谢你阐明了 ID 对 javascript 的重要性。
感谢你的文章!非常感谢!
CSS 始终是我从未接触过的领域之一,直到最近几个月。我仍在学习,需要在这个过程中获得更多经验。
顺便说一句,本教程很棒——在我甚至还没读完之前
我不知道还有人想着新手(我)!
很棒的内容!我一开始以为这是为新手准备的,而不是为我准备的,但有几件事我确实不知道。我希望在我刚开始学习的时候就能读到这篇文章!
这是一篇不错的文章。
温习了一下基础知识;)
当您需要严格控制并且不想发生任何冲突时,请使用 ID;当您需要对更广泛的范围进行一般控制时,请使用类…
网页设计真疯狂
我喜欢这种类型的文章:) 请继续努力:)
很棒的文章——非常感谢。CSS 总是很棘手,而且总有新的东西要学习。这个网站让学习变得很愉快,我喜欢它!
不错的文章——谢谢。从这篇文章中学到了很多好的东西。