我可以使用非现有的CSS类吗?
我有一个表,我显示/隐藏jQuery通过不存在的CSS类的完整列:
<table> <thead> <tr> <th></th> <th class="target"></th> <th></th> </tr> </thead> <tbody> <tr> <td></td> <td class="target"></td> <td></td> </tr> <tr> <td></td> <td class="target"></td> <td></td> </tr> </tbody> </table>
有了这个DOM,我可以通过jQuery来做到这一点: $('.target').css('display','none');
这完美的工作,但它是有效的使用未定义的CSS类? 我应该为它创build一个空的类吗?
<style>.target{}</style>
是否有任何副作用或有更好的方法来做到这一点?
“CSS类”是一个用词不当; class
是分配给HTML元素的属性(或者是脚本方面的属性)。 换句话说,你用HTML来声明类,而不是CSS,所以在你的情况下,“目标”类实际上存在于这些特定的元素上,而你的标记是完全有效的。
这并不一定意味着你需要在HTML中声明一个类,然后才能在CSS中使用它。 请参阅ruakh的评论。 一个select器是否有效, 完全取决于select器的语法 ,CSS有自己的一套处理parsing错误的规则 ,根本不涉及标记。 实质上,这意味着HTML和CSS在有效性方面是完全独立的。 (这也是为什么一个CSS IDselect符匹配具有给定ID的所有元素,而不pipeID是否恰好出现一次或多次(导致不合格的HTML文档) 。
一旦你理解了这一点,就很清楚,没有在你的样式表中定义一个.target
规则的.target
。 1将类分配给元素时,可以通过脚本或样式表中的这些类引用这些元素。 对另一方也没有依赖性。 相反,它们都引用标记(更准确地说,在代表它的DOM上)。 即使你使用JavaScript来应用样式,这个原则也是适用的,就像你在jQuery中一样。
当您使用类select器编写CSS规则时,您所说的只是“我想将样式应用于具有此类的元素”。 同样,当你写一个脚本来检索某个类名的元素时,你会说“我想用这个类的元素来做事”。 所讨论的课程中是否有元素是一个单独的问题。
1 唯一的情况是我知道这样一个空CSS规则是必要的,因为一些浏览器由于错误而拒绝正确应用某些其他规则。 创build一个空的规则会导致其他规则因为某种原因而被应用。 看到这个答案为这样一个错误的例子。 然而,这是CSS的一面,因此应该没有任何关系的标记。
使用没有风格的类没有不良影响。 的确,CSS的有用性的一部分就是它从标记中分离出来,并且可以devise或不devise元素/类/等等。 如所须。
不要把它们看作“CSS类”。 把它们想象成CSS所碰到的“类”,如果需要的话。
根据HTML5规范 :
类属性的值必须是一组空格分隔的标记,表示元素所属的各个类。 …对于作者可以在类属性中使用的标记没有额外的限制,但鼓励作者使用描述内容本质的值,而不是描述所需内容表示的值。
另外,在版本4中 :
类属性在HTML中有几个angular色:
- 作为样式表select器(当作者希望将样式信息分配给一组元素时)。
- 用于用户代理的通用处理。
您的用例属于第二种情况,这使得它成为使用类属性的合法示例。
您可以使用没有样式的类,这是完全有效的HTML。
CSS文件中引用的类不是一个类的定义,它被用作样式目的的select器规则 。
当你在JavaScript中使用一个类名时,它不会在CSS中查找该类。 它看起来直接在HTML代码中。
所有需要的是,类名是在HTML中。 它不需要在CSS中。
事实上,许多人认为将单独的类与CSS和Javascript结合使用确实是一个好主意 ,因为它允许devise者和编码人员独立工作,而不必通过彼此的类彼此进行交stream。
(注意,上面的段落显然更适用于大型项目,所以如果你自己工作,就不要觉得这个极端了;我提到它要说明两者可以完全分开)
您可以使用CSS类而不使用它,但是我build议如果您只是为JavaScript / jQuery代码添加CSS类,请以前缀js-YourClassName
前缀,以避免前端开发人员使用这些类来设置元素的样式。 他们应该明白,这些课程可以在任何时候被删除。
当你在HTML中添加类时,类将被定义,所以你的解决scheme是完全正确的
没有必要在样式表中定义CSS类。 它应该工作得很好。 但是,添加它不会有害。
有一件事没有人完全提到,JavaScript(在这种情况下,由jQuery协助)不能直接修改文档的层叠样式表。 jQuery的css()
方法只是改变了匹配的一组元素的style
属性。 CSS和JavaScript在这方面完全不相关。
$('.target').css('display','none');
完全不会改变你的.target { }
CSS声明。 这里发生的事情是,任何具有“目标” class
的元素现在看起来像这样:
<element class="target" style="display:none;"></element>
有没有预先定义的CSS样式规则造成的任何副作用? 没有任何。
有没有更好的方法来做到这一点? 性能方面,是的!
如何改善performance?
而不是直接修改每个元素的style
,而是可以预先定义一个新的类,并使用addClass()
(另一个jQuery方法) 将其添加到您的匹配元素中 。
基于这个比较css()
和addClass()
预先存在的JSPerf ,我们可以看到addClass()
实际上快得多:
我们怎么能自己实现呢?
首先,我们可以添加新的CSS声明:
.hidden { display: none; }
您的HTML将保持不变,这个预先定义的类只是为了以后使用。
现在我们可以修改JavaScript来使用addClass()
来代替:
$('.target').addClass('hidden');
当运行这个代码时,不是直接修改每个匹配的“目标”元素的style
属性,现在这个新类将被添加:
<element class="target hidden"></element>
使用新的“隐藏”类,这个元素将inheritanceCSS中声明的样式,并且元素将被设置为不再显示。
正如许多其他人提到的那样,是的,使用没有指定CSS的类是完全有效的,而不是将它们看作“CSS类”,您应该简单地将类和ID的语义分别识别为组和单个元素。
因为我觉得在这个例子中没有提出一个重要的观点, 如果您需要对可变长度的元素进行可视化操作(在这种情况下,您使用的是表格行),那么通过Javascript来完成这项工作的成本可能会非常昂贵(例如,如果您有数千行)。
在这种情况下,假设我们知道第2列总是有可能被隐藏(这是你表的一个有意识的function),那么devise一个CSS样式来处理这个用例是有意义的。
table.target-hidden .target { display: none; }
然后,而不是使用JS遍历DOMfindN个元素,我们只需要在一个(我们的表)上切换一个类。
$("table").addClass("target-hidden")
通过分配表的ID可以更快,甚至可以通过使用:nth-child
select器来进一步减less标记,但我无法评论效率。 这样做的另一个原因是我讨厌内联式样,并会竭尽全力根除它!
如果您在HTML元素上应用一个类,并且该类未在CSS中定义,则它将不起作用。 这是一种常见的做法,像阿米尔·阿夫里迪(Aamir Afridi)说过,如果你只是为了js目的而使用类,那么以js-为前缀是个好习惯。
它不仅适用于calsses,还适用于html元素的id属性。
使用类来查询元素是没有问题的。 我曾经给这样的类名称的sys-
前缀(例如,我会命名您的类sys-target
)以区分他们用于样式的类。 这是过去一些微软开发者使用的惯例。 我也注意到为此目的使用js-
前缀的一个日益增长的做法。
如果您不习惯将类用于样式之外的目的,我推荐使用Role.js jQuery插件,它允许您使用role
属性实现相同的目的,因此,您可以将标记写为<td role="target">
并使用$("@target")
查询它。 项目页面有很好的描述和例子。 我将这个插件用于大型项目,因为我真的很喜欢为了样式而保留类。
参考jQueryvalidation引擎。 即使在那里,我们也使用不存在的类来在HTML属性上添加validation规则。 所以使用没有在样式表中实际声明的类是没有问题的。