如果你从这个系列中学到了任何重要的前端架构理念,那就是这个:改变类名。在这个屏幕录像中,我们开始深入一个主要的 JavaScript 问题,然后停下来,意识到我们可以用 CSS 来解决。当你想要改变视觉效果时,CSS 是最佳选择。它不仅擅长处理这个问题,而且通常更有效,并保持健康的“关注点分离”,这使得长期维护网站变得更容易。
在我们恢复理智之后,我们只是交换了 1) 按钮文本 2) 容器上的 data-state
属性。
$(".bigger").on("click", function() {
var el = $(this);
var module = el.parent();
// Swap expanded state
module.attr("data-state") == "expanded"
? module.attr("data-state", "")
: module.attr("data-state", "expanded");
// Swap button text.
el.text() == el.data("text-swap")
? el.text(el.data("text-original"))
: el.text(el.data("text-swap"));
});
最终结果如下所示
查看 CodePen 上 Chris Coyier (@chriscoyier) 的 quFCo。
是的,这个视频(以及理念)是“改变类名即可!”,而我们在这里更改了一个 data-*
属性,但我认为它们是相同的。有时我会使用 data-*
属性只是因为我喜欢它们。我认为它们就像命名空间类或带值的类。可以说在 CSS 中比类更有用,而且它们具有完全相同的特异性值。
那个 ? / : 语法看起来很奇怪吗?如果是的话,它被称为三元(或“条件”)运算符。
第一行是一个测试,下一行(或 ? 之后的代码块)是如果测试为真会发生的事情,最后一行(或 : 之后的代码块)是如果测试为假会发生的事情。也许这能帮助你理解
// The boolean (true/false) test
module.attr("data-state") == "expanded"
// Do this if the test is true
? module.attr("data-state", "")
// Do this is the test if false
: module.attr("data-state", "expanded");
不要因为它们看起来很奇怪而避开它们,它们可能更有效(最终读起来和 if/else 逻辑一样好,只要你不过度使用它们)。
Doug Neiner 在他的 文章 中很好地阐述了“改变类名即可!”的理念。类在 CSS 中拥有强大的功能。你可以隐藏/显示内容,移动内容,改变内容的外观,触发动画…… 可能性无穷无尽。而且你在“树”(DOM)中应用类的层次越高,你拥有的级联能力就越强大。在 body 上改变一个类意味着你可以用一个类控制整个页面的任何内容。而且这一切只需要非常少量的 JavaScript 代码。
一旦你接受了这个理念,你将成为一名更快乐的开发者。
很棒的文章,通过改变数据属性而不是类来保持样式和行为的分离。
http://toddmotto.com/stop-toggling-classes-with-js-use-behaviour-driven-dom-manipulation-with-data-states/