- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
当您在 css 规则之间放置分号时,分号后面的规则将被忽略。这可能会导致一些 very strange results . MDN 有一个 jsfiddle 可以用来相当清楚地展示这种效果。
This是初始状态,this在第一条规则的末尾有一个分号之后。
幸运的是,它本质上是 universal practice to exclude semicolons从一个人的CSS block 之间。
我的问题是:为什么会这样?我听说是这种情况,因为它会节省空间(在这种情况下,每个 css 规则恰好一个字符)。但这个推理虽然正确,但似乎有点奇怪。我找不到关于 css 文件中每个字符占用多少空间的具体信息,但如果它类似于 JS,this SO post告诉我们每个字符大约有 16 位,或 2 个字节。这意味着我们将为每个规则节省 2 个字节。
根据 this list of average connection speed by country全局平均连接速度为 5.1 兆比特/秒。由于我们通过不允许分号来为每个规则保存 1 个字符,并且每个字符为 16 位,因此我们可以证明,平均而言,我们保存一秒钟所需的规则数量为:
5,100,000(bits/second) / 16(bits{saved}/rule)
(5,100,000/16)*[(bits * rule)/(second * bits] or
318750 (rule/second)
因此根据全局平均连接速度,需要超过 300,000 条规则才能为我们节省一秒钟的时间。
肯定存在更有效的方法来为用户节省下载时间,例如 css/js 的缩小/丑化。或者减少 CSS 属性名称的长度,因为它们比 1 个字符长得多并且可以出现多次,与砍掉尾随分号相比,缩短这些名称可以节省更多字节的数量级。
在我看来,比节省的字节数更重要的是,这会给开发人员带来多大的困惑。我们中的许多人都习惯于在大括号后加分号。
returnType/functionDec functionName(arguments){
//...function body
};
是一种在许多语言(包括 JavaScript)中都非常常见的模式,并且绝对可以想象开发人员键入
cssRuleA{
/*style Rules */
};
cssRuleB{
/* Style Rules*/
};
作为这种习惯的偶然结果。控制台将不会记录任何错误,开发人员不会有迹象表明在样式未正确显示之外发生了错误。这绝对最糟糕的部分是,即使 cssRuleA 是导致错误的原因,它也能正常工作,cssRuleB 将是无法正确显示的规则,即使它没有任何问题。事实是
在样式/UI 问题可能有许多不同的可能根源的大型元素中尤其会引起问题。
CSS 中是否存在某些固有因素使该约定更有意义?在我遗漏的一些白皮书中是否有什么解释了为什么 CSS 的行为方式?个人尝试从Finite Automata/Grammars的 Angular 看排除分号会不会更快,但我无法确定它是否更快。
最佳答案
在 CSS 中,规则由 block 或语句定义,但不能同时由两者定义。 block 是被一对花括号包围的代码块。语句是一段以分号结尾的代码。
空的“规则”不是有效的 CSS 规则,因为它不能被解析为 qualified rule或 at-rule .因此,两个 block 之间单独的 ;
是无效的,原因与不包含前奏的 block (选择器列表或 at 关键字后跟)的原因相同一个可选的序曲)是无效的:因为它不能被解析成任何有意义的东西。
只有 at 规则可以采用语句的形式,因此以分号结束(示例包括 @charset
和 @import
);合格的规则永远不会做。因此,当遇到格式错误的规则时,如果解析器尚未解析 at 规则,则将其视为合格规则,并且一切直到并包括下一个匹配的花括号集消耗和丢弃,包括分号。这在 section 2.2 of css-syntax-3 中有简要描述。 (它说文本是非规范的,但这只是因为规范规则是在语法本身中定义的)。
错误处理在 CSS 中采用如此急切的方法的原因主要是由于 selector error handling — 如果它是保守的,浏览器可能会无意中将以下规则解析为完全出乎意料的东西。例如,如果不理解 >
的 IE6 只忽略 p > span {...}
中的 p >
并将所有以 span
开头的内容视为有效,该规则将最终匹配 IE6 中的 any span
元素,同时仅匹配适当的元素子集在支持浏览器。 (事实上,IE6 中确实存在一个类似的问题 chained class selectors — .foo.bar
被视为 .bar
。)你可以因此,不要认为这是自由的错误处理,而是 CSS 规则的保守应用。最好不要在有疑问时应用规则,而不是应用它会产生意想不到的结果。
无论谁告诉您这是出于性能原因,这都是编造的。
关于css - 有没有解释为什么我们不能在 CSS 声明 block 之间放置分号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42676805/
;用作语句分隔符,所以放置多个;在语句的末尾很好,因为它只是添加了空语句。 我遇到了这个有多个 ; 的代码最后但删除它们会导致错误: $line =~s;[.,]$;;; 应该与 $line =~s;
当使用自动完成来填充方法参数时,大多数情况下最后应该有一个分号。 似乎必须有一些键盘快捷键可以在最后输入分号(也可能是换行符),但我找不到它! 谢谢。 编辑 : 也许问题不清楚,当完成一个自动完成方法
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我知道我不应该在循环后放置分号。但我正在学习,不小心插入了一个。我想确切地知道我的错误到底发生了什么。所以下次发生类似的事情时,我就知道错误的根源。 在下面的代码中,在这部分代码中: triangul
我想拆分我的查询,但没有得到完全符合我要求的答案。 我的字符串如下: select 1;select \\2; select 3\\;copy customer from 's3://mybucket
VBA 中带有 Debug.Print 语句的分号 ( ; ) 的实际值/含义是什么? 我经常使用它,但对它没有真正的了解,我所知道的是它不等于 vbTab 常量,因为间距不一样。 IE。 Debug
我需要从 HTML 中的 javascript 代码获取分配的变量名称和值。 例如有html代码: ~~ contents var value1 = 55;var value2= 27;
我正在用 JSFiddle 校对这个函数,它说第二行缺少分号,但是我无法确定它会去哪里。 function debtSpiral() { var debtID = setInterval(debt
给定一个使用 ; 策略的有效 Coq 证明,是否有一个通用公式可以将其转换为用 . 替换 ; 的有效等效证明;? 许多 Coq 证明使用 ; 或战术排序策略。作为初学者,我想观察各个步骤的执行,因此我
我被困在工作中,电脑被锁定。但我正在尝试练习我的 Scala。我正在使用 Ideone.com,因为我什至无法安装 scalac... 无论如何这不是编译: class DPt(var name: S
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
考虑这些文件名。 ; f - Copy.txt ;f.txt f - Copy ;- Copy.txt f - Copy.txt 我有这段代码可以解析任何文件中的 & 符号,答案是:Drag and
为什么带有验证器(Mozilla 或 JSlint)的 Aptana 会提示这段代码: var collectionOfValues = { key0 : value0; key1 :
有什么方法可以绑定(bind); (\059) 到 tmux 中的命令? 默认情况下,它绑定(bind)到最后一个 Pane ;但是,我想将其重新绑定(bind)到 select-pane -R。 我
我有一个 Java 字符串,它实际上是一个 SQL 脚本。 CREATE OR REPLACE PROCEDURE Proc AS b NUMBER:=3; c
我有一个 python 字符串: names = "John, Paul; Sally/Frank" 我想用 , 分割字符串;/.我试过: names.split(",") 但我不确定如何通过所有分隔
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我一直在尝试并查看各种命令,但似乎无法找到正确的语法; 我想合并两个 ls 命令的输出,除以 ;(分号)并将输出写入文件。 我的 ls 命令是: ls *.lst ls -d -1 $PWD/*.ls
在声明一组变量而不是分号时使用逗号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我是一名优秀的程序员,十分优秀!