【发布时间】:2016-09-19 11:59:23
【问题描述】:
使用以下 HTML 结构,如何最好地实现 HTML、CSS 和 JS 之间的关注点分离?
<nav role="navigation" class="site-nav js-site-nav">
<ul class="site-nav__list">
<li class="site-nav__item"><a href="#" class="site-nav__link">Menu Item 1</a></li>
<li class="site-nav__item"><a href="#" class="site-nav__link is-active">Menu Item 2</a></li>
</ul>
</nav>
演示: http://codepen.io/achisholm/pen/wGVGxj
首先,这个例子似乎并没有真正解耦。我发现类命名系统不适合分开。在尝试定位链接时,我仍然需要在 JS 中的某处使用 .site-nav__link 选择器。
在每个链接上使用 JS 钩子类似乎是向右移动
方向。在每个链接上添加 .js-site-nav__link 类是
改进?
<nav role="navigation" class="site-nav">
<ul class="site-nav__list">
<li class="site-nav__item js-site-nav__item"><a href="#" class="site-nav__link">Menu Item 1</a></li>
<li class="site-nav__item js-site-nav__item"><a href="#" class="site-nav__link is-active">Menu Item 2</a></li>
</ul>
</nav>
这对我没有太大吸引力,因为虽然与演示类没有本质上的联系,但使用整个 BEM 名称仍然很难进行任何结构更改,而且我认为仅使用 .site-nav__link 并没有什么好处.
我可能会考虑像js-link 这样的类名,但泛化会导致其他问题。定位 .js-site-nav .js-link 是否会给我最好的一切?
<nav role="navigation" class="site-nav">
<ul class="site-nav__list">
<li class="site-nav__item js-link"><a href="#" class="site-nav__link">Menu Item 1</a></li>
<li class="site-nav__item js-link"><a href="#" class="site-nav__link is-active">Menu Item 2</a></li>
</ul>
</nav>
我觉得这真的是解耦了,但它是否达到预期效果?
感谢@claudios 提供了一个简单的例子,它有一个很好的 JS 钩子,js-add 其中包括一个有帮助的动词。像这样的东西效果很好,但在我的例子中不合适。感觉像js-toggle-link 这样的 JS 钩子可能会开始变得结构良好。
来源:HTML 摘自以下演讲(在 17 分钟后跳转到相关部分)... https://vimeo.com/album/3953264/video/166790749#t=17m0s
【问题讨论】:
-
“这个例子似乎并没有真正解耦” 需要我们观看视频来了解您的问题。问题需要自成一体。为了让我们理解,您需要逐条列举问题本身并定义您的期望。使用前缀类很常见
-
对造成的混乱表示歉意。这是关于我稍后在问题和提供的 Codepen 中包含的 HTML 示例
-
再一次...问题应该是自包含的,外部链接仅用于支持问题中的实际内容。我们不必离开现场来全面审查您遇到的问题。在我们阅读并理解完整问题后,沙盒中的演示很有帮助
-
我已编辑问题,以便将视频作为脚注提供。我将尝试将问题重新表述得更简洁。
-
我看到了解耦的优点(虽然在很多情况下它是多余的并且超出了目标),但我更喜欢仅将类用于样式,并将钩子放在属性(数据或自定义)。
标签: javascript jquery html css bem